{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE TemplateHaskell            #-}

module CoinbasePro.Authenticated.Limits
  ( Limits (..)
  ) where

import           Data.Aeson        (FromJSON, ToJSON, parseJSON, withText)
import           Data.Aeson.Casing (snakeCase)
import           Data.Aeson.TH     (defaultOptions, deriveJSON,
                                    fieldLabelModifier)
import           Data.Map.Strict   (Map)
import           Data.Text         (Text, unpack)

import           CoinbasePro.Types (ProductId)


newtype LimitCurrency = LimitCurrency Text
  deriving (LimitCurrency -> LimitCurrency -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: LimitCurrency -> LimitCurrency -> Bool
$c/= :: LimitCurrency -> LimitCurrency -> Bool
== :: LimitCurrency -> LimitCurrency -> Bool
$c== :: LimitCurrency -> LimitCurrency -> Bool
Eq, Int -> LimitCurrency -> ShowS
[LimitCurrency] -> ShowS
LimitCurrency -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [LimitCurrency] -> ShowS
$cshowList :: [LimitCurrency] -> ShowS
show :: LimitCurrency -> String
$cshow :: LimitCurrency -> String
showsPrec :: Int -> LimitCurrency -> ShowS
$cshowsPrec :: Int -> LimitCurrency -> ShowS
Show, [LimitCurrency] -> Encoding
[LimitCurrency] -> Value
LimitCurrency -> Encoding
LimitCurrency -> Value
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
toEncodingList :: [LimitCurrency] -> Encoding
$ctoEncodingList :: [LimitCurrency] -> Encoding
toJSONList :: [LimitCurrency] -> Value
$ctoJSONList :: [LimitCurrency] -> Value
toEncoding :: LimitCurrency -> Encoding
$ctoEncoding :: LimitCurrency -> Encoding
toJSON :: LimitCurrency -> Value
$ctoJSON :: LimitCurrency -> Value
ToJSON, Value -> Parser [LimitCurrency]
Value -> Parser LimitCurrency
forall a.
(Value -> Parser a) -> (Value -> Parser [a]) -> FromJSON a
parseJSONList :: Value -> Parser [LimitCurrency]
$cparseJSONList :: Value -> Parser [LimitCurrency]
parseJSON :: Value -> Parser LimitCurrency
$cparseJSON :: Value -> Parser LimitCurrency
FromJSON)


newtype Max = Max Double
  deriving (Max -> Max -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Max -> Max -> Bool
$c/= :: Max -> Max -> Bool
== :: Max -> Max -> Bool
$c== :: Max -> Max -> Bool
Eq, Int -> Max -> ShowS
[Max] -> ShowS
Max -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Max] -> ShowS
$cshowList :: [Max] -> ShowS
show :: Max -> String
$cshow :: Max -> String
showsPrec :: Int -> Max -> ShowS
$cshowsPrec :: Int -> Max -> ShowS
Show, Eq Max
Max -> Max -> Bool
Max -> Max -> Ordering
Max -> Max -> Max
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Max -> Max -> Max
$cmin :: Max -> Max -> Max
max :: Max -> Max -> Max
$cmax :: Max -> Max -> Max
>= :: Max -> Max -> Bool
$c>= :: Max -> Max -> Bool
> :: Max -> Max -> Bool
$c> :: Max -> Max -> Bool
<= :: Max -> Max -> Bool
$c<= :: Max -> Max -> Bool
< :: Max -> Max -> Bool
$c< :: Max -> Max -> Bool
compare :: Max -> Max -> Ordering
$ccompare :: Max -> Max -> Ordering
Ord, [Max] -> Encoding
[Max] -> Value
Max -> Encoding
Max -> Value
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
toEncodingList :: [Max] -> Encoding
$ctoEncodingList :: [Max] -> Encoding
toJSONList :: [Max] -> Value
$ctoJSONList :: [Max] -> Value
toEncoding :: Max -> Encoding
$ctoEncoding :: Max -> Encoding
toJSON :: Max -> Value
$ctoJSON :: Max -> Value
ToJSON, Value -> Parser [Max]
Value -> Parser Max
forall a.
(Value -> Parser a) -> (Value -> Parser [a]) -> FromJSON a
parseJSONList :: Value -> Parser [Max]
$cparseJSONList :: Value -> Parser [Max]
parseJSON :: Value -> Parser Max
$cparseJSON :: Value -> Parser Max
FromJSON)


