{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeOperators #-}
module Telegram.Bot.API.Methods where
import Data.Aeson
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
type GetMe = "getMe" :> Get '[JSON] (Response User)
getMe :: ClientM (Response User)
getMe = client (Proxy @GetMe)
type DeleteMessage = "deleteMessage"
  :> RequiredQueryParam "chat_id" ChatId
  :> RequiredQueryParam "message_id" MessageId
  :> Get '[JSON] (Response Bool)
deleteMessage :: ChatId -> MessageId -> ClientM (Response Bool)
deleteMessage = client (Proxy @DeleteMessage)
type SendMessage
  = "sendMessage" :> ReqBody '[JSON] SendMessageRequest :> Post '[JSON] (Response Message)
sendMessage :: SendMessageRequest -> ClientM (Response Message)
sendMessage = client (Proxy @SendMessage)
data SomeChatId
  = SomeChatId ChatId       
  | SomeChatUsername Text   
  deriving (Generic)
instance ToJSON   SomeChatId where toJSON = genericSomeToJSON
instance FromJSON SomeChatId where parseJSON = genericSomeParseJSON
data SomeReplyMarkup
  = SomeInlineKeyboardMarkup InlineKeyboardMarkup
  | SomeReplyKeyboardMarkup  ReplyKeyboardMarkup
  | SomeReplyKeyboardRemove  ReplyKeyboardRemove
  | SomeForceReply           ForceReply
  deriving (Generic)
instance ToJSON   SomeReplyMarkup where toJSON = genericSomeToJSON
instance FromJSON SomeReplyMarkup where parseJSON = genericSomeParseJSON
data ParseMode
  = Markdown
  | HTML
  deriving (Generic)
instance ToJSON   ParseMode
instance FromJSON ParseMode
data SendMessageRequest = SendMessageRequest
  { sendMessageChatId                :: SomeChatId 
  , sendMessageText                  :: Text 
  , sendMessageParseMode             :: Maybe ParseMode 
  , sendMessageDisableWebPagePreview :: Maybe Bool 
  , sendMessageDisableNotification   :: Maybe Bool 
  , sendMessageReplyToMessageId      :: Maybe MessageId 
  , sendMessageReplyMarkup           :: Maybe SomeReplyMarkup 
  } deriving (Generic)
instance ToJSON   SendMessageRequest where toJSON = gtoJSON
instance FromJSON SendMessageRequest where parseJSON = gparseJSON