module Gargantext.Components.GraphQL.AffjaxSimpleJSONClient
  (AffjaxClient(..))
  where

import Prelude

import Affjax.Web (Error(..), Response, URL, defaultRequest, printError, request)
import Affjax.RequestBody as RequestBody
import Affjax.RequestHeader (RequestHeader(..))
import Affjax.ResponseFormat as ResponseFormat
import Data.Argonaut.Core (Json)
import Data.Either (Either(..))
import Data.HTTP.Method as Method
import Data.List.NonEmpty as DLN
import Data.Maybe (Maybe(..))
import Data.MediaType.Common (applicationJSON)
import Effect.Aff (Aff, error, throwError)
import Foreign (unsafeToForeign)
import GraphQL.Client.Types (class QueryClient)
import Simple.JSON as JSON

data AffjaxClient
  = AffjaxClient URL (Array RequestHeader)
--
-- instance queryClient :: QueryClient AffjaxClient Unit Unit where
--   clientQuery _ (AffjaxClient url headers) name q vars = throwLeft =<< convertJsonResponse =<< queryPostForeign "query" url headers name q vars
--   clientMutation _ (AffjaxClient url headers) name q vars = throwLeft =<< convertJsonResponse =<< queryPostForeign "mutation" url headers name q vars
--   defQueryOpts = const unit
--   defMutationOpts = const unit
--
-- throwLeft :: forall r body. Either Error { body :: body | r } -> Aff body
-- throwLeft = case _ of
--   Left err -> throwError $ error $ printError err
--   Right { body } -> pure body
--
-- queryPostForeign ::
--   forall d.
--   JSON.WriteForeign d =>
--   String -> URL -> Array RequestHeader -> String -> String -> d -> Aff (Either Error (Response String))
-- queryPostForeign opStr url headers queryName q vars = do
--   request
--     defaultRequest
--       { withCredentials = true
--       , url = url
--       , method = Left Method.POST
--       --, responseFormat = ResponseFormat.json
--       , responseFormat = ResponseFormat.string
--       , content =
--         Just
--           -- $ RequestBody.Json
--           -- $ encodeJson
--           $ RequestBody.String
--           $ JSON.writeJSON
--               { query: opStr <> " " <> queryName <> " " <> q
--               , variables: vars
--               , operationName: queryName
--               }
--       , headers = headers <> [ ContentType applicationJSON ]
--       }
--
-- convertJsonResponse :: Either Error (Response String) -> Aff (Either Error (Response Json))
-- convertJsonResponse (Left err) = pure $ Left err
-- convertJsonResponse (Right res@{ body }) = pure $ case JSON.readJSON body of
--   Left err -> Left $ ResponseBodyError (DLN.head err) (res { body = unsafeToForeign body })
--   Right body' -> Right $ res { body = toJSON body' }
--
-- foreign import toJSON :: forall d. JSON.ReadForeign d => d -> Json
--
--
