{-# LANGUAGE DataKinds                  #-}
{-# LANGUAGE DeriveGeneric              #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE OverloadedStrings          #-}
{-# LANGUAGE TemplateHaskell            #-}
{-# LANGUAGE TypeApplications           #-}
{-# LANGUAGE TypeOperators              #-}
module Telegram.Bot.API.InlineMode where

import           Data.Aeson                      (FromJSON (..), ToJSON (..))
import           Data.Hashable                   (Hashable)
import           Data.Proxy
import           Data.Text                       (Text)
import           GHC.Generics                    (Generic)

import           Servant.API
import           Servant.Client                  hiding (Response)

import           Telegram.Bot.API.Internal.Utils
import           Telegram.Bot.API.MakingRequests
import           Telegram.Bot.API.Types
import           Telegram.Bot.API.InlineMode.InlineQueryResult

-- * Available types
-- ** User
--
-- | This object represents an incoming inline query. When the user sends an empty query, your bot could return some default or trending results.
--
-- <https://core.telegram.org/bots/api#inline-mode>
data InlineQuery = InlineQuery
  { InlineQuery -> InlineQueryId
inlineQueryId       :: InlineQueryId -- ^ Unique query identifier
  , InlineQuery -> User
inlineQueryFrom     :: User -- ^ Sender
  , InlineQuery -> Maybe Location
inlineQueryLocation :: Maybe Location -- ^ For bots that require user location, sender location
  , InlineQuery -> Text
inlineQueryQuery    :: Text -- ^ Text of the query, up to 256 characters
  , InlineQuery -> Text
inlineQueryOffset   :: Text -- ^ Offset of the results to be returned, can be controlled by bot
  } deriving ((forall x. InlineQuery -> Rep InlineQuery x)
-> (forall x. Rep InlineQuery x -> InlineQuery)
-> Generic InlineQuery
forall x. Rep InlineQuery x -> InlineQuery
forall x. InlineQuery -> Rep InlineQuery x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep InlineQuery x -> InlineQuery
$cfrom :: forall x. InlineQuery -> Rep InlineQuery x
Generic, Int -> InlineQuery -> ShowS
[InlineQuery] -> ShowS
InlineQuery -> String
(Int -> InlineQuery -> ShowS)
-> (InlineQuery -> String)
-> ([InlineQuery] -> ShowS)
-> Show InlineQuery
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [InlineQuery] -> ShowS
$cshowList :: [InlineQuery] -> ShowS
show :: InlineQuery -> String
$cshow :: InlineQuery -> String
showsPrec :: Int -> InlineQuery -> ShowS
$cshowsPrec :: Int -> InlineQuery -> ShowS
Show)

-- | Unique identifier for this query
newtype InlineQueryId = InlineQueryId Text
  deriving (InlineQueryId -> InlineQueryId -> Bool
(InlineQueryId -> InlineQueryId -> Bool)
-> (InlineQueryId -> InlineQueryId -> Bool) -> Eq InlineQueryId
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: InlineQueryId -> InlineQueryId -> Bool
$c/= :: InlineQueryId -> InlineQueryId -> Bool
== :: InlineQueryId -> InlineQueryId -> Bool
$c== :: InlineQueryId -> InlineQueryId -> Bool
Eq, Int -> InlineQueryId -> ShowS
[InlineQueryId] -> ShowS
InlineQueryId -> String
(Int -> InlineQueryId -> ShowS)
-> (InlineQueryId -> String)
-> ([InlineQueryId] -> ShowS)
-> Show InlineQueryId
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [InlineQueryId] -> ShowS
$cshowList :: [InlineQueryId] -> ShowS
show :: InlineQueryId -> String
$cshow :: InlineQueryId -> String
showsPrec :: Int -> InlineQueryId -> ShowS
$cshowsPrec :: Int -> InlineQueryId -> ShowS
Show, [InlineQueryId] -> Encoding
[InlineQueryId] -> Value
InlineQueryId -> Encoding
InlineQueryId -> Value
(InlineQueryId -> Value)
-> (InlineQueryId -> Encoding)
-> ([InlineQueryId] -> Value)
-> ([InlineQueryId] -> Encoding)
-> ToJSON InlineQueryId
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
toEncodingList :: [InlineQueryId] -> Encoding
$ctoEncodingList :: [InlineQueryId] -> Encoding
toJSONList :: [InlineQueryId] -> Value
$ctoJSONList :: [InlineQueryId] -> Value
toEncoding :: InlineQueryId -> Encoding
$ctoEncoding :: InlineQueryId -> Encoding
toJSON :: InlineQueryId -> Value
$ctoJSON :: InlineQueryId -> Value
ToJSON, Value -> Parser [InlineQueryId]
Value -> Parser InlineQueryId
(Value -> Parser InlineQueryId)
-> (Value -> Parser [InlineQueryId]) -> FromJSON InlineQueryId
forall a.
(Value -> Parser a) -> (Value -> Parser [a]) -> FromJSON a
parseJSONList :: Value -> Parser [InlineQueryId]
$cparseJSONList :: Value -> Parser [InlineQueryId]
parseJSON :: Value -> Parser InlineQueryId
$cparseJSON :: Value -> Parser InlineQueryId
FromJSON, Int -> InlineQueryId -> Int
InlineQueryId -> Int
(Int -> InlineQueryId -> Int)
-> (InlineQueryId -> Int) -> Hashable InlineQueryId
forall a. (Int -> a -> Int) -> (a -> Int) -> Hashable a
hash :: InlineQueryId -> Int
$chash :: InlineQueryId -> Int
hashWithSalt :: Int -> InlineQueryId -> Int
$chashWithSalt :: Int -> InlineQueryId -> Int
Hashable, (forall x. InlineQueryId -> Rep InlineQueryId x)
-> (forall x. Rep InlineQueryId x -> InlineQueryId)
-> Generic InlineQueryId
forall x. Rep InlineQueryId x -> InlineQueryId
forall x. InlineQueryId -> Rep InlineQueryId x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep InlineQueryId x -> InlineQueryId
$cfrom :: forall x. InlineQueryId -> Rep InlineQueryId x
Generic)

-- * Available methods

-- ** answerInlineQuery

type AnswerInlineQuery
  = "answerInlineQuery" :> ReqBody '[JSON] AnswerInlineQueryRequest :> Post '[JSON] (Response Bool)

answerInlineQuery :: AnswerInlineQueryRequest -> ClientM (Response Bool)
answerInlineQuery :: AnswerInlineQueryRequest -> ClientM (Response Bool)
answerInlineQuery = Proxy AnswerInlineQuery -> Client ClientM AnswerInlineQuery
forall api.
HasClient ClientM api =>
Proxy api -> Client ClientM api
client (Proxy AnswerInlineQuery
forall k (t :: k). Proxy t
Proxy @AnswerInlineQuery)

data AnswerInlineQueryRequest = AnswerInlineQueryRequest
  { AnswerInlineQueryRequest -> InlineQueryId
answerInlineQueryRequestInlineQueryId :: InlineQueryId
  , AnswerInlineQueryRequest -> [InlineQueryResult]
answerInlineQueryRequestResults       :: [InlineQueryResult]
  } deriving ((forall x.
 AnswerInlineQueryRequest -> Rep AnswerInlineQueryRequest x)
-> (forall x.
    Rep AnswerInlineQueryRequest x -> AnswerInlineQueryRequest)
-> Generic AnswerInlineQueryRequest
forall x.
Rep AnswerInlineQueryRequest x -> AnswerInlineQueryRequest
forall x.
AnswerInlineQueryRequest -> Rep AnswerInlineQueryRequest x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x.
Rep AnswerInlineQueryRequest x -> AnswerInlineQueryRequest
$cfrom :: forall x.
AnswerInlineQueryRequest -> Rep AnswerInlineQueryRequest x
Generic)

instance ToJSON AnswerInlineQueryRequest where toJSON :: AnswerInlineQueryRequest -> Value
toJSON = AnswerInlineQueryRequest -> Value
forall a (d :: Meta) (f :: * -> *).
(Generic a, GToJSON Zero (Rep a), Rep a ~ D1 d f, Datatype d) =>
a -> Value
gtoJSON
instance FromJSON AnswerInlineQueryRequest where parseJSON :: Value -> Parser AnswerInlineQueryRequest
parseJSON = Value -> Parser AnswerInlineQueryRequest
forall a (d :: Meta) (f :: * -> *).
(Generic a, GFromJSON Zero (Rep a), Rep a ~ D1 d f, Datatype d) =>
Value -> Parser a
gparseJSON

deriveJSON' ''InlineQuery