/*
 * Zernio API
 *
 * API reference for Zernio. Authenticate with a Bearer API key. Base URL: https://zernio.com/api
 *
 * The version of the OpenAPI document: 1.0.1
 * Contact: support@zernio.com
 * Generated by: https://openapi-generator.tech
 */

use crate::models;
use serde::{Deserialize, Serialize};

#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)]
pub struct SendInboxMessageRequest {
    /// Social account ID
    #[serde(rename = "accountId")]
    pub account_id: String,
    /// Message text
    #[serde(rename = "message", skip_serializing_if = "Option::is_none")]
    pub message: Option<String>,
    /// URL of the attachment to send (image, video, audio, or file). The URL must be publicly accessible. For binary file uploads, use multipart/form-data instead.
    #[serde(rename = "attachmentUrl", skip_serializing_if = "Option::is_none")]
    pub attachment_url: Option<String>,
    /// Type of attachment. Defaults to file if not specified.
    #[serde(rename = "attachmentType", skip_serializing_if = "Option::is_none")]
    pub attachment_type: Option<AttachmentType>,
    /// Quick reply buttons. Mutually exclusive with buttons. Max 13 items.
    #[serde(rename = "quickReplies", skip_serializing_if = "Option::is_none")]
    pub quick_replies: Option<Vec<models::SendInboxMessageRequestQuickRepliesInner>>,
    /// Action buttons. Mutually exclusive with quickReplies. Max 3 items.
    #[serde(rename = "buttons", skip_serializing_if = "Option::is_none")]
    pub buttons: Option<Vec<models::SendInboxMessageRequestButtonsInner>>,
    #[serde(rename = "template", skip_serializing_if = "Option::is_none")]
    pub template: Option<Box<models::SendInboxMessageRequestTemplate>>,
    #[serde(rename = "interactive", skip_serializing_if = "Option::is_none")]
    pub interactive: Option<Box<models::SendInboxMessageRequestInteractive>>,
    #[serde(rename = "replyMarkup", skip_serializing_if = "Option::is_none")]
    pub reply_markup: Option<Box<models::SendInboxMessageRequestReplyMarkup>>,
    /// Facebook messaging type. Required when using messageTag.
    #[serde(rename = "messagingType", skip_serializing_if = "Option::is_none")]
    pub messaging_type: Option<MessagingType>,
    /// Facebook message tag for messaging outside 24h window. Requires messagingType MESSAGE_TAG. Instagram only supports HUMAN_AGENT.
    #[serde(rename = "messageTag", skip_serializing_if = "Option::is_none")]
    pub message_tag: Option<MessageTag>,
    /// Platform message ID to quote-reply to. For WhatsApp, pass the wamid (available in message.platformMessageId from webhooks). For Telegram, pass the Telegram message ID.
    #[serde(rename = "replyTo", skip_serializing_if = "Option::is_none")]
    pub reply_to: Option<String>,
}

impl SendInboxMessageRequest {
    pub fn new(account_id: String) -> SendInboxMessageRequest {
        SendInboxMessageRequest {
            account_id,
            message: None,
            attachment_url: None,
            attachment_type: None,
            quick_replies: None,
            buttons: None,
            template: None,
            interactive: None,
            reply_markup: None,
            messaging_type: None,
            message_tag: None,
            reply_to: None,
        }
    }
}
/// Type of attachment. Defaults to file if not specified.
#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
pub enum AttachmentType {
    #[serde(rename = "image")]
    Image,
    #[serde(rename = "video")]
    Video,
    #[serde(rename = "audio")]
    Audio,
    #[serde(rename = "file")]
    File,
}

impl Default for AttachmentType {
    fn default() -> AttachmentType {
        Self::Image
    }
}
/// Facebook messaging type. Required when using messageTag.
#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
pub enum MessagingType {
    #[serde(rename = "RESPONSE")]
    Response,
    #[serde(rename = "UPDATE")]
    Update,
    #[serde(rename = "MESSAGE_TAG")]
    MessageTag,
}

impl Default for MessagingType {
    fn default() -> MessagingType {
        Self::Response
    }
}
/// Facebook message tag for messaging outside 24h window. Requires messagingType MESSAGE_TAG. Instagram only supports HUMAN_AGENT.
#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
pub enum MessageTag {
    #[serde(rename = "CONFIRMED_EVENT_UPDATE")]
    ConfirmedEventUpdate,
    #[serde(rename = "POST_PURCHASE_UPDATE")]
    PostPurchaseUpdate,
    #[serde(rename = "ACCOUNT_UPDATE")]
    AccountUpdate,
    #[serde(rename = "HUMAN_AGENT")]
    HumanAgent,
}

impl Default for MessageTag {
    fn default() -> MessageTag {
        Self::ConfirmedEventUpdate
    }
}
