module Data.Proof.PublicTokenCreate
  ( HasCreatePublicTokenBody
  , proveCreatePublicTokenBody
  ) where

import           Data.Api.Types
import           Data.Proof.Named
import           Data.Text        (Text)

data HasCreatePublicTokenBody plaidEnv institutionId productList plaidOptions = Proof

-- | Check if all elements for creating a public token are present
proveCreatePublicTokenBody
  :: Named plaidEnv PlaidEnv
  -> Named institutionId InstitutionId
  -> Named productList [PlaidProduct]
  -> Named options (Maybe PlaidOptions)
  -> Either Text (HasCreatePublicTokenBody plaidEnv institutionId productList options)
proveCreatePublicTokenBody _ institutionId productList _
  | null (unWrapNamed productList) =
      Left "Initial products list cannot be empty"
  | unWrapNamed institutionId `elem` validInstitutionIds
      = Right Proof
  | otherwise = Left (unInstitutionId (unWrapNamed institutionId)
                  <> " is not a valid institution id. Check the plaid documentation.")