/*
 * 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.4
 * Contact: support@zernio.com
 * Generated by: https://openapi-generator.tech
 */

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

/// TikTokPlatformData : Photo carousels up to 35 images. Video titles up to 2200 chars, photo titles truncated to 90 chars. privacyLevel must match creator_info options. Both camelCase and snake_case accepted.  Creator Inbox (draft mode): Set draft: true to send content to the TikTok Creator Inbox instead of publishing immediately. The creator receives an inbox notification and completes the post using TikTok's editing flow. This maps to TikTok's post_mode: \"MEDIA_UPLOAD\" internally.  Important: The field publish_type is NOT supported. Use draft: true for Creator Inbox flow.  Photo drafts use the /v2/post/publish/content/init/ endpoint with post_mode: \"MEDIA_UPLOAD\". Video drafts use the dedicated /v2/post/publish/inbox/video/init/ endpoint.  When draft: true, the video.upload scope is required. When draft is false or omitted (direct post), the video.publish scope is required. For Creator Inbox, TikTok app version must be 31.8 or higher.
#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)]
pub struct TikTokPlatformData {
    /// When true, sends the post to the TikTok Creator Inbox as a draft instead of publishing immediately. The creator receives an inbox notification to complete posting via TikTok's editing flow. Maps to TikTok API post_mode: \"MEDIA_UPLOAD\" (photos) or the dedicated inbox endpoint (videos). When false or omitted, publishes directly via post_mode: \"DIRECT_POST\". Note: publish_type is not a supported field. Use this field instead.
    #[serde(rename = "draft", skip_serializing_if = "Option::is_none")]
    pub draft: Option<bool>,
    /// One of the values returned by the TikTok creator info API for the account
    #[serde(rename = "privacyLevel", skip_serializing_if = "Option::is_none")]
    pub privacy_level: Option<String>,
    /// Allow comments on the post
    #[serde(rename = "allowComment", skip_serializing_if = "Option::is_none")]
    pub allow_comment: Option<bool>,
    /// Allow duets (required for video posts)
    #[serde(rename = "allowDuet", skip_serializing_if = "Option::is_none")]
    pub allow_duet: Option<bool>,
    /// Allow stitches (required for video posts)
    #[serde(rename = "allowStitch", skip_serializing_if = "Option::is_none")]
    pub allow_stitch: Option<bool>,
    /// Type of commercial content disclosure
    #[serde(
        rename = "commercialContentType",
        skip_serializing_if = "Option::is_none"
    )]
    pub commercial_content_type: Option<CommercialContentType>,
    /// Whether the post promotes a brand partner
    #[serde(
        rename = "brandPartnerPromote",
        skip_serializing_if = "Option::is_none"
    )]
    pub brand_partner_promote: Option<bool>,
    /// Whether the post is a brand organic post
    #[serde(rename = "isBrandOrganicPost", skip_serializing_if = "Option::is_none")]
    pub is_brand_organic_post: Option<bool>,
    /// User has confirmed they previewed the content
    #[serde(
        rename = "contentPreviewConfirmed",
        skip_serializing_if = "Option::is_none"
    )]
    pub content_preview_confirmed: Option<bool>,
    /// User has given express consent for posting
    #[serde(
        rename = "expressConsentGiven",
        skip_serializing_if = "Option::is_none"
    )]
    pub express_consent_given: Option<bool>,
    /// Optional override. Defaults based on provided media items.
    #[serde(rename = "mediaType", skip_serializing_if = "Option::is_none")]
    pub media_type: Option<MediaType>,
    /// Optional for video posts. Timestamp in milliseconds to select which frame to use as thumbnail (defaults to 1000ms/1 second). Ignored when videoCoverImageUrl is provided.
    #[serde(
        rename = "videoCoverTimestampMs",
        skip_serializing_if = "Option::is_none"
    )]
    pub video_cover_timestamp_ms: Option<i32>,
    /// Optional for video posts. URL of a custom thumbnail image (JPG, PNG, or WebP, max 20MB). The image is stitched as a single frame at the start of the video and used as the cover. Overrides videoCoverTimestampMs when provided.
    #[serde(rename = "videoCoverImageUrl", skip_serializing_if = "Option::is_none")]
    pub video_cover_image_url: Option<String>,
    /// Optional for photo carousels. Index of image to use as cover, 0-based (defaults to 0/first image).
    #[serde(rename = "photoCoverIndex", skip_serializing_if = "Option::is_none")]
    pub photo_cover_index: Option<i32>,
    /// When true, TikTok may add recommended music (photos only)
    #[serde(rename = "autoAddMusic", skip_serializing_if = "Option::is_none")]
    pub auto_add_music: Option<bool>,
    /// Set true to disclose AI-generated content
    #[serde(rename = "videoMadeWithAi", skip_serializing_if = "Option::is_none")]
    pub video_made_with_ai: Option<bool>,
    /// Optional long-form description for photo posts (max 4000 chars). Recommended when content exceeds 90 chars, as photo titles are auto-truncated.
    #[serde(rename = "description", skip_serializing_if = "Option::is_none")]
    pub description: Option<String>,
}

impl TikTokPlatformData {
    /// Photo carousels up to 35 images. Video titles up to 2200 chars, photo titles truncated to 90 chars. privacyLevel must match creator_info options. Both camelCase and snake_case accepted.  Creator Inbox (draft mode): Set draft: true to send content to the TikTok Creator Inbox instead of publishing immediately. The creator receives an inbox notification and completes the post using TikTok's editing flow. This maps to TikTok's post_mode: \"MEDIA_UPLOAD\" internally.  Important: The field publish_type is NOT supported. Use draft: true for Creator Inbox flow.  Photo drafts use the /v2/post/publish/content/init/ endpoint with post_mode: \"MEDIA_UPLOAD\". Video drafts use the dedicated /v2/post/publish/inbox/video/init/ endpoint.  When draft: true, the video.upload scope is required. When draft is false or omitted (direct post), the video.publish scope is required. For Creator Inbox, TikTok app version must be 31.8 or higher.
    pub fn new() -> TikTokPlatformData {
        TikTokPlatformData {
            draft: None,
            privacy_level: None,
            allow_comment: None,
            allow_duet: None,
            allow_stitch: None,
            commercial_content_type: None,
            brand_partner_promote: None,
            is_brand_organic_post: None,
            content_preview_confirmed: None,
            express_consent_given: None,
            media_type: None,
            video_cover_timestamp_ms: None,
            video_cover_image_url: None,
            photo_cover_index: None,
            auto_add_music: None,
            video_made_with_ai: None,
            description: None,
        }
    }
}
/// Type of commercial content disclosure
#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
pub enum CommercialContentType {
    #[serde(rename = "none")]
    None,
    #[serde(rename = "brand_organic")]
    BrandOrganic,
    #[serde(rename = "brand_content")]
    BrandContent,
}

impl Default for CommercialContentType {
    fn default() -> CommercialContentType {
        Self::None
    }
}
/// Optional override. Defaults based on provided media items.
#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
pub enum MediaType {
    #[serde(rename = "video")]
    Video,
    #[serde(rename = "photo")]
    Photo,
}

impl Default for MediaType {
    fn default() -> MediaType {
        Self::Video
    }
}
