{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}

----------------------------------------------------------------------
-- |
-- Module: Web.Pocket.Get
-- Description:
--
--
--
----------------------------------------------------------------------

module Web.Pocket.Get
  ( GetRequest (..)
  , makeGetRequest
  , GetResponse (..)
  )
  where

-- aeson
import Data.Aeson

-- text
import Data.Text (Text)


-- |
--
--

data GetRequest =
  GetRequest
    { getReqConsumerKey :: Text
    , getReqAccessToken :: Text
    , getReqState ::  Maybe Text
    , getReqFavorite :: Maybe Integer
    , getReqTag :: Maybe Text
    , getReqContentType :: Maybe Text
    , getReqSort :: Maybe Text
    , getReqDetailType :: Maybe Text
    , getReqSearch :: Maybe Text
    , getReqDomain :: Maybe Text
    , getReqSince :: Maybe Text
    , getReqCount :: Maybe Integer
    , getReqOffset :: Maybe Integer
    }


-- |
--
--

instance ToJSON GetRequest where
  toJSON GetRequest {..} =
    object
      [ "consumer_key" .= getReqConsumerKey
      , "access_token" .= getReqAccessToken
      , "state" .= getReqState
      , "favorite" .= getReqFavorite
      , "tag" .= getReqTag
      , "contentType" .= getReqContentType
      , "sort" .= getReqSort
      , "detailType" .= getReqDetailType
      , "search" .= getReqSearch
      , "domain" .= getReqDomain
      , "since" .= getReqSince
      , "count" .= getReqCount
      , "offset" .= getReqOffset
      ]


-- |
--
--

makeGetRequest
  :: Text
  -> Text
  -> GetRequest
makeGetRequest getReqConsumerKey getReqAccessToken =
  GetRequest
    { getReqState = Nothing
    , getReqFavorite = Nothing
    , getReqTag = Nothing
    , getReqContentType = Nothing
    , getReqSort = Nothing
    , getReqDetailType = Nothing
    , getReqSearch = Nothing
    , getReqDomain = Nothing
    , getReqSince = Nothing
    , getReqCount = Nothing
    , getReqOffset = Nothing
    , ..
    }


-- |
--
--

data GetResponse =
  GetResponse
    { getRespList :: Object
    , getRespStatus :: Integer
    }
  deriving (Show)


-- |
--
--

instance FromJSON GetResponse where
  parseJSON =
    withObject "" $
      \o -> do
        getRespList <- o .: "list"
        getRespStatus <- o .: "status"
        return GetResponse {..}