{-# LANGUAGE DeriveGeneric   #-}
{-# LANGUAGE KindSignatures  #-}
{-# LANGUAGE TemplateHaskell #-}

module Data.Morpheus.Types.Types
  ( GQLQueryRoot(..)
  , Variables
  , Undefined(..)
  ) where

import           Data.Map                                      (Map)
import           GHC.Generics                                  (Generic)
import           Language.Haskell.TH.Syntax                    (Lift (..))

-- Morpheus
import           Data.Morpheus.Types.Internal.AST.Operation    (RawOperation)
import           Data.Morpheus.Types.Internal.AST.RawSelection (FragmentLib)
import           Data.Morpheus.Types.Internal.Base             (Key)
import           Data.Morpheus.Types.Internal.TH               (apply, liftTextMap)
import           Data.Morpheus.Types.Internal.Value            (Value)

data Undefined (m :: * -> *) = Undefined deriving (Show, Generic)

type Variables = Map Key Value

data GQLQueryRoot = GQLQueryRoot
  { fragments      :: FragmentLib
  , operation      :: RawOperation
  , inputVariables :: [(Key, Value)]
  } deriving (Show)

instance Lift GQLQueryRoot where
  lift (GQLQueryRoot f o v) = apply 'GQLQueryRoot [liftTextMap f, lift o, liftTextMap v]