module Cooked.Skeleton.Withdrawal
  ( TxSkelWithdrawals,
    pkWithdrawal,
    scriptWithdrawal,
  )
where

import Cooked.Conversion
import Cooked.Skeleton.Redeemer as X
import Data.Map (Map)
import Data.Map qualified as Map
import Plutus.Script.Utils.Ada qualified as Script
import Plutus.Script.Utils.Scripts qualified as Script
import PlutusLedgerApi.V3 qualified as Api

-- | Withdrawals associate either a script or a private key with a redeemer and
-- a certain amount of ada. Note that the redeemer will be ignored in the case
-- of a private key.
type TxSkelWithdrawals =
  Map
    (Either (Script.Versioned Script.Script) Api.PubKeyHash)
    (TxSkelRedeemer, Script.Ada)

pkWithdrawal :: (ToPubKeyHash pkh) => pkh -> Script.Ada -> TxSkelWithdrawals
pkWithdrawal :: forall pkh. ToPubKeyHash pkh => pkh -> Ada -> TxSkelWithdrawals
pkWithdrawal pkh
pkh Ada
amount = Either (Versioned Script) PubKeyHash
-> (TxSkelRedeemer, Ada) -> TxSkelWithdrawals
forall k a. k -> a -> Map k a
Map.singleton (PubKeyHash -> Either (Versioned Script) PubKeyHash
forall a b. b -> Either a b
Right (PubKeyHash -> Either (Versioned Script) PubKeyHash)
-> PubKeyHash -> Either (Versioned Script) PubKeyHash
forall a b. (a -> b) -> a -> b
$ pkh -> PubKeyHash
forall a. ToPubKeyHash a => a -> PubKeyHash
toPubKeyHash pkh
pkh) (TxSkelRedeemer
emptyTxSkelRedeemer, Ada
amount)

scriptWithdrawal :: (ToVersionedScript script) => script -> TxSkelRedeemer -> Script.Ada -> TxSkelWithdrawals
scriptWithdrawal :: forall script.
ToVersionedScript script =>
script -> TxSkelRedeemer -> Ada -> TxSkelWithdrawals
scriptWithdrawal script
script TxSkelRedeemer
red Ada
amount = Either (Versioned Script) PubKeyHash
-> (TxSkelRedeemer, Ada) -> TxSkelWithdrawals
forall k a. k -> a -> Map k a
Map.singleton (Versioned Script -> Either (Versioned Script) PubKeyHash
forall a b. a -> Either a b
Left (Versioned Script -> Either (Versioned Script) PubKeyHash)
-> Versioned Script -> Either (Versioned Script) PubKeyHash
forall a b. (a -> b) -> a -> b
$ script -> Versioned Script
forall a. ToVersionedScript a => a -> Versioned Script
toVersionedScript script
script) (TxSkelRedeemer
red, Ada
amount)