{-# LANGUAGE DataKinds #-}
{-# LANGUAGE LambdaCase #-}

module Cardano.CLI.Compatible.Governance.Command
  ( CompatibleGovernanceCmds (..)
  , renderCompatibleGovernanceCmds
  )
where

import Cardano.Api

import Cardano.CLI.EraBased.Governance.Actions.Command
import Cardano.CLI.EraBased.Governance.Option
import Cardano.CLI.Type.Key (VerificationKeyOrHashOrFile)

import Data.Text

-- TODO: After QA confirmms that the new compatibility commands meet their needs
-- we can remove all remaining legacy commands. We can also remove/move the exising
-- byron era commands under the new compatiblilty commands.
data CompatibleGovernanceCmds era
  = CreateCompatibleProtocolParametersUpdateCmd (GovernanceActionCmds era)
  | CompatibleCreateMirCertificateStakeAddressesCmd
      (ShelleyToBabbageEra era)
      MIRPot
      [StakeAddress]
      [Coin]
      (File () Out)
  | CompatibleCreateMirCertificateTransferToReservesCmd
      (ShelleyToBabbageEra era)
      Coin
      (File () Out)
  | CompatibleCreateMirCertificateTransferToTreasuryCmd
      (ShelleyToBabbageEra era)
      Coin
      (File () Out)
  | CompatibleGenesisKeyDelegationCertificate
      (ShelleyToBabbageEra era)
      (VerificationKeyOrHashOrFile GenesisKey)
      (VerificationKeyOrHashOrFile GenesisDelegateKey)
      (VerificationKeyOrHashOrFile VrfKey)
      (File () Out)
  | LatestCompatibleGovernanceCmds (GovernanceCmds era)

renderCompatibleGovernanceCmds :: CompatibleGovernanceCmds era -> Text
renderCompatibleGovernanceCmds :: forall era. CompatibleGovernanceCmds era -> Text
renderCompatibleGovernanceCmds = \case
  CreateCompatibleProtocolParametersUpdateCmd GovernanceActionCmds era
cmd ->
    GovernanceActionCmds era -> Text
forall era. GovernanceActionCmds era -> Text
renderGovernanceActionCmds GovernanceActionCmds era
cmd
  CompatibleGenesisKeyDelegationCertificate{} ->
    Text
"governance create-genesis-key-delegation-certificate"
  CompatibleCreateMirCertificateStakeAddressesCmd{} ->
    Text
"governance create-mir-certificate stake-addresses"
  CompatibleCreateMirCertificateTransferToReservesCmd{} ->
    Text
"governance create-mir-certificate transfer-to-reserves"
  CompatibleCreateMirCertificateTransferToTreasuryCmd{} ->
    Text
"governance create-mir-certificate transfer-to-treasury"
  LatestCompatibleGovernanceCmds GovernanceCmds era
cmd -> GovernanceCmds era -> Text
forall era. GovernanceCmds era -> Text
renderGovernanceCmds GovernanceCmds era
cmd