{-# LANGUAGE ImplicitParams    #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes       #-}
{-# LANGUAGE RecordWildCards   #-}
{-# LANGUAGE ConstraintKinds   #-}

------------------------------------------------------------------------------
-- |
-- Module      : QuickBooks.Item
-- Description :
-- Copyright   :
-- License     :
-- Maintainer  :
-- Stability   :
-- Portability :
--
--
--
------------------------------------------------------------------------------

module QuickBooks.Item
  ( queryItemRequest
  )
  where

import QuickBooks.Authentication
import QuickBooks.Logging
import QuickBooks.Types

import qualified Data.Aeson as Aeson
import Data.String.Interpolate (i)
import Data.Text (Text)
import Network.HTTP.Client
import Network.HTTP.Types.Header (hAccept)

-- GET /v3/company/<companyID>/query=<selectStatement>

queryItemRequest :: APIEnv
                 => OAuthToken
                 -> Text
                 -> IO (Either String (QuickBooksResponse [Item]))
queryItemRequest tok queryItemName = do
  let apiConfig = ?apiConfig
  let queryURI = parseUrl [i|#{queryURITemplate apiConfig}#{query}|]
  req <- oauthSignRequest tok =<< queryURI
  let oauthHeaders = requestHeaders req
  let req' = req { method = "GET"
                 , requestHeaders = oauthHeaders ++ [(hAccept, "application/json")]
                 }
  resp <- httpLbs req' ?manager
  logAPICall req'
  let eitherAllItems = Aeson.eitherDecode (responseBody resp)
  case eitherAllItems of
    Left er -> return (Left er)
    Right (QuickBooksItemResponse allItems) ->
      return $ Right $ QuickBooksItemResponse $
        filter (\Item{..} -> itemName == queryItemName) allItems
  where
    query :: String
    query = "SELECT * FROM Item"

queryURITemplate :: APIConfig -> String
queryURITemplate APIConfig{..} =
  [i|https://#{hostname}/v3/company/#{companyId}/query?query=|]