{-# LANGUAGE OverloadedStrings #-}

module ZaifExchangeAPI.Type
    ( ApiName
    , Chart (..)
    , Api (..)
    , tshow
    , JLastPrice (..)
    , JTicker (..)
    , JTrade (..)
    , JTradeList (..)
    , JDepth (..)
    ) where

import Control.Applicative ((<$>), (<*>), empty)
import Data.Aeson (FromJSON(..), Value(..), (.:))

import qualified Data.Text.Lazy as L (Text)

type ApiName = L.Text

data Chart = BtcJpy | MonaJpy | MonaBtc
data Api = LastPrice | Ticker | Trades | Depth

class TShow a where
    tshow :: a -> ApiName

instance TShow Chart where
    tshow BtcJpy  = "btc_jpy"
    tshow MonaJpy = "mona_jpy"
    tshow MonaBtc = "mona_btc"

instance TShow Api where
    tshow LastPrice  = "last_price"
    tshow Ticker     = "ticker"
    tshow Trades     = "trades"
    tshow Depth      = "depth"

data JLastPrice = JLastPrice { lastprice :: Double } deriving Show

data JTicker    = JTicker { last :: Double
                          , high :: Double
                          , low :: Double
                          , vwap :: Double
                          , volume :: Double
                          , bid :: Double
                          , ask :: Double
                          } deriving Show

data JTrade      = JTrade { date :: Int
                          , price :: Double
                          , amount :: Double
                          , tid :: Int
                          , currencypair :: L.Text
                          , tradetype :: L.Text
                          } deriving Show

newtype JTradeList = JTradeList [JTrade]

instance Show JTradeList where
    show (JTradeList trades) = show trades

data JDepth = JDepth { asks :: [[Double]], bids :: [[Double]] } deriving Show

instance FromJSON JLastPrice where
    parseJSON (Object v) = JLastPrice <$> v .: "last_price"
    parseJSON _          = empty


instance FromJSON JTicker where
    parseJSON (Object v) = JTicker <$>
      v .: "last"   <*>
      v .: "high"   <*>
      v .: "low"    <*>
      v .: "vwap"   <*>
      v .: "volume" <*>
      v .: "bid"    <*>
      v .: "ask"
    parseJSON _          = empty


instance FromJSON JTradeList where
    parseJSON obj = JTradeList <$> parseJSON obj


instance FromJSON JTrade where
    parseJSON (Object v) = JTrade <$>
      v .: "date"          <*>
      v .: "price"         <*>
      v .: "amount"        <*>
      v .: "tid"           <*>
      v .: "currency_pair" <*>
      v .: "trade_type"
    parseJSON _          = empty


instance FromJSON JDepth where
    parseJSON (Object v) = JDepth <$>
      v .: "asks" <*>
      v .: "bids"
    parseJSON _          = empty