{-# LANGUAGE DeriveDataTypeable, ScopedTypeVariables, OverloadedStrings, FlexibleContexts, FlexibleInstances, ConstraintKinds #-}
-- | handle payouts
module Web.MangoPay.Payouts where

import Web.MangoPay.Accounts
import Web.MangoPay.Monad
import Web.MangoPay.Types
import Web.MangoPay.Users
import Web.MangoPay.Wallets

import Data.Text
import Data.Typeable (Typeable)
import Data.Aeson
import Data.Time.Clock.POSIX (POSIXTime)
import Control.Applicative

-- | create a payout
createPayout ::  (MPUsableMonad m) => Payout -> AccessToken -> MangoPayT m Payout
createPayout = createGeneric "/payouts/bankwire"

-- | fetch an payout from its Id
fetchPayout :: (MPUsableMonad m) => PayoutId -> AccessToken -> MangoPayT m Payout
fetchPayout = fetchGeneric "/payouts/"

-- | make a simplep payout for creation
mkPayout :: AnyUserId -> WalletId -> Amount -> Amount -> BankAccountId -> Payout
mkPayout aid wid fds fees bid=Payout Nothing Nothing Nothing aid wid fds fees bid Nothing Nothing Nothing Nothing Nothing
  Nothing Nothing Nothing Nothing Nothing

-- | id of payout
type PayoutId = Text

-- | payout
data Payout=Payout {
  ptId :: Maybe PayoutId
  ,ptCreationDate :: Maybe POSIXTime
  ,ptTag :: Maybe Text -- ^ custom data for client
  ,ptAuthorId :: AnyUserId -- ^ The user Id of the author
  ,ptDebitedWalletId :: WalletId
  ,ptDebitedFunds :: Amount
  ,ptFees :: Amount
  ,ptBankAccountId :: BankAccountId
  ,ptCreditedUserId :: Maybe AnyUserId
  ,ptCreditedFunds :: Maybe Amount
  ,ptStatus :: Maybe TransferStatus
  ,ptResultCode  :: Maybe Text -- ^ The transaction result code
  ,ptResultMessage :: Maybe Text -- ^ The transaction result code
  ,ptExecutionDate :: Maybe  POSIXTime
  ,ptType :: Maybe TransactionType
  ,ptNature :: Maybe TransactionNature
  ,ptPaymentType :: Maybe PaymentType
  ,ptMeanOfPaymentType :: Maybe PaymentType -- ^  « BANK_WIRE »,
  } deriving (Show,Eq,Ord,Typeable)


-- | to json as per MangoPay format
instance ToJSON Payout where
        toJSON pt=object ["Tag" .= ptTag pt,"AuthorId" .= ptAuthorId  pt
          ,"DebitedWalletId" .= ptDebitedWalletId pt
          ,"DebitedFunds" .= ptDebitedFunds pt,"Fees" .= ptFees pt,"BankAccountId" .= ptBankAccountId pt]

-- | from json as per MangoPay format
instance FromJSON Payout where
        parseJSON (Object v) =Payout <$>
                         v .: "Id" <*>
                         v .: "CreationDate" <*>
                         v .:? "Tag" <*>
                         v .: "AuthorId" <*>
                         v .: "DebitedWalletId" <*>
                         v .: "DebitedFunds" <*>
                         v .: "Fees"  <*>
                         v .: "BankAccountId"  <*>
                         v .:? "CreditedUserId"  <*>
                         v .:? "CreditedFunds"  <*>
                         v .:? "Status" <*>
                         v .:? "ResultCode" <*>
                         v .:? "ResultMessage" <*>
                         v .:? "ExecutionDate" <*>
                         v .:? "Type" <*>
                         v .:? "Nature" <*>
                         v .:? "PaymentType" <*>
                         v .:? "MeanOfPaymentType"
        parseJSON _=fail "Payout"