module Data.Morpheus.Parser.Arguments
  ( arguments
  ) where

import           Control.Applicative                    ((<|>))
import           Data.Attoparsec.Text                   (Parser, char, sepBy, skipSpace)
import           Data.Morpheus.Parser.Primitive         (getPosition, jsBool, jsNumber, jsString, token, variable)
import           Data.Morpheus.Types.JSType             (JSType (JSEnum))
import           Data.Morpheus.Types.Query.RawSelection (RawArgument (..), RawArguments)
import           Data.Text                              (Text)

enum :: Parser JSType
enum = JSEnum <$> token

argumentType :: Parser RawArgument
argumentType = do
  pos <- getPosition
  arg <- jsString <|> jsNumber <|> jsBool <|> enum
  pure $ Argument arg pos

variableType :: Parser RawArgument
variableType = do
  pos <- getPosition
  val <- variable
  pure $ VariableReference val pos

inputValue :: Parser RawArgument
inputValue = skipSpace *> argumentType <|> variableType

parameter :: Parser (Text, RawArgument)
parameter = do
  skipSpace
  key <- token
  skipSpace
  _ <- char ':'
  skipSpace
  value <- inputValue
  pure (key, value)

arguments :: Parser RawArguments
arguments = do
  skipSpace
  _ <- char '('
  skipSpace
  parameters <- parameter `sepBy` (skipSpace *> char ',')
  skipSpace
  _ <- char ')'
  pure parameters