{-# LANGUAGE NamedFieldPuns #-}

module Data.Morpheus.Error.Utils
  ( errorMessage
  , globalErrorMessage
  , renderErrors
  , badRequestError
  , toLocation
  ) where

import           Data.ByteString.Lazy.Char8              (ByteString, pack)
import           Data.Morpheus.Types.Internal.Base       (Position)
import           Data.Morpheus.Types.Internal.Validation (GQLError (..), GQLErrors, JSONError (..), Location (..))
import           Data.Text                               (Text)
import           Text.Megaparsec                         (SourcePos (SourcePos), sourceColumn, sourceLine, unPos)

errorMessage :: Position -> Text -> GQLErrors
errorMessage position text = [GQLError {desc = text, positions = [position]}]

globalErrorMessage :: Text -> GQLErrors
globalErrorMessage text = [GQLError {desc = text, positions = []}]

renderErrors :: [GQLError] -> [JSONError]
renderErrors = map renderError

renderError :: GQLError -> JSONError
renderError GQLError {desc, positions} = JSONError {message = desc, locations = positions}

toLocation :: SourcePos -> Location
toLocation SourcePos {sourceLine, sourceColumn} = Location {line = unPos sourceLine, column = unPos sourceColumn}

badRequestError :: String -> ByteString
badRequestError aesonError' = pack $ "Bad Request. Could not decode Request body: " ++ aesonError'