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

module CoinbasePro.WebSocketFeed.Channel.Full.Done
    ( Done (..)
    ) where

import           Data.Aeson        (FromJSON, parseJSON)
import           Data.Aeson.Casing (snakeCase)
import           Data.Aeson.TH     (defaultOptions, deriveJSON,
                                    fieldLabelModifier)
import           Data.Text         (Text)
import           Data.Time.Clock   (UTCTime)

import           CoinbasePro.Types (OrderId, Price, ProductId, Sequence, Side,
                                    Size)


type Reason = Text

newtype RemainingSize = RemainingSize { unRemainingSize :: Maybe Size }
    deriving (Eq, Ord, Show)


instance FromJSON RemainingSize where
    parseJSON = (RemainingSize <$>) . parseJSON


data Done = Done
    { time          :: UTCTime
    , productId     :: ProductId
    , sequence      :: Sequence
    , price         :: Maybe Price
    , orderId       :: OrderId
    , reason        :: Reason
    , side          :: Side
    , remainingSize :: Maybe Size
    } deriving (Eq, Ord, Show)


deriveJSON defaultOptions {fieldLabelModifier = snakeCase} ''Done