{-#LANGUAGE PatternGuards #-}
-------------------------------------------------------------------------------
-- |
-- Module      :  Twilio.AuthToken
-- Copyright   :  (C) 2017- Mark Andrus Roberts
-- License     :  BSD-style (see the file LICENSE)
-- Maintainer  :  Mark Andrus Roberts <markandrusroberts@gmail.com>
-- Stability   :  provisional
-------------------------------------------------------------------------------
module Twilio.Types.AuthToken
  ( -- * Authentication Token
    AuthToken
  , getAuthToken
  , parseAuthToken
  ) where

import Control.Monad
import Data.Aeson
import Data.Char
import Data.Text (Text)
import qualified Data.Text as T

-- | Your authentication token is used to make authenticated REST API requests
-- to your Twilio account.
newtype AuthToken = AuthToken { getAuthToken' :: Text }
  deriving (Show, Eq, Ord)

-- | Get the 'Text' representation of an 'AuthToken'.
getAuthToken :: AuthToken -> Text
getAuthToken = getAuthToken'

-- | Parse a 'Text' to an 'AuthToken'.
parseAuthToken :: Text -> Maybe AuthToken
parseAuthToken = parseAuthToken'

parseAuthToken' :: MonadPlus m => Text -> m AuthToken
parseAuthToken' token
  | T.length token == 32
  , T.all (\x -> isLower x || isNumber x) token
  = return $ AuthToken token
  | otherwise
  = mzero

instance FromJSON AuthToken where
  parseJSON (String v) = parseAuthToken' v
  parseJSON _ = mzero