{-# LANGUAGE CPP #-}
{-# LANGUAGE OverloadedStrings #-}
module Yesod.Auth.OAuth2.Twitter
    ( oauth2Twitter
    , module Yesod.Auth.OAuth2
    ) where

#if __GLASGOW_HASKELL__ < 710
import Control.Applicative ((<$>), (<*>))
#endif

import Control.Monad (mzero)
import Data.Aeson
import Data.Text (Text)
import Data.Text.Encoding (encodeUtf8)
import Yesod.Auth
import Yesod.Auth.OAuth2

data TwitterUser = TwitterUser
    { twitterUserId :: Text
    , twitterUserName :: Text
    , twitterScreenName :: Text
    }

instance FromJSON TwitterUser where
    parseJSON (Object o) = TwitterUser
        <$> o .: "id_str"
        <*> o .: "name"
        <*> o .: "screen_name"

    parseJSON _ = mzero

oauth2Twitter :: YesodAuth m
              => Text -- ^ Client ID
              -> Text -- ^ Client Secret
              -> AuthPlugin m
oauth2Twitter clientId clientSecret = authOAuth2 "twitter"
    OAuth2
        { oauthClientId = encodeUtf8 clientId
        , oauthClientSecret = encodeUtf8 clientSecret
        , oauthOAuthorizeEndpoint = "https://api.twitter.com/oauth/authorize"
        , oauthAccessTokenEndpoint = "https://api.twitter.com/oauth/access_token"
        , oauthCallback = Nothing
        }
    $ fromProfileURL "twitter" "https://api.twitter.com/1.1/account/verify_credentials.json"
    $ \user -> Creds
        { credsPlugin = "twitter"
        , credsIdent = twitterUserId user
        , credsExtra =
            [ ("name", twitterUserName user)
            , ("screen_name", twitterScreenName user)
            ]
        }