{-# LANGUAGE DeriveAnyClass             #-}
{-# LANGUAGE DeriveGeneric              #-}
{-# LANGUAGE TypeFamilies               #-}

module Gargantext.Utils.UTCTime where

import Data.Aeson (FromJSON, ToJSON)
import Data.Either (Either(..))
import Data.Morpheus.Kind (SCALAR)
import Data.Morpheus.Types (GQLType(..), DecodeScalar(..), EncodeScalar(..))
import qualified Data.Morpheus.Types as DMT
import Data.Swagger (ToSchema)
import qualified Data.Text as T
import Data.Time (UTCTime)
import Gargantext.Prelude
import GHC.Generics (Generic)
import Text.Read (readEither)


newtype NUTCTime = NUTCTime UTCTime
  deriving (Eq, Show, Generic)
instance DecodeScalar NUTCTime where
  decodeScalar (DMT.String x) = case (readEither $ T.unpack x) of
    Right r  -> pure $ NUTCTime r
    Left err -> Left $ T.pack err
  decodeScalar          _ = Left "Invalid value for NUTCTime"
instance EncodeScalar NUTCTime where
  encodeScalar (NUTCTime x) = DMT.String $ T.pack $ show x
instance GQLType NUTCTime where
  type KIND NUTCTime = SCALAR
instance FromJSON NUTCTime
instance ToJSON NUTCTime
instance ToSchema NUTCTime