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

import Data.Aeson (FromJSON (..), ToJSON (..))
import Data.Proxy
import Data.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
import Telegram.Bot.API.Types.ParseMode
import Telegram.Bot.API.Types.SomeReplyMarkup
import Telegram.Bot.API.Internal.TH

-- ** 'sendMessage'

type SendMessage
  = "sendMessage" :> ReqBody '[JSON] SendMessageRequest :> Post '[JSON] (Response Message)

-- | Use this method to send text messages.
-- On success, the sent 'Message' is returned.
sendMessage :: SendMessageRequest -> ClientM (Response Message)
sendMessage :: SendMessageRequest -> ClientM (Response Message)
sendMessage = Proxy SendMessage -> Client ClientM SendMessage
forall api.
HasClient ClientM api =>
Proxy api -> Client ClientM api
client (forall t. Proxy t
forall {k} (t :: k). Proxy t
Proxy @SendMessage)

-- | Request parameters for 'sendMessage'.
data SendMessageRequest = SendMessageRequest
  { SendMessageRequest -> SomeChatId
sendMessageChatId                :: SomeChatId -- ^ Unique identifier for the target chat or username of the target channel (in the format @\@channelusername@).
  , SendMessageRequest -> Maybe MessageThreadId
sendMessageMessageThreadId       :: Maybe MessageThreadId -- ^ Unique identifier for the target message thread (topic) of the forum; for forum supergroups only.
  , SendMessageRequest -> Text
sendMessageText                  :: Text -- ^ Text of the message to be sent.
  , SendMessageRequest -> Maybe ParseMode
sendMessageParseMode             :: Maybe ParseMode -- ^ Send 'MarkdownV2', 'HTML' or 'Markdown' (legacy), if you want Telegram apps to show bold, italic, fixed-width text or inline URLs in your bot's message.
  , SendMessageRequest -> Maybe [MessageEntity]
sendMessageEntities              :: Maybe [MessageEntity] -- ^ A JSON-serialized list of special entities that appear in message text, which can be specified instead of /parse_mode/.
  , SendMessageRequest -> Maybe LinkPreviewOptions
sendMessageLinkPreviewOptions    :: Maybe LinkPreviewOptions -- ^ Link preview generation options for the message.
  , SendMessageRequest -> Maybe Bool
sendMessageDisableNotification   :: Maybe Bool -- ^ Sends the message silently. Users will receive a notification with no sound.
  , SendMessageRequest -> Maybe Bool
sendMessageProtectContent        :: Maybe Bool -- ^ Protects the contents of the sent message from forwarding and saving.
  , SendMessageRequest -> Maybe MessageId
sendMessageReplyToMessageId      :: Maybe MessageId -- ^ If the message is a reply, ID of the original message.
  , SendMessageRequest -> Maybe ReplyParameters
sendMessageReplyParameters       :: Maybe ReplyParameters -- ^ Description of the message to reply to.
  , SendMessageRequest -> Maybe SomeReplyMarkup
sendMessageReplyMarkup           :: Maybe SomeReplyMarkup -- ^ Additional interface options. A JSON-serialized object for an inline keyboard, custom reply keyboard, instructions to remove reply keyboard or to force a reply from the user.
  } deriving ((forall x. SendMessageRequest -> Rep SendMessageRequest x)
-> (forall x. Rep SendMessageRequest x -> SendMessageRequest)
-> Generic SendMessageRequest
forall x. Rep SendMessageRequest x -> SendMessageRequest
forall x. SendMessageRequest -> Rep SendMessageRequest x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. SendMessageRequest -> Rep SendMessageRequest x
from :: forall x. SendMessageRequest -> Rep SendMessageRequest x
$cto :: forall x. Rep SendMessageRequest x -> SendMessageRequest
to :: forall x. Rep SendMessageRequest x -> SendMessageRequest
Generic)

instance ToJSON   SendMessageRequest where toJSON :: SendMessageRequest -> Value
toJSON = SendMessageRequest -> Value
forall a (d :: Meta) (f :: * -> *).
(Generic a, GToJSON Zero (Rep a), Rep a ~ D1 d f, Datatype d) =>
a -> Value
gtoJSON
instance FromJSON SendMessageRequest where parseJSON :: Value -> Parser SendMessageRequest
parseJSON = Value -> Parser SendMessageRequest
forall a (d :: Meta) (f :: * -> *).
(Generic a, GFromJSON Zero (Rep a), Rep a ~ D1 d f, Datatype d) =>
Value -> Parser a
gparseJSON

makeDefault ''SendMessageRequest