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

module PegNet.RPC.Types.TransactionStatus 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)

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

data TransactionStatus =
  TransactionStatus {
    txHeight   :: Int,
    txExecuted :: Int
  } deriving (Show,Eq,GHC.Generics.Generic)

instance FromJSON TransactionStatus where
  parseJSON (Object v) =
    TransactionStatus
      <$> v .: "height"
      <*> v .: "executed"
  parseJSON _          = mzero

instance ToJSON TransactionStatus where
  toJSON (TransactionStatus {..}) =
    object [ "height" .= txHeight
           , "executed" .= txExecuted
           ]
  toEncoding (TransactionStatus {..}) =
    pairs  (    "height"   .= txHeight
             <> "executed" .= txExecuted
           )