module Servant.Auth.Server.Internal.ConfigTypes
  ( module Servant.Auth.Server.Internal.ConfigTypes
  , Servant.API.IsSecure(..)
  ) where
import           Crypto.JOSE        as Jose
import           Crypto.JWT         as Jose
import qualified Data.ByteString    as BS
import           Data.Default.Class
import           Data.Time
import           GHC.Generics       (Generic)
import           Servant.API        (IsSecure(..))
data IsMatch = Matches | DoesNotMatch
  deriving (Eq, Show, Read, Generic, Ord)
data IsPasswordCorrect = PasswordCorrect | PasswordIncorrect
  deriving (Eq, Show, Read, Generic, Ord)
data SameSite = AnySite | SameSiteStrict | SameSiteLax
  deriving (Eq, Show, Read, Generic, Ord)
data JWTSettings = JWTSettings
  {
  
    signingKey      :: Jose.JWK
  
  , jwtAlg          :: Maybe Jose.Alg
  
  , validationKeys  :: Jose.JWKSet
  
  
  , audienceMatches :: Jose.StringOrURI -> IsMatch
  } deriving (Generic)
defaultJWTSettings :: Jose.JWK -> JWTSettings
defaultJWTSettings k = JWTSettings
   { signingKey = k
   , jwtAlg = Nothing
   , validationKeys = Jose.JWKSet [k]
   , audienceMatches = const Matches }
data CookieSettings = CookieSettings
  {
  
  
    cookieIsSecure    :: !IsSecure
  
  , cookieMaxAge      :: !(Maybe DiffTime)
  
  , cookieExpires     :: !(Maybe UTCTime)
  
  , cookiePath        :: !(Maybe BS.ByteString)
  
  , cookieDomain      :: !(Maybe BS.ByteString)
  
  , cookieSameSite    :: !SameSite
  
  , sessionCookieName :: !BS.ByteString
  
  , cookieXsrfSetting :: !(Maybe XsrfCookieSettings)
  } deriving (Eq, Show, Generic)
instance Default CookieSettings where
  def = defaultCookieSettings
defaultCookieSettings :: CookieSettings
defaultCookieSettings = CookieSettings
    { cookieIsSecure    = Secure
    , cookieMaxAge      = Nothing
    , cookieExpires     = Nothing
    , cookiePath        = Just "/"
    , cookieDomain      = Nothing
    , cookieSameSite    = SameSiteLax
    , sessionCookieName = "JWT-Cookie"
    , cookieXsrfSetting = Just def
    }
data XsrfCookieSettings = XsrfCookieSettings
  {
  
    xsrfCookieName :: !BS.ByteString
  
  , xsrfCookiePath :: !(Maybe BS.ByteString)
  
  , xsrfHeaderName :: !BS.ByteString
  
  , xsrfExcludeGet :: !Bool
  } deriving (Eq, Show, Generic)
instance Default XsrfCookieSettings where
  def = defaultXsrfCookieSettings
defaultXsrfCookieSettings :: XsrfCookieSettings
defaultXsrfCookieSettings = XsrfCookieSettings
  { xsrfCookieName = "XSRF-TOKEN"
  , xsrfCookiePath = Just "/"
  , xsrfHeaderName = "X-XSRF-TOKEN"
  , xsrfExcludeGet = False
  }
jwtSettingsToJwtValidationSettings :: JWTSettings -> Jose.JWTValidationSettings
jwtSettingsToJwtValidationSettings s
  = defaultJWTValidationSettings (toBool <$> audienceMatches s)
  where
    toBool Matches      = True
    toBool DoesNotMatch = False