{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE OverloadedStrings #-}
module Network.Bugsnag.Breadcrumb
    ( BugsnagBreadcrumbType(..)
    , BugsnagBreadcrumb(..)
    , bugsnagBreadcrumb
    ) where

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

data BugsnagBreadcrumbType
    = NavigationBreadcrumb
    | RequestBreadcrumb
    | ProcessBreadcrumb
    | LogBreadcrumb
    | UserBreadcrumb
    | StateBreadcrumb
    | ErrorBreadcrumb
    | ManualBreadcrumb
    deriving Generic

instance ToJSON BugsnagBreadcrumbType where
    toJSON = genericToJSON $ bsAesonOptions "Breadcrumb"
    toEncoding = genericToEncoding $ bsAesonOptions "Breadcrumb"

data BugsnagBreadcrumb = BugsnagBreadcrumb
    { bbTimestamp :: UTCTime
    , bbName :: Text
    , bbType :: BugsnagBreadcrumbType
    , bbMetaData :: Maybe Value
    }
    deriving Generic

instance ToJSON BugsnagBreadcrumb where
    toJSON = genericToJSON $ bsAesonOptions "bb"
    toEncoding = genericToEncoding $ bsAesonOptions "bb"

bugsnagBreadcrumb
    :: UTCTime
    -> Text
    -> BugsnagBreadcrumbType
    -> BugsnagBreadcrumb
bugsnagBreadcrumb timestamp name typ = BugsnagBreadcrumb
    { bbTimestamp = timestamp
    , bbName = name
    , bbType = typ
    , bbMetaData = Nothing
    }