{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE OverloadedStrings #-}
module Network.Bugsnag.Severity
    ( BugsnagSeverity(..)
    , BugsnagSeverityReason(..)
    , BugsnagSeverityReasonAttributes(..)
    , bugsnagSeverityReasonAttributes
    , BugsnagSeverityReasonType(..)
    ) where

import Data.Aeson
import Data.Aeson.Ext
import Data.Text (Text)
import GHC.Generics

data BugsnagSeverity
    = ErrorSeverity
    | WarningSeverity
    | InfoSeverity
    deriving Generic

instance ToJSON BugsnagSeverity where
    toJSON = genericToJSON $ bsAesonOptions "Severity"
    toEncoding = genericToEncoding $ bsAesonOptions "Severity"

data BugsnagSeverityReasonType
    = UnhandledExceptionReasonType
    | UnhandledErrorReasonType
    | LogReasonType
    | SignalReasonType
    | StrictModeReasonType
    | UnhandledPromiseRejectionReasonType
    | CallbackErrorInterceptReasonType
    | ErrorClassReasonType
    | UnhandledPanicReasonType
    | UserCallbackSetSeverityReasonType
    | UserSpecifiedSeverityReasonType
    | HandledExceptionReasonType
    | HandledErrorReasonType
    | HandledPanicReasonType
    | UserContextSetSeverityReasonType
    deriving Generic

instance ToJSON BugsnagSeverityReasonType where
    toJSON = genericToJSON $ bsAesonOptions "ReasonType"
    toEncoding = genericToEncoding $ bsAesonOptions "ReasonType"

data BugsnagSeverityReasonAttributes = BugsnagSeverityReasonAttributes
    { bsraErrorType :: Maybe Text
    , bsraLevel :: Maybe Text
    , bsraSignalType :: Maybe Text
    , bsraViolationType :: Maybe Text
    , bsraErrorClass :: Maybe Text
    }
    deriving Generic

instance ToJSON BugsnagSeverityReasonAttributes where
    toJSON = genericToJSON $ bsAesonOptions "bsra"
    toEncoding = genericToEncoding $ bsAesonOptions "bsra"

data BugsnagSeverityReason = BugsnagSeverityReason
    { bsrType :: BugsnagSeverityReasonType
    , bsrAttributes :: BugsnagSeverityReasonAttributes
    }
    deriving Generic

instance ToJSON BugsnagSeverityReason where
    toJSON = genericToJSON $ bsAesonOptions "bsr"
    toEncoding = genericToEncoding $ bsAesonOptions "bsr"

bugsnagSeverityReasonAttributes :: BugsnagSeverityReasonAttributes
bugsnagSeverityReasonAttributes = BugsnagSeverityReasonAttributes
    { bsraErrorType = Nothing
    , bsraLevel = Nothing
    , bsraSignalType = Nothing
    , bsraViolationType = Nothing
    , bsraErrorClass = Nothing
    }