{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE OverloadedStrings #-}
{-# OPTIONS_GHC -Wno-orphans #-}

module Ouroboros.Consensus.Tracing.Committee () where

import Cardano.Logging (LogFormatting (..))
import Data.Aeson (Value (..), (.=))
import Ouroboros.Consensus.Committee.Class (VotingCommitteeError)
import Ouroboros.Consensus.Committee.EveryoneVotes (EveryoneVotes)
import qualified Ouroboros.Consensus.Committee.EveryoneVotes as EveryoneVotes
import Ouroboros.Consensus.Committee.Types (PoolId (..), TargetCommitteeSize (..))
import Ouroboros.Consensus.Committee.WFA
  ( NumPoolsWithPositiveStake (..)
  , SeatIndex (..)
  , WFAError (..)
  )
import Ouroboros.Consensus.Committee.WFALS (WFALS)
import qualified Ouroboros.Consensus.Committee.WFALS as WFALS

--
-- instances for WFAError
--

instance LogFormatting WFAError where
  forMachine :: DetailLevel -> WFAError -> Object
forMachine DetailLevel
_dtal WFAError
EmptyStakeDistribution =
    [Object] -> Object
forall a. Monoid a => [a] -> a
mconcat
      [ Key
"kind" Key -> Value -> Object
forall v. ToJSON v => Key -> v -> Object
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Text -> Value
String Text
"EmptyStakeDistribution"
      ]
  forMachine DetailLevel
_dtal (NotEnoughPoolsWithPositiveStake TargetCommitteeSize
targetCommitteeSize NumPoolsWithPositiveStake
numPoolsWithPositiveStake) =
    [Object] -> Object
forall a. Monoid a => [a] -> a
mconcat
      [ Key
"kind" Key -> Value -> Object
forall v. ToJSON v => Key -> v -> Object
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Text -> Value
String Text
"NotEnoughPoolsWithPositiveStake"
      , Key
"targetCommitteeSize" Key -> Word64 -> Object
forall v. ToJSON v => Key -> v -> Object
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= TargetCommitteeSize -> Word64
unTargetCommitteeSize TargetCommitteeSize
targetCommitteeSize
      , Key
"numPoolsWithPositiveStake" Key -> Word64 -> Object
forall v. ToJSON v => Key -> v -> Object
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= NumPoolsWithPositiveStake -> Word64
unNumPoolsWithPositiveStake NumPoolsWithPositiveStake
numPoolsWithPositiveStake
      ]

instance LogFormatting (VotingCommitteeError crypto WFALS) where
  forMachine :: DetailLevel -> VotingCommitteeError crypto WFALS -> Object
forMachine DetailLevel
_dtal (WFALS.WFAError WFAError
e) =
    [Object] -> Object
forall a. Monoid a => [a] -> a
mconcat
      [ Key
"kind" Key -> Value -> Object
forall v. ToJSON v => Key -> v -> Object
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Text -> Value
String Text
"WFAError"
      , DetailLevel -> WFAError -> Object
forall a. LogFormatting a => DetailLevel -> a -> Object
forMachine DetailLevel
_dtal WFAError
e
      ]
  forMachine DetailLevel
_dtal (WFALS.MissingPoolId PoolId
poolId) =
    [Object] -> Object
forall a. Monoid a => [a] -> a
mconcat
      [ Key
"kind" Key -> Value -> Object
forall v. ToJSON v => Key -> v -> Object
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Text -> Value
String Text
"MissingPoolId"
      , Key
"poolId" Key -> KeyHash StakePool -> Object
forall v. ToJSON v => Key -> v -> Object
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= PoolId -> KeyHash StakePool
unPoolId PoolId
poolId
      ]
  forMachine DetailLevel
_dtal (WFALS.NotAPersistentMember SeatIndex
seatIndex) =
    [Object] -> Object
forall a. Monoid a => [a] -> a
mconcat
      [ Key
"kind" Key -> Value -> Object
forall v. ToJSON v => Key -> v -> Object
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Text -> Value
String Text
"NotAPersistentMember"
      , Key
"seatIndex" Key -> Word64 -> Object
forall v. ToJSON v => Key -> v -> Object
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= SeatIndex -> Word64
unSeatIndex SeatIndex
seatIndex
      ]
  forMachine DetailLevel
_dtal (WFALS.NotANonPersistentMember SeatIndex
seatIndex) =
    [Object] -> Object
forall a. Monoid a => [a] -> a
mconcat
      [ Key
"kind" Key -> Value -> Object
forall v. ToJSON v => Key -> v -> Object
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Text -> Value
String Text
"NotANonPersistentMember"
      , Key
"seatIndex" Key -> Word64 -> Object
forall v. ToJSON v => Key -> v -> Object
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= SeatIndex -> Word64
unSeatIndex SeatIndex
seatIndex
      ]
  forMachine DetailLevel
_dtal (WFALS.ZeroNonPersistentSeats SeatIndex
seatIndex) =
    [Object] -> Object
forall a. Monoid a => [a] -> a
mconcat
      [ Key
"kind" Key -> Value -> Object
forall v. ToJSON v => Key -> v -> Object
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Text -> Value
String Text
"ZeroNonPersistentSeats"
      , Key
"seatIndex" Key -> Word64 -> Object
forall v. ToJSON v => Key -> v -> Object
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= SeatIndex -> Word64
unSeatIndex SeatIndex
seatIndex
      ]
  forMachine DetailLevel
_dtal (WFALS.InvalidVoteSignature String
msg) =
    [Object] -> Object
forall a. Monoid a => [a] -> a
mconcat
      [ Key
"kind" Key -> Value -> Object
forall v. ToJSON v => Key -> v -> Object
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Text -> Value
String Text
"InvalidVoteSignature"
      , Key
"message" Key -> String -> Object
forall v. ToJSON v => Key -> v -> Object
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= String
msg
      ]
  forMachine DetailLevel
_dtal (WFALS.InvalidVoterEligibilityProof String
msg) =
    [Object] -> Object
forall a. Monoid a => [a] -> a
mconcat
      [ Key
"kind" Key -> Value -> Object
forall v. ToJSON v => Key -> v -> Object
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Text -> Value
String Text
"InvalidVoterEligibilityProof"
      , Key
"message" Key -> String -> Object
forall v. ToJSON v => Key -> v -> Object
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= String
msg
      ]
  forMachine DetailLevel
_dtal (WFALS.InvalidCertSignature String
msg) =
    [Object] -> Object
forall a. Monoid a => [a] -> a
mconcat
      [ Key
"kind" Key -> Value -> Object
forall v. ToJSON v => Key -> v -> Object
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Text -> Value
String Text
"InvalidCertSignature"
      , Key
"message" Key -> String -> Object
forall v. ToJSON v => Key -> v -> Object
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= String
msg
      ]
  forMachine DetailLevel
_dtal (WFALS.CryptoError String
msg) =
    [Object] -> Object
forall a. Monoid a => [a] -> a
mconcat
      [ Key
"kind" Key -> Value -> Object
forall v. ToJSON v => Key -> v -> Object
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Text -> Value
String Text
"CryptoError"
      , Key
"message" Key -> String -> Object
forall v. ToJSON v => Key -> v -> Object
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= String
msg
      ]

instance LogFormatting (VotingCommitteeError crypto EveryoneVotes) where
  forMachine :: DetailLevel -> VotingCommitteeError crypto EveryoneVotes -> Object
forMachine DetailLevel
_dtal (EveryoneVotes.WFAError WFAError
e) =
    [Object] -> Object
forall a. Monoid a => [a] -> a
mconcat
      [ Key
"kind" Key -> Value -> Object
forall v. ToJSON v => Key -> v -> Object
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Text -> Value
String Text
"WFAError"
      , DetailLevel -> WFAError -> Object
forall a. LogFormatting a => DetailLevel -> a -> Object
forMachine DetailLevel
_dtal WFAError
e
      ]
  forMachine DetailLevel
_dtal (EveryoneVotes.MissingPoolId PoolId
poolId) =
    [Object] -> Object
forall a. Monoid a => [a] -> a
mconcat
      [ Key
"kind" Key -> Value -> Object
forall v. ToJSON v => Key -> v -> Object
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Text -> Value
String Text
"MissingPoolId"
      , Key
"poolId" Key -> KeyHash StakePool -> Object
forall v. ToJSON v => Key -> v -> Object
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= PoolId -> KeyHash StakePool
unPoolId PoolId
poolId
      ]
  forMachine DetailLevel
_dtal (EveryoneVotes.MissingSeatIndex SeatIndex
seatIndex) =
    [Object] -> Object
forall a. Monoid a => [a] -> a
mconcat
      [ Key
"kind" Key -> Value -> Object
forall v. ToJSON v => Key -> v -> Object
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Text -> Value
String Text
"MissingSeatIndex"
      , Key
"seatIndex" Key -> Word64 -> Object
forall v. ToJSON v => Key -> v -> Object
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= SeatIndex -> Word64
unSeatIndex SeatIndex
seatIndex
      ]
  forMachine DetailLevel
_dtal (EveryoneVotes.PoolHasNoStake SeatIndex
seatIndex) =
    [Object] -> Object
forall a. Monoid a => [a] -> a
mconcat
      [ Key
"kind" Key -> Value -> Object
forall v. ToJSON v => Key -> v -> Object
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Text -> Value
String Text
"PoolHasNoStake"
      , Key
"seatIndex" Key -> Word64 -> Object
forall v. ToJSON v => Key -> v -> Object
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= SeatIndex -> Word64
unSeatIndex SeatIndex
seatIndex
      ]
  forMachine DetailLevel
_dtal (EveryoneVotes.InvalidVoteSignature String
msg) =
    [Object] -> Object
forall a. Monoid a => [a] -> a
mconcat
      [ Key
"kind" Key -> Value -> Object
forall v. ToJSON v => Key -> v -> Object
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Text -> Value
String Text
"InvalidVoteSignature"
      , Key
"message" Key -> String -> Object
forall v. ToJSON v => Key -> v -> Object
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= String
msg
      ]
  forMachine DetailLevel
_dtal (EveryoneVotes.InvalidCertSignature String
msg) =
    [Object] -> Object
forall a. Monoid a => [a] -> a
mconcat
      [ Key
"kind" Key -> Value -> Object
forall v. ToJSON v => Key -> v -> Object
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Text -> Value
String Text
"InvalidCertSignature"
      , Key
"message" Key -> String -> Object
forall v. ToJSON v => Key -> v -> Object
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= String
msg
      ]
  forMachine DetailLevel
_dtal (EveryoneVotes.CryptoError String
msg) =
    [Object] -> Object
forall a. Monoid a => [a] -> a
mconcat
      [ Key
"kind" Key -> Value -> Object
forall v. ToJSON v => Key -> v -> Object
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Text -> Value
String Text
"CryptoError"
      , Key
"message" Key -> String -> Object
forall v. ToJSON v => Key -> v -> Object
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= String
msg
      ]