{-# LANGUAGE DeriveGeneric       #-}
{-# LANGUAGE OverloadedStrings   #-}
{-# LANGUAGE RecordWildCards     #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TemplateHaskell     #-}
{-# LANGUAGE TypeOperators       #-}

module PegNet.RPC.Types.SyncStatus where

import           Control.Applicative
import           Control.Monad                   (forM_, join, mzero)
import           Data.Aeson                      (FromJSON (..), ToJSON (..),
                                                  Value (..), decode, object,
                                                  pairs, (.:), (.:?), (.=))
import           Data.Aeson.AutoType.Alternative
import qualified Data.ByteString.Lazy.Char8      as BSL
import           Data.Monoid
import           Data.Text                       (Text)
import qualified GHC.Generics
import           System.Environment              (getArgs)
import           System.Exit                     (exitFailure, exitSuccess)
import           System.IO                       (hPutStrLn, stderr)

--------------------------------------------------------------------------------

-- | Workaround for https://github.com/bos/aeson/issues/287.
o .:?? val = fmap join (o .:? val)

data SyncStatus = SyncStatus {
    topLevelFactomheight :: Double,
    topLevelSyncheight   :: Double
  } deriving (Show,Eq,GHC.Generics.Generic)

instance FromJSON SyncStatus where
  parseJSON (Object v) =
    SyncStatus
      <$> v .:   "factomheight"
      <*> v .:   "syncheight"
  parseJSON _          = mzero

instance ToJSON SyncStatus where
  toJSON (SyncStatus {..}) =
    object [ "factomheight" .= topLevelFactomheight
           , "syncheight"   .= topLevelSyncheight]
  toEncoding (SyncStatus {..}) =
    pairs  (   "factomheight" .= topLevelFactomheight
            <> "syncheight"   .= topLevelSyncheight)