newtype Remaining = Remaining Double
  deriving (Remaining -> Remaining -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Remaining -> Remaining -> Bool
$c/= :: Remaining -> Remaining -> Bool
== :: Remaining -> Remaining -> Bool
$c== :: Remaining -> Remaining -> Bool
Eq, Int -> Remaining -> ShowS
[Remaining] -> ShowS
Remaining -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Remaining] -> ShowS
$cshowList :: [Remaining] -> ShowS
show :: Remaining -> String
$cshow :: Remaining -> String
showsPrec :: Int -> Remaining -> ShowS
$cshowsPrec :: Int -> Remaining -> ShowS
Show, Eq Remaining
Remaining -> Remaining -> Bool
Remaining -> Remaining -> Ordering
Remaining -> Remaining -> Remaining
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Remaining -> Remaining -> Remaining
$cmin :: Remaining -> Remaining -> Remaining
max :: Remaining -> Remaining -> Remaining
$cmax :: Remaining -> Remaining -> Remaining
>= :: Remaining -> Remaining -> Bool
$c>= :: Remaining -> Remaining -> Bool
> :: Remaining -> Remaining -> Bool
$c> :: Remaining -> Remaining -> Bool
<= :: Remaining -> Remaining -> Bool
$c<= :: Remaining -> Remaining -> Bool
< :: Remaining -> Remaining -> Bool
$c< :: Remaining -> Remaining -> Bool
compare :: Remaining -> Remaining -> Ordering
$ccompare :: Remaining -> Remaining -> Ordering
Ord, [Remaining] -> Encoding
[Remaining] -> Value
Remaining -> Encoding
Remaining -> Value
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
toEncodingList :: [Remaining] -> Encoding
$ctoEncodingList :: [Remaining] -> Encoding
toJSONList :: [Remaining] -> Value
$ctoJSONList :: [Remaining] -> Value
toEncoding :: Remaining -> Encoding
$ctoEncoding :: Remaining -> Encoding
toJSON :: Remaining -> Value
$ctoJSON :: Remaining -> Value
ToJSON, Value -> Parser [Remaining]
Value -> Parser Remaining
forall a.
(Value -> Parser a) -> (Value -> Parser [a]) -> FromJSON a
parseJSONList :: Value -> Parser [Remaining]
$cparseJSONList :: Value -> Parser [Remaining]
parseJSON :: Value -> Parser Remaining
$cparseJSON :: Value -> Parser Remaining
FromJSON)


newtype PeriodInDays = PeriodInDays Int
  deriving (PeriodInDays -> PeriodInDays -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: PeriodInDays -> PeriodInDays -> Bool
$c/= :: PeriodInDays -> PeriodInDays -> Bool
== :: PeriodInDays -> PeriodInDays -> Bool
$c== :: PeriodInDays -> PeriodInDays -> Bool
Eq, Int -> PeriodInDays -> ShowS
[PeriodInDays] -> ShowS
PeriodInDays -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [PeriodInDays] -> ShowS
$cshowList :: [PeriodInDays] -> ShowS
show :: PeriodInDays -> String
$cshow :: PeriodInDays -> String
showsPrec :: Int -> PeriodInDays -> ShowS
$cshowsPrec :: Int -> PeriodInDays -> ShowS
Show, [PeriodInDays] -> Encoding
[PeriodInDays] -> Value
PeriodInDays -> Encoding
PeriodInDays -> Value
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
toEncodingList :: [PeriodInDays] -> Encoding
$ctoEncodingList :: [PeriodInDays] -> Encoding
toJSONList :: [PeriodInDays] -> Value
$ctoJSONList :: [PeriodInDays] -> Value
toEncoding :: PeriodInDays -> Encoding
$ctoEncoding :: PeriodInDays -> Encoding
toJSON :: PeriodInDays -> Value
$ctoJSON :: PeriodInDays -> Value
ToJSON)


instance FromJSON PeriodInDays where
  parseJSON :: Value -> Parser PeriodInDays
