{-# 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