{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE LambdaCase #-}

module Cardano.CLI.EraBased.Governance.Vote.Command
  ( GovernanceVoteCmds (..)
  , GovernanceVoteViewCmdArgs (..)
  , GovernanceVoteCreateCmdArgs (..)
  , renderGovernanceVoteCmds
  )
where

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

import Cardano.CLI.Type.Common
import Cardano.CLI.Type.Governance

import Data.Text (Text)
import Vary (Vary)

data GovernanceVoteCmds era
  = GovernanceVoteCreateCmd
      (GovernanceVoteCreateCmdArgs era)
  | GovernanceVoteViewCmd
      (GovernanceVoteViewCmdArgs era)

data GovernanceVoteCreateCmdArgs era
  = GovernanceVoteCreateCmdArgs
  { forall era. GovernanceVoteCreateCmdArgs era -> Era era
era :: Exp.Era era
  , forall era. GovernanceVoteCreateCmdArgs era -> Vote
voteChoice :: Vote
  , forall era. GovernanceVoteCreateCmdArgs era -> GovActionId
governanceActionId :: L.GovActionId
  , forall era.
GovernanceVoteCreateCmdArgs era
-> AnyVotingStakeVerificationKeyOrHashOrFile
votingStakeCredentialSource :: AnyVotingStakeVerificationKeyOrHashOrFile
  , forall era.
GovernanceVoteCreateCmdArgs era
-> Maybe
     (PotentiallyCheckedAnchor VoteUrl (VoteUrl, SafeHash AnchorData))
mAnchor
      :: !( Maybe
              ( PotentiallyCheckedAnchor
                  VoteUrl
                  (VoteUrl, L.SafeHash L.AnchorData)
              )
          )
  , forall era. GovernanceVoteCreateCmdArgs era -> VoteFile 'Out
outFile :: VoteFile Out
  }

data GovernanceVoteViewCmdArgs era
  = GovernanceVoteViewCmdArgs
  { forall era. GovernanceVoteViewCmdArgs era -> Era era
era :: Exp.Era era
  , forall era. GovernanceVoteViewCmdArgs era -> VoteFile 'In
voteFile :: VoteFile In
  , forall era.
GovernanceVoteViewCmdArgs era -> Vary '[FormatJson, FormatYaml]
outputFormat :: !(Vary [FormatJson, FormatYaml])
  , forall era. GovernanceVoteViewCmdArgs era -> Maybe (File () 'Out)
mOutFile :: Maybe (File () Out)
  }

renderGovernanceVoteCmds
  :: ()
  => GovernanceVoteCmds era
  -> Text
renderGovernanceVoteCmds :: forall era. GovernanceVoteCmds era -> Text
renderGovernanceVoteCmds = \case
  GovernanceVoteCreateCmd{} ->
    Text
"governance vote create"
  GovernanceVoteViewCmd{} ->
    Text
"governance vote view"