{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}

module Cardano.Api.Internal.LedgerEvents.Rule.BBODY.LEDGER
  ( LatestBBodyEventConstraints
  , handleShelleyLEDGEREvents
  )
where

import Cardano.Api.Internal.LedgerEvents.LedgerEvent
import Cardano.Api.Internal.LedgerEvents.Rule.BBODY.DELEGS
import Cardano.Api.Internal.LedgerEvents.Rule.BBODY.UTXOW

import Cardano.Ledger.Alonzo.Rules
  ( AlonzoUtxoEvent (..)
  , AlonzoUtxosEvent (..)
  , AlonzoUtxowEvent (..)
  )
import Cardano.Ledger.Alonzo.Rules qualified as Alonzo
import Cardano.Ledger.Core qualified as Ledger.Core
import Cardano.Ledger.Crypto qualified as Crypto
import Cardano.Ledger.Shelley.Rules qualified as Shelley

import Control.State.Transition.Extended

type LatestBBodyEventConstraints ledgerera =
  ( Event (Ledger.Core.EraRule "BBODY" ledgerera) ~ Alonzo.AlonzoBbodyEvent ledgerera
  , Event (Ledger.Core.EraRule "LEDGERS" ledgerera) ~ Shelley.ShelleyLedgersEvent ledgerera
  , Event (Ledger.Core.EraRule "LEDGER" ledgerera) ~ Shelley.ShelleyLedgerEvent ledgerera
  , Event (Ledger.Core.EraRule "DELEGS" ledgerera) ~ Shelley.ShelleyDelegsEvent ledgerera
  , Event (Ledger.Core.EraRule "UTXOW" ledgerera) ~ AlonzoUtxowEvent ledgerera
  , Event (Ledger.Core.EraRule "UTXO" ledgerera) ~ AlonzoUtxoEvent ledgerera
  , Event (Ledger.Core.EraRule "UTXOS" ledgerera) ~ AlonzoUtxosEvent ledgerera
  )

handleShelleyLEDGEREvents
  :: Event (Ledger.Core.EraRule "UTXOW" ledgerera) ~ AlonzoUtxowEvent ledgerera
  => Event (Ledger.Core.EraRule "UTXO" ledgerera) ~ AlonzoUtxoEvent ledgerera
  => Event (Ledger.Core.EraRule "UTXOS" ledgerera) ~ AlonzoUtxosEvent ledgerera
  => Event (Ledger.Core.EraRule "DELEGS" ledgerera) ~ Shelley.ShelleyDelegsEvent ledgerera
  => Ledger.Core.EraCrypto ledgerera ~ Crypto.StandardCrypto
  => Shelley.ShelleyLedgerEvent ledgerera -> Maybe LedgerEvent
handleShelleyLEDGEREvents :: forall ledgerera.
(Event (EraRule "UTXOW" ledgerera) ~ AlonzoUtxowEvent ledgerera,
 Event (EraRule "UTXO" ledgerera) ~ AlonzoUtxoEvent ledgerera,
 Event (EraRule "UTXOS" ledgerera) ~ AlonzoUtxosEvent ledgerera,
 Event (EraRule "DELEGS" ledgerera) ~ ShelleyDelegsEvent ledgerera,
 EraCrypto ledgerera ~ StandardCrypto) =>
ShelleyLedgerEvent ledgerera -> Maybe LedgerEvent
handleShelleyLEDGEREvents ShelleyLedgerEvent ledgerera
ledgerEvent =
  case ShelleyLedgerEvent ledgerera
ledgerEvent of
    Shelley.UtxowEvent Event (EraRule "UTXOW" ledgerera)
e -> AlonzoUtxowEvent ledgerera -> Maybe LedgerEvent
forall ledgerera.
(Event (EraRule "UTXO" ledgerera) ~ AlonzoUtxoEvent ledgerera,
 Event (EraRule "UTXOS" ledgerera) ~ AlonzoUtxosEvent ledgerera,
 EraCrypto ledgerera ~ StandardCrypto) =>
AlonzoUtxowEvent ledgerera -> Maybe LedgerEvent
handleAlonzoUTxOWEvent AlonzoUtxowEvent ledgerera
Event (EraRule "UTXOW" ledgerera)
e
    Shelley.DelegsEvent Event (EraRule "DELEGS" ledgerera)
e -> ShelleyDelegsEvent ledgerera -> Maybe LedgerEvent
forall ledgerera. ShelleyDelegsEvent ledgerera -> Maybe LedgerEvent
handleShelleyDELEGSEvent Event (EraRule "DELEGS" ledgerera)
ShelleyDelegsEvent ledgerera
e