-- | This module exports the type used to create match queries.
module Data.Factual.Query.MatchQuery
  (
    -- * MatchQuery type
    MatchQuery(..)
    -- * MatchValue type
  , MatchValue(..)
  ) where

import Data.Factual.Query
import qualified Data.Map as M
import Data.List.Utils (join)

-- | A match value can either be a String or a Number (Double). The first
--   argument is the name of the field and the second argument is the input
--   value.
data MatchValue = MatchStr String String
                | MatchNum String Double
                deriving Eq

-- MatchValue is a member of the Show typeclass to help generate query Strings.
instance Show MatchValue where
  show (MatchStr name str) = (show name) ++ ":" ++ (show str)
  show (MatchNum name num) = (show name) ++ ":" ++ (show num)

-- | A match query is formed as an array of match values. These values will
--   be compared with Factual records to return a cleaner, more canonical row
--   of data.
data MatchQuery = MatchQuery [MatchValue] deriving Eq

-- MatchQuery is a member of the Query typeclass so that it can be used to
-- make requests.
instance Query MatchQuery where
  path   _                   = "/places/match"
  params (MatchQuery values) = M.fromList [("values", valuesString)]
    where valuesString = "{" ++ (join "," $ map show values) ++ "}"