{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE StandaloneDeriving #-}

module Cardano.CLI.Compatible.Governance.Types
  ( GovernanceActionProtocolParametersUpdateCmdArgs (..)
  , UpdateProtocolParametersPreConway (..)
  , UpdateProtocolParametersConwayOnwards (..)
  , CostModelsFile (..)
  )
where

import Cardano.Api
import Cardano.Api.Experimental qualified as Exp
import Cardano.Api.Ledger qualified as L

import Cardano.CLI.Type.Common
import Cardano.CLI.Type.Key

data GovernanceActionProtocolParametersUpdateCmdArgs era
  = GovernanceActionProtocolParametersUpdateCmdArgs
  { forall era.
GovernanceActionProtocolParametersUpdateCmdArgs era
-> ShelleyBasedEra era
uppShelleyBasedEra :: !(ShelleyBasedEra era)
  , forall era.
GovernanceActionProtocolParametersUpdateCmdArgs era
-> Maybe (UpdateProtocolParametersPreConway era)
uppPreConway :: !(Maybe (UpdateProtocolParametersPreConway era))
  , forall era.
GovernanceActionProtocolParametersUpdateCmdArgs era
-> Maybe (UpdateProtocolParametersConwayOnwards era)
uppConwayOnwards :: !(Maybe (UpdateProtocolParametersConwayOnwards era))
  , forall era.
GovernanceActionProtocolParametersUpdateCmdArgs era
-> EraBasedProtocolParametersUpdate era
uppNewPParams :: !(EraBasedProtocolParametersUpdate era)
  -- ^ New parameters to be proposed. From Alonzo onwards, the type
  -- 'EraBasedProtocolParametersUpdate' also contains cost models. Since all
  -- other protocol parameters are read from command line arguments, whereas
  -- the cost models are read from a file, we separate the cost models from
  -- the rest of the protocol parameters to ease parsing.
  , forall era.
GovernanceActionProtocolParametersUpdateCmdArgs era
-> Maybe (CostModelsFile era)
uppCostModelsFile :: !(Maybe (CostModelsFile era))
  -- ^ The new cost models proposed. See the comment at 'uppNewPParams' for
  -- why this is a separate field.
  , forall era.
GovernanceActionProtocolParametersUpdateCmdArgs era -> File () 'Out
uppFilePath :: !(File () Out)
  }
  deriving Int -> GovernanceActionProtocolParametersUpdateCmdArgs era -> ShowS
[GovernanceActionProtocolParametersUpdateCmdArgs era] -> ShowS
GovernanceActionProtocolParametersUpdateCmdArgs era -> String
(Int
 -> GovernanceActionProtocolParametersUpdateCmdArgs era -> ShowS)
-> (GovernanceActionProtocolParametersUpdateCmdArgs era -> String)
-> ([GovernanceActionProtocolParametersUpdateCmdArgs era] -> ShowS)
-> Show (GovernanceActionProtocolParametersUpdateCmdArgs era)
forall era.
Int -> GovernanceActionProtocolParametersUpdateCmdArgs era -> ShowS
forall era.
[GovernanceActionProtocolParametersUpdateCmdArgs era] -> ShowS
forall era.
GovernanceActionProtocolParametersUpdateCmdArgs era -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall era.
Int -> GovernanceActionProtocolParametersUpdateCmdArgs era -> ShowS
showsPrec :: Int -> GovernanceActionProtocolParametersUpdateCmdArgs era -> ShowS
$cshow :: forall era.
GovernanceActionProtocolParametersUpdateCmdArgs era -> String
show :: GovernanceActionProtocolParametersUpdateCmdArgs era -> String
$cshowList :: forall era.
[GovernanceActionProtocolParametersUpdateCmdArgs era] -> ShowS
showList :: [GovernanceActionProtocolParametersUpdateCmdArgs era] -> ShowS
Show

data UpdateProtocolParametersPreConway era
  = UpdateProtocolParametersPreConway
  { forall era.
UpdateProtocolParametersPreConway era -> ShelleyToBabbageEra era
eon :: !(ShelleyToBabbageEra era)
  , forall era. UpdateProtocolParametersPreConway era -> EpochNo
expiryEpoch :: !EpochNo
  , forall era.
UpdateProtocolParametersPreConway era -> [VerificationKeyFile 'In]
genesisVerificationKeys :: ![VerificationKeyFile In]
  }

deriving instance Show (UpdateProtocolParametersPreConway era)

data UpdateProtocolParametersConwayOnwards era
  = UpdateProtocolParametersConwayOnwards
  { forall era. UpdateProtocolParametersConwayOnwards era -> Era era
era :: !(Exp.Era era)
  , forall era. UpdateProtocolParametersConwayOnwards era -> Network
networkId :: !L.Network
  , forall era. UpdateProtocolParametersConwayOnwards era -> Lovelace
deposit :: !Lovelace
  , forall era.
UpdateProtocolParametersConwayOnwards era -> StakeIdentifier
returnAddr :: !StakeIdentifier
  , forall era.
UpdateProtocolParametersConwayOnwards era -> ProposalUrl
proposalUrl :: !ProposalUrl
  , forall era.
UpdateProtocolParametersConwayOnwards era -> SafeHash AnchorData
proposalHash :: !(L.SafeHash L.AnchorData)
  , forall era.
UpdateProtocolParametersConwayOnwards era
-> MustCheckHash ProposalUrl
checkProposalHash :: !(MustCheckHash ProposalUrl)
  , forall era.
UpdateProtocolParametersConwayOnwards era -> Maybe GovActionId
governanceActionId :: !(Maybe L.GovActionId)
  , forall era.
UpdateProtocolParametersConwayOnwards era -> Maybe ScriptHash
constitutionScriptHash :: !(Maybe ScriptHash)
  }

deriving instance Show (UpdateProtocolParametersConwayOnwards era)

data CostModelsFile era
  = CostModelsFile
  { forall era. CostModelsFile era -> AlonzoEraOnwards era
eon :: !(AlonzoEraOnwards era)
  , forall era. CostModelsFile era -> File CostModels 'In
costModelsFile :: !(File L.CostModels In)
  }
  deriving Int -> CostModelsFile era -> ShowS
[CostModelsFile era] -> ShowS
CostModelsFile era -> String
(Int -> CostModelsFile era -> ShowS)
-> (CostModelsFile era -> String)
-> ([CostModelsFile era] -> ShowS)
-> Show (CostModelsFile era)
forall era. Int -> CostModelsFile era -> ShowS
forall era. [CostModelsFile era] -> ShowS
forall era. CostModelsFile era -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall era. Int -> CostModelsFile era -> ShowS
showsPrec :: Int -> CostModelsFile era -> ShowS
$cshow :: forall era. CostModelsFile era -> String
show :: CostModelsFile era -> String
$cshowList :: forall era. [CostModelsFile era] -> ShowS
showList :: [CostModelsFile era] -> ShowS
Show