content: {-# LANGUAGE FlexibleInstances     #-}
  {-# LANGUAGE MultiParamTypeClasses #-}
  {-# LANGUAGE OverloadedStrings     #-}
  {-# LANGUAGE TypeFamilies          #-}
  -------------------------------------------
  -- |
  -- Module      : Web.Stripe.Balance
  -- Copyright   : (c) David Johnson, 2014
  -- Maintainer  : code@dmj.io
  -- Stability   : experimental
  -- Portability : POSIX
  --
  -- < https:/\/\stripe.com/docs/api#balance >
  --
  -- @
  -- {-\# LANGUAGE OverloadedStrings \#-}
  -- import Web.Stripe
  -- import Web.Stripe.Balance (getBalance)
  --
  -- main :: IO ()
  -- main = do
  --   let config = StripeConfig (StripeKey "secret_key")
  --   result <- stripe config getBalance
  --   case result of
  --     Right balance    -> print balance
  --     Left stripeError -> print stripeError
  -- @
  module Web.Stripe.Balance
      ( -- * API
        GetBalance
      , getBalance
      , GetBalanceTransaction
      , getBalanceTransaction
      , GetBalanceTransactionHistory
      , getBalanceTransactionHistory
        -- * Types
      , AvailableOn            (..)
      , Balance                (..)
      , BalanceAmount          (..)
      , BalanceTransaction     (..)
      , Created                (..)
      , Currency               (..)
      , EndingBefore           (..)
      , ExpandParams           (..)
      , Limit                  (..)
      , Source                 (..)
      , StartingAfter          (..)
      , StripeList             (..)
      , TimeRange              (..)
      , TransactionId          (..)
      , TransactionType        (..)
      ) where
  
  import           Web.Stripe.StripeRequest (Method (GET), StripeHasParam,
                                             StripeRequest (..),
                                             StripeReturn, ToStripeParam(..),
                                             mkStripeRequest)
  import           Web.Stripe.Util          ((</>))
  import           Web.Stripe.Types         (AvailableOn(..), Balance (..),
                                             BalanceAmount(..), BalanceTransaction(..),
                                             Created(..), Currency(..),
                                             EndingBefore(..), ExpandParams(..),
                                             Limit(..), Source(..), StartingAfter(..),
                                             StripeList (..), TimeRange(..),
                                             TransferId(..), TransactionId (..),
                                             TransactionType(..))
  import           Web.Stripe.Types.Util    (getTransactionId)
  
  ------------------------------------------------------------------------------
  -- | Retrieve the current `Balance` for your Stripe account
  getBalance :: StripeRequest GetBalance
  getBalance = request
    where request = mkStripeRequest GET url params
          url     = "balance"
          params  = []
  
  data GetBalance
  type instance StripeReturn GetBalance = Balance
  
  ------------------------------------------------------------------------------
  -- | Retrieve a 'BalanceTransaction' by 'TransactionId'
  getBalanceTransaction
      :: TransactionId  -- ^ The `TransactionId` of the `Transaction` to retrieve
      -> StripeRequest GetBalanceTransaction
  getBalanceTransaction
      transactionid = request
    where request = mkStripeRequest GET url params
          url     = "balance" </> "history" </> getTransactionId transactionid
          params  = []
  
  data GetBalanceTransaction
  type instance StripeReturn GetBalanceTransaction = BalanceTransaction
  instance StripeHasParam GetBalanceTransaction ExpandParams
  
  ------------------------------------------------------------------------------
  -- | Retrieve the history of `BalanceTransaction`s
  getBalanceTransactionHistory
      :: StripeRequest GetBalanceTransactionHistory
  getBalanceTransactionHistory
                  = request
    where request = mkStripeRequest GET url params
          url     = "balance" </> "history"
          params  = []
  
  data GetBalanceTransactionHistory
  type instance StripeReturn GetBalanceTransactionHistory = (StripeList BalanceTransaction)
  instance StripeHasParam GetBalanceTransactionHistory AvailableOn
  instance StripeHasParam GetBalanceTransactionHistory (TimeRange AvailableOn)
  instance StripeHasParam GetBalanceTransactionHistory Created
  instance StripeHasParam GetBalanceTransactionHistory (TimeRange Created)
  instance StripeHasParam GetBalanceTransactionHistory Currency
  instance StripeHasParam GetBalanceTransactionHistory (EndingBefore TransactionId)
  instance StripeHasParam GetBalanceTransactionHistory Limit
  instance StripeHasParam GetBalanceTransactionHistory (StartingAfter TransactionId)
  instance (ToStripeParam a) => StripeHasParam GetBalanceTransactionHistory (Source a)
  instance StripeHasParam GetBalanceTransactionHistory TransferId
  instance StripeHasParam GetBalanceTransactionHistory TransactionType
  