module Hydra.Contract.HeadError (
  errorCode,
  module Hydra.Contract.HeadError,
) where

import Hydra.Contract.Error (ToErrorCode (..), errorCode)

data HeadError
  = InvalidHeadStateTransition
  | ChangedParameters
  | WrongStateInOutputDatum
  | HeadValueIsNotPreserved
  | SignerIsNotAParticipant
  | NoSigners
  | TooManySigners
  | ScriptNotSpendingAHeadInput
  | NoOutputDatumError
  | UnexpectedNonInlineDatum
  | NotPayingToHead
  | SignatureVerificationFailed
  | MustNotChangeVersion
  | BurntTokenNumberMismatch
  | VersionNotIncremented
  | HasBoundedValidityCheckFailed
  | IncorrectClosedContestationDeadline
  | InfiniteUpperBound
  | InfiniteLowerBound
  | ContestersNonEmpty
  | CloseNoUpperBoundDefined
  | FailedCloseInitial
  | FailedCloseAny
  | TooOldSnapshot
  | UpperBoundBeyondContestationDeadline
  | ContestNoUpperBoundDefined
  | MustNotPushDeadline
  | MustPushDeadline
  | ContesterNotIncluded
  | WrongNumberOfSigners
  | SignerAlreadyContested
  | FailedContestUnused
  | FailedContestUsed
  | FanoutUTxOHashMismatch
  | LowerBoundBeforeContestationDeadline
  | FanoutNoLowerBoundDefined
  | DepositNotSpent
  | DepositInputNotFound
  | HeadInputNotFound
  | FailedCloseUnused
  | FailedCloseUsed
  | MissingCRSDatum
  | MissingCRSRefInput
  | PartialFanoutMembershipFailed
  | PartialFanoutChangedParameters
  | AccumulatorCommitmentHashMismatch
  | FinalPartialFanoutMembershipFailed
  | FinalPartialFanoutZeroOutputs
  | PartialFanoutZeroOutputs
  | PartialFanoutCannotBeLastBatch
  | ChangedHeadAdaOverhead
  | DepositDatumInvalid
  | InvalidCRSDatum
  | DepositNotFirstOutput
  | DecrementZeroOutputs
  | MustNotSpendOtherScripts

instance ToErrorCode HeadError where
  toErrorCode :: HeadError -> Text
toErrorCode = \case
    -- Generic
    HeadError
InvalidHeadStateTransition -> Text
"H1"
    HeadError
ChangedParameters -> Text
"H2"
    HeadError
WrongStateInOutputDatum -> Text
"H3"
    HeadError
HeadValueIsNotPreserved -> Text
"H4"
    HeadError
SignerIsNotAParticipant -> Text
"H5"
    HeadError
NoSigners -> Text
"H6"
    HeadError
TooManySigners -> Text
"H7"
    HeadError
ScriptNotSpendingAHeadInput -> Text
"H8"
    HeadError
NoOutputDatumError -> Text
"H9"
    HeadError
UnexpectedNonInlineDatum -> Text
"H10"
    HeadError
NotPayingToHead -> Text
"H11"
    HeadError
SignatureVerificationFailed -> Text
"H12"
    HeadError
MustNotChangeVersion -> Text
"H13"
    HeadError
BurntTokenNumberMismatch -> Text
"H14"
    -- Decrement
    HeadError
VersionNotIncremented -> Text
"H21"
    -- Close
    HeadError
HasBoundedValidityCheckFailed -> Text
"H22"
    HeadError
IncorrectClosedContestationDeadline -> Text
"H23"
    HeadError
InfiniteUpperBound -> Text
"H24"
    HeadError
InfiniteLowerBound -> Text
"H25"
    HeadError
ContestersNonEmpty -> Text
"H26"
    HeadError
CloseNoUpperBoundDefined -> Text
"H27"
    HeadError
FailedCloseInitial -> Text
"H28"
    -- Contest
    HeadError
TooOldSnapshot -> Text
"H29"
    HeadError
UpperBoundBeyondContestationDeadline -> Text
"H30"
    HeadError
ContestNoUpperBoundDefined -> Text
"H31"
    HeadError
MustNotPushDeadline -> Text
"H32"
    HeadError
MustPushDeadline -> Text
"H33"
    HeadError
ContesterNotIncluded -> Text
"H34"
    HeadError
WrongNumberOfSigners -> Text
"H35"
    HeadError
SignerAlreadyContested -> Text
"H36"
    HeadError
FailedContestUnused -> Text
"H37"
    HeadError
FailedContestUsed -> Text
"H38"
    -- Fanout
    HeadError
FanoutUTxOHashMismatch -> Text
"H39"
    HeadError
LowerBoundBeforeContestationDeadline -> Text
"H41"
    HeadError
FanoutNoLowerBoundDefined -> Text
"H42"
    HeadError
DepositNotSpent -> Text
"H43"
    HeadError
DepositInputNotFound -> Text
"H44"
    HeadError
HeadInputNotFound -> Text
"H45"
    HeadError
FailedCloseAny -> Text
"H46"
    HeadError
FailedCloseUnused -> Text
"H47"
    HeadError
FailedCloseUsed -> Text
"H48"
    HeadError
MissingCRSDatum -> Text
"H55"
    HeadError
MissingCRSRefInput -> Text
"H56"
    -- PartialFanout
    HeadError
PartialFanoutMembershipFailed -> Text
"H57"
    HeadError
PartialFanoutChangedParameters -> Text
"H58"
    HeadError
AccumulatorCommitmentHashMismatch -> Text
"H59"
    HeadError
FinalPartialFanoutMembershipFailed -> Text
"H60"
    HeadError
FinalPartialFanoutZeroOutputs -> Text
"H62"
    HeadError
PartialFanoutZeroOutputs -> Text
"H63"
    HeadError
PartialFanoutCannotBeLastBatch -> Text
"H64"
    HeadError
ChangedHeadAdaOverhead -> Text
"H65"
    HeadError
DepositDatumInvalid -> Text
"H67"
    HeadError
InvalidCRSDatum -> Text
"H68"
    HeadError
DepositNotFirstOutput -> Text
"H69"
    HeadError
DecrementZeroOutputs -> Text
"H70"
    HeadError
MustNotSpendOtherScripts -> Text
"H71"