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

module Cardano.Api.LedgerEvents.Rule.BBODY.UTXOW
  ( handleAlonzoOnwardsUTxOWEvent
  , handleAllegraMaryUTxOWEvent
  , handlePreAlonzoUTxOWEvent
  )
where

import           Cardano.Api.LedgerEvents.LedgerEvent

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

import           Control.State.Transition.Extended

handleAlonzoOnwardsUTxOWEvent
  :: Event (Ledger.Core.EraRule "UTXO" ledgerera) ~ AlonzoUtxoEvent ledgerera
  => Event (Ledger.Core.EraRule "UTXOS" ledgerera) ~ AlonzoUtxosEvent ledgerera
  => Ledger.Core.EraCrypto ledgerera ~ Crypto.StandardCrypto
  => AlonzoUtxowEvent ledgerera -> Maybe LedgerEvent
handleAlonzoOnwardsUTxOWEvent :: forall ledgerera.
(Event (EraRule "UTXO" ledgerera) ~ AlonzoUtxoEvent ledgerera,
 Event (EraRule "UTXOS" ledgerera) ~ AlonzoUtxosEvent ledgerera,
 EraCrypto ledgerera ~ StandardCrypto) =>
AlonzoUtxowEvent ledgerera -> Maybe LedgerEvent
handleAlonzoOnwardsUTxOWEvent (WrappedShelleyEraEvent (Shelley.UtxoEvent (UtxosEvent Event (EraRule "UTXOS" ledgerera)
utxoEvent))) =
  case Event (EraRule "UTXOS" ledgerera)
utxoEvent of
    Alonzo.AlonzoPpupToUtxosEvent{} -> Maybe LedgerEvent
forall a. Maybe a
Nothing
    Alonzo.TotalDeposits{} -> Maybe LedgerEvent
forall a. Maybe a
Nothing
    Alonzo.SuccessfulPlutusScriptsEvent NonEmpty (PlutusWithContext (EraCrypto ledgerera))
e -> LedgerEvent -> Maybe LedgerEvent
forall a. a -> Maybe a
Just (LedgerEvent -> Maybe LedgerEvent)
-> LedgerEvent -> Maybe LedgerEvent
forall a b. (a -> b) -> a -> b
$ NonEmpty (PlutusWithContext StandardCrypto) -> LedgerEvent
SuccessfulPlutusScript NonEmpty (PlutusWithContext (EraCrypto ledgerera))
NonEmpty (PlutusWithContext StandardCrypto)
e
    Alonzo.FailedPlutusScriptsEvent NonEmpty (PlutusWithContext (EraCrypto ledgerera))
e -> LedgerEvent -> Maybe LedgerEvent
forall a. a -> Maybe a
Just (LedgerEvent -> Maybe LedgerEvent)
-> LedgerEvent -> Maybe LedgerEvent
forall a b. (a -> b) -> a -> b
$ NonEmpty (PlutusWithContext StandardCrypto) -> LedgerEvent
FailedPlutusScript NonEmpty (PlutusWithContext (EraCrypto ledgerera))
NonEmpty (PlutusWithContext StandardCrypto)
e
    Alonzo.TxUTxODiff UTxO ledgerera
_ UTxO ledgerera
_ -> Maybe LedgerEvent
forall a. Maybe a
Nothing

handlePreAlonzoUTxOWEvent
  :: Event (Ledger.Core.EraRule "UTXO" ledgerera) ~ Shelley.UtxoEvent ledgerera
  => Event (Ledger.Core.EraRule "PPUP" ledgerera) ~ Shelley.PpupEvent ledgerera
  => Shelley.ShelleyUtxowEvent ledgerera -> Maybe LedgerEvent
handlePreAlonzoUTxOWEvent :: forall ledgerera.
(Event (EraRule "UTXO" ledgerera) ~ UtxoEvent ledgerera,
 Event (EraRule "PPUP" ledgerera) ~ PpupEvent ledgerera) =>
ShelleyUtxowEvent ledgerera -> Maybe LedgerEvent
handlePreAlonzoUTxOWEvent (Shelley.UtxoEvent Event (EraRule "UTXO" ledgerera)
e) =
  case Event (EraRule "UTXO" ledgerera)
e of
    Shelley.TotalDeposits{} -> Maybe LedgerEvent
forall a. Maybe a
Nothing
    Shelley.UpdateEvent (Shelley.PpupNewEpoch EpochNo
_) -> Maybe LedgerEvent
forall a. Maybe a
Nothing
    Shelley.TxUTxODiff UTxO ledgerera
_ UTxO ledgerera
_ -> Maybe LedgerEvent
forall a. Maybe a
Nothing

handleAllegraMaryUTxOWEvent
  :: Event (Ledger.Core.EraRule "UTXO" ledgerera) ~ Allegra.AllegraUtxoEvent ledgerera
  => Event (Ledger.Core.EraRule "PPUP" ledgerera) ~ Shelley.PpupEvent ledgerera
  => Shelley.ShelleyUtxowEvent ledgerera -> Maybe LedgerEvent
handleAllegraMaryUTxOWEvent :: forall ledgerera.
(Event (EraRule "UTXO" ledgerera) ~ AllegraUtxoEvent ledgerera,
 Event (EraRule "PPUP" ledgerera) ~ PpupEvent ledgerera) =>
ShelleyUtxowEvent ledgerera -> Maybe LedgerEvent
handleAllegraMaryUTxOWEvent (Shelley.UtxoEvent Event (EraRule "UTXO" ledgerera)
e) =
  case Event (EraRule "UTXO" ledgerera)
e of
    Allegra.TotalDeposits{} -> Maybe LedgerEvent
forall a. Maybe a
Nothing
    Allegra.UpdateEvent (Shelley.PpupNewEpoch EpochNo
_) -> Maybe LedgerEvent
forall a. Maybe a
Nothing
    Allegra.TxUTxODiff UTxO ledgerera
_ UTxO ledgerera
_ -> Maybe LedgerEvent
forall a. Maybe a
Nothing