content: {-# LANGUAGE DeriveAnyClass    #-}
  {-# LANGUAGE DeriveGeneric     #-}
  {-# LANGUAGE OverloadedStrings #-}
  
  -- | This module contains responses from Telegram Bot API
  module Web.Telegram.API.Bot.Responses
      ( -- * Types
        Response                        (..)
      , ResponseParameters              (..)
      , GetMeResponse
      , MessageResponse
      , ChatActionResponse
      , UpdatesResponse
      , FileResponse
      , UserProfilePhotosResponse
      , SetWebhookResponse
      , InlineQueryResponse
      , CallbackQueryResponse
      , KickChatMemberResponse
      , LeaveChatResponse
      , UnbanChatMemberResponse
      , GetChatResponse
      , GetChatAdministratorsResponse
      , GetChatMembersCountResponse
      , GetChatMemberResponse
      , GetWebhookInfoResponse
      , AnswerShippingQueryResponse
      , AnswerPreCheckoutQueryResponse
      ) where
  
  import           Data.Aeson
  import           Data.Int                     (Int64)
  import           GHC.Generics
  import           Web.Telegram.API.Bot.Data
  import           Web.Telegram.API.Bot.JsonExt
  
  data Response a = Response
    {
      result     :: a
    , parameters :: Maybe ResponseParameters
    } deriving (Show, Generic, FromJSON)
  
  data ResponseParameters = ResponseParameters
    {
      res_migrate_to_chat_id :: Maybe Int64 -- ^ The group has been migrated to a supergroup with the specified identifier. This number may be greater than 32 bits and some programming languages may have difficulty/silent defects in interpreting it. But it is smaller than 52 bits, so a signed 64 bit integer or double-precision float type are safe for storing this identifier.
    , res_retry_after        :: Maybe Int   -- ^ In case of exceeding flood control, the number of seconds left to wait before the request can be repeated
    } deriving (Show, Generic)
  
  instance FromJSON ResponseParameters where
    parseJSON = parseJsonDrop 4
  
  -- | This object represents 'getMe' response
  type GetMeResponse = Response User
  
  -- | This object represents message response
  type MessageResponse = Response Message
  
  -- | This object represents 'sendChatAction' response
  type ChatActionResponse = Response Bool
  
  -- | This object represents 'getUpdates' response
  type UpdatesResponse = Response [Update]
  
  -- | This object represents file response
  type FileResponse = Response File
  
  -- | This object represents user profile photos response
  type UserProfilePhotosResponse = Response UserProfilePhotos
  
  -- | This object represents 'setWebhook' response
  type SetWebhookResponse = Response Bool
  
  -- | This object represents 'answerInlineQuery' response
  type InlineQueryResponse = Response Bool
  
  -- | This object represents 'answerCallbackQuery' response
  type CallbackQueryResponse = Response Bool
  
  -- | This object represents 'kickChatMember' response
  type KickChatMemberResponse = Response Bool
  
  type LeaveChatResponse = Response Bool
  
  -- | This object represents 'unbanChatMember' response
  type UnbanChatMemberResponse = Response Bool
  
  type GetChatResponse = Response Chat
  
  type GetChatAdministratorsResponse = Response [ChatMember]
  
  type GetChatMembersCountResponse = Response Int
  
  type GetChatMemberResponse = Response ChatMember
  
  type GetWebhookInfoResponse = Response WebhookInfo
  
  type AnswerShippingQueryResponse = Response Bool
  
  type AnswerPreCheckoutQueryResponse = Response Bool
  