{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DerivingVia #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE TypeOperators #-}

-- | Actions that the bot can perform
module Web.Telegram.API.Actions
  ( KickChatMember,
    Kick,
    UnbanChatMember,
    Unban,
    RestrictChatMember,
    Restriction,
    PromoteChatMember,
    Promotion,
    SetChatAdministratorCustomTitle,
    SetChatPermissions,
    ExportChatInviteLink,
    SetChatPhoto,
    DeleteChatPhoto,
    SetChatTitle,
    SetChatDescription,
    PinChatMessage,
    UnpinChatMessage,
    LeaveChat,
    SetChatStickerSet,
    DeleteChatStickerSet,
    UploadStickerFileU,
    UploadStickerFile,
    CreateNewStickerSetU,
    CreateNewStickerSet,
    AddStickerToSetU,
    AddStickerToSet,
    SetStickerPositionInSet,
    DeleteStickerFromSet,
    SetStickerSetThumbU,
    SetStickerSetThumb,
    SetMyCommands,
    AnswerInlineQuery,
    InlineQueryAnswer,
    AnswerCallbackQuery,
    CallbackQueryAnswer,
  )
where

import Data.Text (Text)
import Servant.API
import Servant.Multipart
import Web.Telegram.API.Actions.Data
import Web.Telegram.API.Common
import Web.Telegram.API.CompoundParam
import Web.Telegram.Types
import Web.Telegram.Types.Input
import Web.Telegram.Types.Update

type KickChatMember =
  Base
    :> "kickChatmember"
    :> ReqBody '[JSON] Kick
    :> Get '[JSON] (ReqResult Bool)

type UnbanChatMember =
  Base
    :> "unbanChatMember"
    :> ReqBody '[JSON] Unban
    :> Get '[JSON] (ReqResult Bool)

type RestrictChatMember =
  Base
    :> "restrictChatMember"
    :> ReqBody '[JSON] Restriction
    :> Get '[JSON] (ReqResult Bool)

type PromoteChatMember =
  Base
    :> "promoteChatMember"
    :> ReqBody '[JSON] Promotion
    :> Get '[JSON] (ReqResult Bool)

type SetChatAdministratorCustomTitle =
  Base
    :> "setChatAdministratorCustomTitle"
    :> QueryR "chat_id" ChatId
    :> QueryR "user_id" Int
    :> QueryParam "custom_title" Text
    :> Get '[JSON] (ReqResult Bool)

type SetChatPermissions =
  Base
    :> "setChatPermissions"
    :> QueryR "chat_id" ChatId
    :> QueryR "permissions" ChatPermissions
    :> Get '[JSON] (ReqResult Bool)

type ExportChatInviteLink =
  Base
    :> "exportChatInviteLink"
    :> QueryR "chat_id" ChatId
    :> Get '[JSON] (ReqResult Text)

type SetChatPhoto =
  Base
    :> "setChatPhoto"
    :> QueryR "chat_id" ChatId
    :> CompoundParam Mem "photo" InputFile
    :> Get '[JSON] (ReqResult Bool)

type DeleteChatPhoto =
  Base
    :> "deleteChatPhoto"
    :> QueryR "chat_id" ChatId
    :> Get '[JSON] (ReqResult Bool)

type SetChatTitle =
  Base
    :> "setChatTitle"
    :> QueryR "chat_id" ChatId
    :> QueryR "title" Text
    :> Get '[JSON] (ReqResult Bool)

type SetChatDescription =
  Base
    :> "setChatDescription"
    :> QueryR "chat_id" ChatId
    :> QueryParam "description" Text
    :> Get '[JSON] (ReqResult Bool)

type PinChatMessage =
  Base
    :> "pinChatMessage"
    :> QueryR "chat_id" ChatId
    :> QueryR "message_id" Int
    :> QueryParam "disable_notification" Bool
    :> Get '[JSON] (ReqResult Bool)

type UnpinChatMessage =
  Base
    :> "unpinChatMessage"
    :> QueryR "chat_id" ChatId
    :> Get '[JSON] (ReqResult Bool)

type LeaveChat =
  Base
    :> "leaveChat"
    :> QueryR "chat_id" ChatId
    :> Get '[JSON] (ReqResult Bool)

type SetChatStickerSet =
  Base
    :> "setChatStickerSet"
    :> QueryR "chat_id" ChatId
    :> QueryR "sticker_set_name" Text
    :> Get '[JSON] (ReqResult Bool)

type DeleteChatStickerSet =
  Base
    :> "deleteChatStickerSet"
    :> QueryR "chat_id" ChatId
    :> Get '[JSON] (ReqResult Bool)

type UploadStickerFile' png =
  Base
    :> "uploadStickerFile"
    :> QueryR "user_id" Int
    :> png
    :> Get '[JSON] (ReqResult File)

type UploadStickerFileU =
  UploadStickerFile' (MultipartForm Mem PngSticker)

type UploadStickerFile =
  UploadStickerFile' (QueryR "png_sticker" Text)

type CreateNewStickerSet' png =
  Base
    :> "createNewStickerSet"
    :> QueryR "user_id" Int
    :> QueryR "name" Text
    :> QueryR "title" Text
    :> png
    :> MultipartForm Mem TgsSticker
    :> QueryR "emojis" Text
    :> QueryParam "contains_masks" Bool
    :> QueryParam "mask_position" MaskPosition
    :> Get '[JSON] (ReqResult Bool)

type CreateNewStickerSetU =
  CreateNewStickerSet' (MultipartForm Mem PngSticker)

type CreateNewStickerSet =
  CreateNewStickerSet' (QueryR "png_sticker" Text)

type AddStickerToSet' png =
  Base
    :> "addStickerToSet"
    :> QueryR "user_id" Int
    :> QueryR "name" Text
    :> png
    :> MultipartForm Mem TgsSticker
    :> QueryR "emojis" Text
    :> QueryR "mask_position" MaskPosition
    :> Get '[JSON] (ReqResult Bool)

type AddStickerToSetU =
  AddStickerToSet' (MultipartForm Mem PngSticker)

type AddStickerToSet =
  AddStickerToSet' (QueryR "png_sticker" Text)

type SetStickerPositionInSet =
  Base
    :> "setStickerPositionInSet"
    :> QueryR "sticker" Text
    :> QueryR "positon" Int
    :> Get '[JSON] (ReqResult Bool)

type DeleteStickerFromSet =
  Base
    :> "deleteStickerFromSet"
    :> QueryR "sticker" Text
    :> Get '[JSON] (ReqResult Bool)

type SetStickerSetThumb' t =
  Base
    :> "setStickerSetThumb"
    :> QueryR "name" Text
    :> QueryR "user_id" Int
    :> t
    :> Get '[JSON] (ReqResult Bool)

type SetStickerSetThumbU =
  SetStickerSetThumb' (MultipartForm Mem PngSticker)

type SetStickerSetThumb =
  SetStickerSetThumb' (QueryR "thumb" Text)

type AnswerInlineQuery =
  Base
    :> "answerInlineQuery"
    :> ReqBody '[JSON] InlineQueryAnswer
    :> Get '[JSON] (ReqResult Bool)

type AnswerCallbackQuery =
  Base
    :> "answerCallbackQuery"
    :> ReqBody '[JSON] CallbackQueryAnswer
    :> Get '[JSON] (ReqResult Bool)

type SetMyCommands =
  Base
    :> "setMyCommands"
    :> ReqBody '[JSON] CommandSet
    :> Get '[JSON] (ReqResult Bool)