-- | 'Strive.Actions.Authentication'
module Strive.Options.Authentication
  ( BuildAuthorizeUrlOptions(..)
  ) where

import Data.Aeson (encode)
import Data.ByteString.Char8 (unpack)
import Data.ByteString.Lazy (toStrict)
import Data.Default (Default, def)
import Data.List (intercalate)
import Data.Maybe (catMaybes)
import Network.HTTP.Types (QueryLike, toQuery)

-- | 'Strive.Actions.buildAuthorizeUrl'
data BuildAuthorizeUrlOptions = BuildAuthorizeUrlOptions
  { BuildAuthorizeUrlOptions -> Bool
buildAuthorizeUrlOptions_approvalPrompt :: Bool
  , BuildAuthorizeUrlOptions -> Bool
buildAuthorizeUrlOptions_privateScope :: Bool
  , BuildAuthorizeUrlOptions -> Bool
buildAuthorizeUrlOptions_writeScope :: Bool
  , BuildAuthorizeUrlOptions -> String
buildAuthorizeUrlOptions_state :: String
  }
  deriving Int -> BuildAuthorizeUrlOptions -> ShowS
[BuildAuthorizeUrlOptions] -> ShowS
BuildAuthorizeUrlOptions -> String
(Int -> BuildAuthorizeUrlOptions -> ShowS)
-> (BuildAuthorizeUrlOptions -> String)
-> ([BuildAuthorizeUrlOptions] -> ShowS)
-> Show BuildAuthorizeUrlOptions
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [BuildAuthorizeUrlOptions] -> ShowS
$cshowList :: [BuildAuthorizeUrlOptions] -> ShowS
show :: BuildAuthorizeUrlOptions -> String
$cshow :: BuildAuthorizeUrlOptions -> String
showsPrec :: Int -> BuildAuthorizeUrlOptions -> ShowS
$cshowsPrec :: Int -> BuildAuthorizeUrlOptions -> ShowS
Show

instance Default BuildAuthorizeUrlOptions where
  def :: BuildAuthorizeUrlOptions
def = BuildAuthorizeUrlOptions :: Bool -> Bool -> Bool -> String -> BuildAuthorizeUrlOptions
BuildAuthorizeUrlOptions
    { buildAuthorizeUrlOptions_approvalPrompt :: Bool
buildAuthorizeUrlOptions_approvalPrompt = Bool
False
    , buildAuthorizeUrlOptions_privateScope :: Bool
buildAuthorizeUrlOptions_privateScope = Bool
False
    , buildAuthorizeUrlOptions_writeScope :: Bool
buildAuthorizeUrlOptions_writeScope = Bool
False
    , buildAuthorizeUrlOptions_state :: String
buildAuthorizeUrlOptions_state = String
""
    }

instance QueryLike BuildAuthorizeUrlOptions where
  toQuery :: BuildAuthorizeUrlOptions -> Query
toQuery BuildAuthorizeUrlOptions
options =
    [(String, String)] -> Query
forall a. QueryLike a => a -> Query
toQuery
      ([(String, String)] -> Query) -> [(String, String)] -> Query
forall a b. (a -> b) -> a -> b
$ [ ( String
"approval_prompt"
          , ByteString -> String
unpack
            (ByteString -> ByteString
toStrict
              (Bool -> ByteString
forall a. ToJSON a => a -> ByteString
encode (BuildAuthorizeUrlOptions -> Bool
buildAuthorizeUrlOptions_approvalPrompt BuildAuthorizeUrlOptions
options))
            )
          )
        , (String
"state", BuildAuthorizeUrlOptions -> String
buildAuthorizeUrlOptions_state BuildAuthorizeUrlOptions
options)
        ]
      [(String, String)] -> [(String, String)] -> [(String, String)]
forall a. Semigroup a => a -> a -> a
<> if [String] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [String]
scopes then [] else [(String
"scope", String -> [String] -> String
forall a. [a] -> [[a]] -> [a]
intercalate String
"," [String]
scopes)]
   where
    scopes :: [String]
scopes = [Maybe String] -> [String]
forall a. [Maybe a] -> [a]
catMaybes
      [ if BuildAuthorizeUrlOptions -> Bool
buildAuthorizeUrlOptions_privateScope BuildAuthorizeUrlOptions
options
        then String -> Maybe String
forall a. a -> Maybe a
Just String
"view_private"
        else Maybe String
forall a. Maybe a
Nothing
      , if BuildAuthorizeUrlOptions -> Bool
buildAuthorizeUrlOptions_writeScope BuildAuthorizeUrlOptions
options
        then String -> Maybe String
forall a. a -> Maybe a
Just String
"write"
        else Maybe String
forall a. Maybe a
Nothing
      ]