{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}
{-# OPTIONS_GHC -Wno-orphans #-}

module Test.Cardano.Ledger.Conformance.ExecSpecRule.Conway.Gov () where

import Cardano.Ledger.Conway (ConwayEra)
import Cardano.Ledger.Conway.Core (EraPParams (..))
import Cardano.Ledger.Conway.Governance
import qualified Cardano.Ledger.Conway.Rules as Conway
import Control.State.Transition.Extended (TRC (..))
import Lens.Micro ((&), (.~), (^.))
import qualified MAlonzo.Code.Ledger.Conway.Foreign.API as Agda
import Test.Cardano.Ledger.Conformance.ExecSpecRule.Conway.Base ()
import Test.Cardano.Ledger.Conformance.ExecSpecRule.Core (
  ExecSpecRule (ExecContext, runAgdaRule, translateInputs),
  SpecTRC (SpecTRC),
 )
import Test.Cardano.Ledger.Conformance.SpecTranslate.Base (
  SpecTranslate (toSpecRep),
  askSpecTransM,
  unComputationResult,
  withCtxSpecTransM,
 )
import Test.Cardano.Ledger.Conway.Arbitrary ()

instance ExecSpecRule "GOV" ConwayEra where
  type ExecContext "GOV" ConwayEra = EnactState ConwayEra

  runAgdaRule :: HasCallStack =>
SpecTRC "GOV" ConwayEra -> Either Text (SpecState "GOV" ConwayEra)
runAgdaRule (SpecTRC SpecEnvironment "GOV" ConwayEra
env SpecState "GOV" ConwayEra
st SpecSignal "GOV" ConwayEra
sig) = ComputationResult Text GovState -> Either Text GovState
forall a. ComputationResult Text a -> Either Text a
unComputationResult (ComputationResult Text GovState -> Either Text GovState)
-> ComputationResult Text GovState -> Either Text GovState
forall a b. (a -> b) -> a -> b
$ GovEnv
-> GovState
-> [Either GovVote GovProposal]
-> ComputationResult Text GovState
Agda.govStep GovEnv
SpecEnvironment "GOV" ConwayEra
env GovState
SpecState "GOV" ConwayEra
st [Either GovVote GovProposal]
SpecSignal "GOV" ConwayEra
sig

  translateInputs :: HasCallStack =>
TRC (EraRule "GOV" ConwayEra)
-> SpecTransM
     ConwayEra (ExecContext "GOV" ConwayEra) (SpecTRC "GOV" ConwayEra)
translateInputs (TRC (env :: Environment (EraRule "GOV" ConwayEra)
env@Conway.GovEnv {PParams ConwayEra
gePParams :: PParams ConwayEra
gePParams :: forall era. GovEnv era -> PParams era
Conway.gePParams}, State (EraRule "GOV" ConwayEra)
st, Signal (EraRule "GOV" ConwayEra)
sig)) = do
    enactState <- SpecTransM ConwayEra (EnactState ConwayEra) (EnactState ConwayEra)
forall era ctx. SpecTransM era ctx ctx
askSpecTransM
    let ctx =
          EnactState ConwayEra
enactState
            EnactState ConwayEra
-> (EnactState ConwayEra -> EnactState ConwayEra)
-> EnactState ConwayEra
forall a b. a -> (a -> b) -> b
& (GovRelation StrictMaybe -> Identity (GovRelation StrictMaybe))
-> EnactState ConwayEra -> Identity (EnactState ConwayEra)
forall era (f :: * -> *).
Functor f =>
(GovRelation StrictMaybe -> f (GovRelation StrictMaybe))
-> EnactState era -> f (EnactState era)
ensPrevGovActionIdsL ((GovRelation StrictMaybe -> Identity (GovRelation StrictMaybe))
 -> EnactState ConwayEra -> Identity (EnactState ConwayEra))
-> GovRelation StrictMaybe
-> EnactState ConwayEra
-> EnactState ConwayEra
forall s t a b. ASetter s t a b -> b -> s -> t
.~ GovRelation PRoot -> GovRelation StrictMaybe
toPrevGovActionIds (Proposals ConwayEra
State (EraRule "GOV" ConwayEra)
st Proposals ConwayEra
-> Getting
     (GovRelation PRoot) (Proposals ConwayEra) (GovRelation PRoot)
-> GovRelation PRoot
forall s a. s -> Getting a s a -> a
^. Getting
  (GovRelation PRoot) (Proposals ConwayEra) (GovRelation PRoot)
forall era (f :: * -> *).
Functor f =>
(GovRelation PRoot -> f (GovRelation PRoot))
-> Proposals era -> f (Proposals era)
pRootsL)
            EnactState ConwayEra
-> (EnactState ConwayEra -> EnactState ConwayEra)
-> EnactState ConwayEra
forall a b. a -> (a -> b) -> b
& (ProtVer -> Identity ProtVer)
-> EnactState ConwayEra -> Identity (EnactState ConwayEra)
forall era. EraPParams era => Lens' (EnactState era) ProtVer
Lens' (EnactState ConwayEra) ProtVer
ensProtVerL ((ProtVer -> Identity ProtVer)
 -> EnactState ConwayEra -> Identity (EnactState ConwayEra))
-> ProtVer -> EnactState ConwayEra -> EnactState ConwayEra
forall s t a b. ASetter s t a b -> b -> s -> t
.~ (PParams ConwayEra
gePParams PParams ConwayEra
-> Getting ProtVer (PParams ConwayEra) ProtVer -> ProtVer
forall s a. s -> Getting a s a -> a
^. Getting ProtVer (PParams ConwayEra) ProtVer
forall era. EraPParams era => Lens' (PParams era) ProtVer
Lens' (PParams ConwayEra) ProtVer
ppProtocolVersionL)
    agdaEnv <- withCtxSpecTransM ctx $ toSpecRep env
    agdaSt <- withCtxSpecTransM () $ toSpecRep st
    agdaSig <- withCtxSpecTransM () $ toSpecRep sig
    pure $ SpecTRC agdaEnv agdaSt agdaSig