{-|
Module      : Web.Yahoo.Finance.YQL.Internal.API
Description : Internal API types and functions.
Copyright   : (c) James M.C. Haver II, 2016
License     : BSD3

This is an internal module. Use at your own risk.
-}

{-# LANGUAGE CPP                        #-}
{-# LANGUAGE DeriveGeneric              #-}
{-# LANGUAGE DataKinds                  #-}
{-# LANGUAGE DeriveDataTypeable         #-}
{-# LANGUAGE FlexibleContexts           #-}
{-# LANGUAGE FlexibleInstances          #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE InstanceSigs               #-}
{-# LANGUAGE OverloadedStrings          #-}
{-# LANGUAGE RecordWildCards            #-}
{-# LANGUAGE TypeOperators              #-}

module Web.Yahoo.Finance.YQL.Internal.API where

import Web.Yahoo.Finance.YQL.Internal.Types

import Data.Proxy
import Data.Text (Text)
import Servant.API
import Servant.Client

#if MIN_VERSION_servant(0, 9, 0)
#elif MIN_VERSION_servant(0, 5, 0)
import Control.Monad.Except
import Network.HTTP.Client (Manager)
#else
import Control.Monad.Trans.Either
#endif

-- | Low-level Servant definition of the Yahoo Finance YQL client API.
type YahooFinanceYQLApi
  =  "v1"
  :> "public"
  :> "yql"
  :> QueryParam "q" YQLQuery
  :> QueryParam "format" Text
  :> QueryParam "env" Text
  :> QueryParam "callback" Text
  :> Get '[JSON] YQLResponse

-- | 'QueryParam' are treated as maybes but Yahoo requires that all the fields
-- be filled except for "callback". Quotes are returned in the order they are
-- queried.
--
-- format default is "json"
-- env default is "store://datatables.org/alltableswithkeys"
-- The order of arguments varies slightly with each version of Servant.
#if MIN_VERSION_servant(0, 9, 0)
getQuotesInternal :: Maybe YQLQuery -> Maybe Text -> Maybe Text -> Maybe Text -> ClientM YQLResponse
#elif MIN_VERSION_servant(0, 6, 0)
getQuotesInternal :: Maybe YQLQuery -> Maybe Text -> Maybe Text -> Maybe Text -> Manager -> BaseUrl -> ExceptT ServantError IO YQLResponse
#elif MIN_VERSION_servant(0, 5, 0)
getQuotesInternal :: BaseUrl -> Manager -> Maybe YQLQuery -> Maybe Text -> Maybe Text -> Maybe Text -> ExceptT ServantError IO YQLResponse
#else
getQuotesInternal :: BaseUrl -> Maybe YQLQuery -> Maybe Text -> Maybe Text -> Maybe Text -> EitherT ServantError IO YQLResponse
#endif
getQuotesInternal = client (Proxy :: Proxy YahooFinanceYQLApi)