{-# LANGUAGE FlexibleContexts #-}

module Network.OAuth2.Experiment.Flows.RefreshTokenRequest where

import Data.Map.Strict (Map)
import Data.Map.Strict qualified as Map
import Data.Set (Set)
import Data.Text.Lazy (Text)
import Network.OAuth2 qualified as OAuth2
import Network.OAuth2.Experiment.Flows.TokenRequest
import Network.OAuth2.Experiment.Types

-------------------------------------------------------------------------------
--                            RefreshToken Requset                           --
-------------------------------------------------------------------------------

data RefreshTokenRequest = RefreshTokenRequest
  { RefreshTokenRequest -> RefreshToken
rrRefreshToken :: OAuth2.RefreshToken
  , RefreshTokenRequest -> GrantTypeValue
rrGrantType :: GrantTypeValue
  , RefreshTokenRequest -> Set Scope
rrScope :: Set Scope
  , RefreshTokenRequest -> Maybe ClientId
rrClientId :: Maybe ClientId
  , RefreshTokenRequest -> Maybe ClientSecret
rrClientSecret :: Maybe ClientSecret
  }

instance ToQueryParam RefreshTokenRequest where
  toQueryParam :: RefreshTokenRequest -> Map Text Text
  toQueryParam :: RefreshTokenRequest -> Map Text Text
toQueryParam RefreshTokenRequest {Maybe ClientSecret
Maybe ClientId
Set Scope
RefreshToken
GrantTypeValue
rrRefreshToken :: RefreshTokenRequest -> RefreshToken
rrGrantType :: RefreshTokenRequest -> GrantTypeValue
rrScope :: RefreshTokenRequest -> Set Scope
rrClientId :: RefreshTokenRequest -> Maybe ClientId
rrClientSecret :: RefreshTokenRequest -> Maybe ClientSecret
rrRefreshToken :: RefreshToken
rrGrantType :: GrantTypeValue
rrScope :: Set Scope
rrClientId :: Maybe ClientId
rrClientSecret :: Maybe ClientSecret
..} =
    [Map Text Text] -> Map Text Text
forall (f :: * -> *) k a.
(Foldable f, Ord k) =>
f (Map k a) -> Map k a
Map.unions
      [ GrantTypeValue -> Map Text Text
forall a. ToQueryParam a => a -> Map Text Text
toQueryParam GrantTypeValue
rrGrantType
      , Set Scope -> Map Text Text
forall a. ToQueryParam a => a -> Map Text Text
toQueryParam Set Scope
rrScope
      , RefreshToken -> Map Text Text
forall a. ToQueryParam a => a -> Map Text Text
toQueryParam RefreshToken
rrRefreshToken
      , Maybe ClientId -> Map Text Text
forall a. ToQueryParam a => a -> Map Text Text
toQueryParam Maybe ClientId
rrClientId
      , Maybe ClientSecret -> Map Text Text
forall a. ToQueryParam a => a -> Map Text Text
toQueryParam Maybe ClientSecret
rrClientSecret
      ]

class HasClientAuthenticationMethod a => HasRefreshTokenRequest a where
  -- | Make Refresh Token Request parameters
  -- | https://www.rfc-editor.org/rfc/rfc6749#section-6
  mkRefreshTokenRequestParam :: a -> OAuth2.RefreshToken -> RefreshTokenRequest