module Data.Blockchain.Types.Block
    ( Block(..)
    , BlockHeader(..)
    ) where

import qualified Data.Aeson                        as Aeson
import qualified Data.Time.Clock                   as Time
import qualified GHC.Generics                      as Generic

import qualified Data.Blockchain.Crypto            as Crypto
import           Data.Blockchain.Types.Difficulty
import           Data.Blockchain.Types.Transaction

data Block = Block
    { blockHeader         :: BlockHeader
    , coinbaseTransaction :: CoinbaseTransaction
    , transactions        :: [Transaction]
    }
  deriving (Generic.Generic, Eq, Show)

instance Aeson.FromJSON Block
instance Aeson.ToJSON Block

data BlockHeader = BlockHeader
    { version                 :: Int
    , prevBlockHeaderHash     :: Crypto.Hash BlockHeader
    , coinbaseTransactionHash :: Crypto.Hash CoinbaseTransaction
    , transactionHashTreeRoot :: Crypto.HashTreeRoot Transaction
    , time                    :: Time.UTCTime
    , difficulty              :: Difficulty
    , nonce                   :: Int
    }
  deriving (Generic.Generic, Eq, Show)

instance Aeson.FromJSON BlockHeader
instance Aeson.ToJSON BlockHeader
instance Crypto.ToHash BlockHeader