-- | This module exports the types used to create facets queries.
module Data.Factual.Query.FacetsQuery
  (
    -- * FacetsQuery type
    FacetsQuery(..)
    -- * Required modules
  , module Data.Factual.Shared.Table
  , module Data.Factual.Shared.Search
  , module Data.Factual.Shared.Filter
  , module Data.Factual.Shared.Geo
  ) where

import Data.Factual.Query
import Data.Factual.Shared.Table
import Data.Factual.Shared.Search
import Data.Factual.Shared.Filter
import Data.Factual.Shared.Geo
import Data.Factual.Utils
import qualified Data.Map as M

-- | The FacetsQuery type is used to construct facets queries. A table and search
--   should be specified, but the rest of the query options are essentially
--   optional.
data FacetsQuery = FacetsQuery { table        :: Table
                               , search       :: Search
                               , select       :: [String]
                               , filters      :: [Filter]
                               , geo          :: Maybe Geo
                               , limit        :: Maybe Int
                               , minCount     :: Maybe Int
                               , includeCount :: Bool
                               } deriving (Eq, Show)

-- The FacetsQuery type is a member of the Query typeclass so it can be used to
-- make a request.
instance Query FacetsQuery where
  path query   = (show $ table query) ++ "/facets"
  params query = M.fromList [ searchPair $ search query
                            , selectPair $ select query
                            , filtersPair $ filters query
                            , geoPair $ geo query
                            , limitPair $ limit query
                            , minCountPair $ minCount query
                            , includeCountPair $ includeCount query ]

-- Helper functions
minCountPair :: Maybe Int -> (String, String)
minCountPair (Just x) = ("min_count", show x)
minCountPair Nothing  = ("min_count", "")