{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeOperators #-}
module Telegram.Bot.API.Methods.SendChatAction where

import Data.Aeson (ToJSON (..))
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

data SendChatActionRequest = SendChatActionRequest
  { SendChatActionRequest -> Maybe BusinessConnectionId
sendChatActionBusinessConnectionId :: Maybe BusinessConnectionId -- ^ Unique identifier of the business connection on behalf of which the action will be sent.
  , SendChatActionRequest -> ChatId
sendChatActionChatId :: ChatId -- ^ Unique identifier for the target chat or username of the target channel (in the format @\@channelusername@).
  , SendChatActionRequest -> Maybe MessageThreadId
sendChatActionMessageThreadId :: Maybe MessageThreadId -- ^ Unique identifier for the target message thread; for supergroups only.
  , SendChatActionRequest -> Text
sendChatActionAction :: Text -- ^ Type of action to broadcast. Choose one, depending on what the user is about to receive: typing for text messages, upload_photo for photos, record_video or upload_video for videos, record_voice or upload_voice for voice notes, upload_document for general files, choose_sticker for stickers, find_location for location data, record_video_note or upload_video_note for video notes.
  }
  deriving (forall x. SendChatActionRequest -> Rep SendChatActionRequest x)
-> (forall x. Rep SendChatActionRequest x -> SendChatActionRequest)
-> Generic SendChatActionRequest
forall x. Rep SendChatActionRequest x -> SendChatActionRequest
forall x. SendChatActionRequest -> Rep SendChatActionRequest x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. SendChatActionRequest -> Rep SendChatActionRequest x
from :: forall x. SendChatActionRequest -> Rep SendChatActionRequest x
$cto :: forall x. Rep SendChatActionRequest x -> SendChatActionRequest
to :: forall x. Rep SendChatActionRequest x -> SendChatActionRequest
Generic

instance ToJSON SendChatActionRequest where toJSON :: SendChatActionRequest -> Value
toJSON = SendChatActionRequest -> Value
forall a (d :: Meta) (f :: * -> *).
(Generic a, GToJSON Zero (Rep a), Rep a ~ D1 d f, Datatype d) =>
a -> Value
gtoJSON

type SendChatAction = "sendChatAction"
  :> ReqBody '[JSON] SendChatActionRequest
  :> Post '[JSON] (Response Bool)

-- | Use this method when you need to tell the
--   user that something is happening on the bot's side.
--   The status is set for 5 seconds or less
--   (when a message arrives from your bot, Telegram
--   clients clear its typing status).
--   Returns True on success.
--
--   Example: The ImageBot needs some time to
--   process a request and upload the image.
--   Instead of sending a text message along
--   the lines of “Retrieving image, please wait…”,
--   the bot may use sendChatAction with action = upload_photo.
--   The user will see a “sending photo” status for the bot.
--
--   We only recommend using this method when a
--   response from the bot will take a noticeable
--   amount of time to arrive.
sendChatAction :: SendChatActionRequest -> ClientM (Response  Bool)
sendChatAction :: SendChatActionRequest -> ClientM (Response Bool)
sendChatAction = Proxy SendChatAction -> Client ClientM SendChatAction
forall api.
HasClient ClientM api =>
Proxy api -> Client ClientM api
client (forall t. Proxy t
forall {k} (t :: k). Proxy t
Proxy @SendChatAction)