{-# LANGUAGE OverloadedStrings #-}

module CoinbasePro.MarketData.FullOrderBook
    ( FullOrderBook (..)
    , Order (..)
    ) where

import           Data.Aeson        (FromJSON (..), withArray, withObject, (.:))
import qualified Data.Vector       as V

import           CoinbasePro.Types (OrderId (..), Price, Size)


data FullOrderBook = FullOrderBook
    { sequence :: Int
    , bids     :: [Order]
    , asks     :: [Order]
    } deriving (Eq, Ord, Show)


instance FromJSON FullOrderBook where
    parseJSON = withObject "orderbook" $ \o ->
        FullOrderBook <$>
            o .: "sequence" <*>
            o .: "bids" <*>
            o .: "asks"


data Order = Order
    { price   :: Price
    , size    :: Size
    , orderId :: OrderId
    } deriving (Eq, Ord, Show)


instance FromJSON Order where
    parseJSON = withArray "order" $ \a -> do
        let l = V.toList a
        px  <- parseJSON $ head l
        sz  <- parseJSON $ l !! 1
        oid <- parseJSON $ l !! 2
        return $ Order px sz oid