module Utils.Avs where

import Import.NoModel

import Servant
import Servant.Client.Core (ClientError)

import Utils.Lens


type AvsPersonResponse = Value 
type AvsStatusResponse = Value 

data AvsPersonQuery = AvsPersonQuery
        { avsPersonQueryCardNo             :: Maybe Text
        , avsPersonQueryFirstName          :: Maybe Text
        , avsPersonQueryLastName           :: Maybe Text
        , avsPersonQueryInternalPersonalNo :: Maybe Text
        , avsPersonQueryVersionNo          :: Maybe Text
        }
  deriving (Eq, Ord, Read, Show, Generic, Typeable)

instance Default AvsPersonQuery where 
  def = AvsPersonQuery Nothing Nothing Nothing Nothing Nothing

deriveJSON defaultOptions
  { fieldLabelModifier = mconcat . drop 3 . splitCamel
  , omitNothingFields = True
  , tagSingleConstructors = False
  } ''AvsPersonQuery


newtype AvsStatusQuery = AvsStatusQuery (Set Int)
deriveJSON defaultOptions ''AvsStatusQuery 


data AvsQuery = AvsQuery
  { avsQueryPerson :: forall m. MonadIO m => AvsPersonQuery -> m (Either ClientError AvsPersonResponse)
  , avsQueryStatus :: forall m. MonadIO m => AvsStatusQuery -> m (Either ClientError AvsStatusResponse)
  }

makeLenses_ ''AvsQuery


type AVS = AVSRoute (AVSPersonSearch :<|> AVSPersonStatus)

type AVSAuth = BasicAuth "avs_fradrive" String        

type AVSRoute a = AVSAuth :> "FraVSMService" :> "v1" :> a

type AVSPersonSearch = "PersonSearch" :> ReqBody '[JSON] AvsPersonQuery :> Post '[JSON] AvsPersonResponse
type AVSPersonStatus = "PersonStatus" :> ReqBody '[JSON] AvsStatusQuery :> Post '[JSON] AvsStatusResponse


avsApi :: Proxy AVS
avsApi = Proxy
