{-# LANGUAGE DataKinds #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}

module Cardano.CLI.EraBased.Governance.GenesisKeyDelegationCertificate.Run
  ( runGovernanceGenesisKeyDelegationCertificate
  )
where

import Cardano.Api hiding (makeGenesisKeyDelegationCertificate)
import Cardano.Api.Compatible.Certificate

import Cardano.CLI.Compatible.Exception
import Cardano.CLI.Type.Key

runGovernanceGenesisKeyDelegationCertificate
  :: VerificationKeyOrHashOrFile GenesisKey
  -> VerificationKeyOrHashOrFile GenesisDelegateKey
  -> VerificationKeyOrHashOrFile VrfKey
  -> File () Out
  -> CIO e ()
runGovernanceGenesisKeyDelegationCertificate :: forall e.
VerificationKeyOrHashOrFile GenesisKey
-> VerificationKeyOrHashOrFile GenesisDelegateKey
-> VerificationKeyOrHashOrFile VrfKey
-> File () 'Out
-> CIO e ()
runGovernanceGenesisKeyDelegationCertificate
  VerificationKeyOrHashOrFile GenesisKey
genVkOrHashOrFp
  VerificationKeyOrHashOrFile GenesisDelegateKey
genDelVkOrHashOrFp
  VerificationKeyOrHashOrFile VrfKey
vrfVkOrHashOrFp
  File () 'Out
oFp = do
    genesisVkHash <-
      VerificationKeyOrHashOrFile GenesisKey -> CIO e (Hash GenesisKey)
forall keyrole e.
Key keyrole =>
VerificationKeyOrHashOrFile keyrole -> CIO e (Hash keyrole)
readVerificationKeyOrHashOrTextEnvFile VerificationKeyOrHashOrFile GenesisKey
genVkOrHashOrFp
    genesisDelVkHash <-
      readVerificationKeyOrHashOrTextEnvFile genDelVkOrHashOrFp
    vrfVkHash <-
      readVerificationKeyOrHashOrFile vrfVkOrHashOrFp

    let genKeyDelegCert = Hash GenesisKey
-> Hash GenesisDelegateKey
-> Hash VrfKey
-> Certificate (ShelleyLedgerEra BabbageEra)
makeGenesisKeyDelegationCertificate Hash GenesisKey
genesisVkHash Hash GenesisDelegateKey
genesisDelVkHash Hash VrfKey
vrfVkHash

    fromEitherIOCli @(FileError ()) $
      writeLazyByteStringFile oFp $
        textEnvelopeToJSON (Just genKeyDelegCertDesc) genKeyDelegCert
   where
    genKeyDelegCertDesc :: TextEnvelopeDescr
    genKeyDelegCertDesc :: TextEnvelopeDescr
genKeyDelegCertDesc = TextEnvelopeDescr
"Genesis Key Delegation Certificate"