-- |
-- Serialisation of token response. You probably want 'Network.OAuth2.JWT.Client'.
--
{-# LANGUAGE OverloadedStrings #-}
module Network.OAuth2.JWT.Client.Serial (
    response
  , parser
  ) where

import           Control.Monad (when)

import           Data.Aeson ((.:))
import qualified Data.Aeson as Aeson
import qualified Data.Aeson.Types as Aeson
import           Data.Bifunctor as X (Bifunctor(..))
import qualified Data.ByteString.Lazy as LazyByteString
import           Data.Text (Text)
import qualified Data.Text as Text

import           Network.OAuth2.JWT.Client.Data


response :: LazyByteString.ByteString -> Either Text Response
response bytes =
  first Text.pack (Aeson.eitherDecode bytes) >>= \a' -> case Aeson.parse parser a' of
    Aeson.Success a -> pure a
    Aeson.Error msg -> Left . Text.pack $ msg

parser :: Aeson.Value -> Aeson.Parser Response
parser =
  Aeson.withObject "Response" $ \o ->
    Response
      <$> (fmap AccessToken $ o .: "access_token")
      <*> (fmap ExpiresIn $ o .: "expires_in")
      <* (o .: "token_type" >>= tokenType)

tokenType :: Text -> Aeson.Parser ()
tokenType t =
  when (t /= "Bearer") $
    fail "Unknown 'token_type' expected: 'Bearer'."