{-# LANGUAGE OverloadedStrings #-}

module Network.GoDaddy.ErrorTypes ( GError (GError)
                                  , Fields (Fields)
                                  ) where

import           Data.Aeson

data GError = GError { erCode          :: Maybe String
                     , erMessage       :: Maybe String
                     , erRetryAfterSec :: Maybe Integer
                     , erName          :: Maybe String
                     , erFields        :: Maybe [Fields] } deriving (Show)

instance ToJSON GError where
  toJSON (GError c m r n f) =
    object [ "code" .= c
           , "message" .= m
           , "retryAfterSec" .= r
           , "name" .= n
           , "fields" .= f ]

instance FromJSON GError where
  parseJSON (Object v) =
    GError <$> v .:? "code"
           <*> v .:? "message"
           <*> v .:? "retryAfterSec"
           <*> v .:? "name"
           <*> v .:? "fields"
  parseJSON _ = fail "Error object not found"

data Fields = Fields { fiPath        :: String
                     , fiPathRelated :: Maybe String
                     , fiCode        :: String
                     , fiMessage     :: Maybe String } deriving (Show)

instance ToJSON Fields where
  toJSON (Fields p pr c m) =
    object [ "path" .= p
           , "pathRelated" .= pr
           , "code" .= c
           , "message" .= m ]

instance FromJSON Fields where
  parseJSON (Object v) =
    Fields <$> v .: "path"
           <*> v .:? "pathRelated"
           <*> v .: "code"
           <*> v .:? "message"
  parseJSON _ = fail "Fields object not found"