{-# LANGUAGE DataKinds              #-}
{-# LANGUAGE DeriveGeneric          #-}
{-# LANGUAGE FlexibleInstances      #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE MultiParamTypeClasses  #-}
{-# LANGUAGE OverloadedStrings      #-}
{-# LANGUAGE TemplateHaskell        #-}
{-# LANGUAGE TypeOperators          #-}

module Mollie.API.Refunds
    ( RefundAPI
    , getRefunds
    , getRefundsPaginated
    , newRefund
    , createPaymentRefund
    , getPaymentRefund
    , cancelPaymentRefund
    ) where

import           Data.Default        (Default, def)
import           GHC.Generics        (Generic)
import           Mollie.API.Internal (HalJSON)
import           Mollie.API.Types
import           Servant.API
import           Servant.API.Generic

data RefundAPI route = RefundAPI
    { getRefundsPaginated        :: route :- "refunds"
                                    :> QueryParam "limit" Int
                                    :> QueryParam "from" RefundId
                                    :> Get '[HalJSON] (List Refund)
    -- ^Handler to get a paginated list of refunds. Offset the results by passing the last refund ID in the `from` query param. The refund with this ID is included in the result set as well. See https://docs.mollie.com/reference/v2/refunds-api/list-refunds
    --
    -- Example for fetching the last 3 refunds:
    --
    -- @
    -- import Mollie.API
    -- import Mollie.API.Refunds
    --
    -- env <- createEnv "test_mollieapikeyexample"
    -- let refundsResult = runMollie env (getRefundsPaginated refundClient (Just 3) Nothing)
    -- @
    , getRefunds                 :: route :- "refunds"
                                    :> Get '[HalJSON] (List Refund)
    -- ^Handler to get a paginated list of refunds. Applies default pagination for newest 250 customers. See https://docs.mollie.com/reference/v2/refunds-api/list-refunds
    , createPaymentRefund        :: route :- "payments"
                                    :> Capture "paymentId" PaymentId
                                    :> "refunds"
                                    :> ReqBody '[JSON] NewRefund
                                    :> Post '[HalJSON] Refund
    -- ^Handler to create a new refund for a specific payment. See https://docs.mollie.com/reference/v2/refunds-api/create-refund
    , getPaymentRefund           :: route :- "payments"
                                    :> Capture "paymentId" PaymentId
                                    :> "refunds"
                                    :> Capture "id" RefundId
                                    :> Get '[HalJSON] Refund
    -- ^Handler to get a refund by its identifier for a specific payment. See https://docs.mollie.com/reference/v2/refunds-api/get-refund
    , cancelPaymentRefund        :: route :- "payments"
                                    :> Capture "paymentId" PaymentId
                                    :> "refunds"
                                    :> Capture "id" RefundId
                                    :> DeleteNoContent '[HalJSON] NoContent
    -- ^Handler to cancel a refund by its identifier for a specific payment. See https://docs.mollie.com/reference/v2/refunds-api/cancel-refund
    } deriving Generic

{-|
  Helper to create a minimal new refund. Defaults to refunding the total amount for the targeted payment.
-}
newRefund :: NewRefund
newRefund = def