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