parseJSON = forall a. String -> (Text -> Parser a) -> Value -> Parser a
withText String
"period_in_days" forall a b. (a -> b) -> a -> b
$ \Text
t ->
    forall (m :: * -> *) a. Monad m => a -> m a
return forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> PeriodInDays
PeriodInDays forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Read a => String -> a
read forall a b. (a -> b) -> a -> b
$ Text -> String
unpack Text
t


data Limit = Limit
  { Limit -> Max
max          :: Max
  , Limit -> Remaining
remaining    :: Remaining
  , Limit -> Maybe PeriodInDays
periodInDays :: Maybe PeriodInDays
  } deriving (Limit -> Limit -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Limit -> Limit -> Bool
$c/= :: Limit -> Limit -> Bool
== :: Limit -> Limit -> Bool
$c== :: Limit -> Limit -> Bool
Eq, Int -> Limit -> ShowS
[Limit] -> ShowS
Limit -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Limit] -> ShowS
$cshowList :: [Limit] -> ShowS
show :: Limit -> String
$cshow :: Limit -> String
showsPrec :: Int -> Limit -> ShowS
$cshowsPrec :: Int -> Limit -> ShowS
Show)


deriveJSON defaultOptions { fieldLabelModifier = snakeCase } ''Limit


type LimitMap = Map ProductId Limit


data TransferLimits = TransferLimits
  { TransferLimits -> Maybe LimitMap
ach                  :: Maybe LimitMap
  , TransferLimits -> Maybe LimitMap
achNoBalance         :: Maybe LimitMap
  , TransferLimits -> Maybe LimitMap
creditDebitCard      :: Maybe LimitMap
  , TransferLimits -> Maybe LimitMap
achCurm              :: Maybe LimitMap
  , TransferLimits -> Maybe LimitMap
secure3dBuy          :: Maybe LimitMap
  , TransferLimits -> Maybe LimitMap
exchangeWithdraw     :: Maybe LimitMap
  , TransferLimits -> Maybe LimitMap
exchangeAch          :: Maybe LimitMap
  , TransferLimits -> Maybe LimitMap
paypalWithdrawal     :: Maybe LimitMap
  , TransferLimits -> Maybe LimitMap
instantAchWithdrawal :: Maybe LimitMap
  , TransferLimits -> Maybe LimitMap
instantBuy           :: Maybe LimitMap
  , TransferLimits -> Maybe LimitMap
buy                  :: Maybe LimitMap
  , TransferLimits -> Maybe LimitMap
sell                 :: Maybe LimitMap
  } deriving (TransferLimits -> TransferLimits -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: TransferLimits -> TransferLimits -> Bool
$c/= :: TransferLimits -> TransferLimits -> Bool
== :: TransferLimits -> TransferLimits -> Bool
$c== :: TransferLimits -> TransferLimits -> Bool
Eq, Int -> TransferLimits -> ShowS
[TransferLimits] -> ShowS
TransferLimits -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [TransferLimits] -> ShowS
$cshowList :: [TransferLimits] -> ShowS
show :: TransferLimits -> String
$cshow :: TransferLimits -> String
showsPrec :: Int -> TransferLimits -> ShowS
$cshowsPrec :: Int -> TransferLimits -> ShowS
Show)


deriveJSON defaultOptions { fieldLabelModifier = snakeCase } ''TransferLimits


data Limits = Limits
    { Limits -> LimitCurrency
limitCurrency  :: LimitCurrency
    , Limits -> TransferLimits
transferLimits :: TransferLimits
    } deriving (Limits -> Limits -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Limits -> Limits -> Bool
$c/= :: Limits -> Limits -> Bool
== :: Limits -> Limits -> Bool
$c== :: Limits -> Limits -> Bool
Eq, Int -> Limits -> ShowS
[Limits] -> ShowS
Limits -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Limits] -> ShowS
$cshowList :: [Limits] -> ShowS
show :: Limits -> String
$cshow :: Limits -> String
showsPrec :: Int -> Limits -> ShowS
$cshowsPrec :: Int -> Limits -> ShowS
Show)


deriveJSON defaultOptions { fieldLabelModifier = snakeCase } ''Limits