use iso8601_timestamp::Timestamp;
use serde::Serialize;
use crate::{
    bot::FieldsBot,
    channel::{ChannelType, FieldsChannel},
    embed::SendableEmbed,
    emoji::EmojiParent,
    member::FieldsMember,
    message::{Interactions, Masquerade, MessageSort, Reply},
    mfa::MFAData,
    permission::{Override, Permission},
    report::{ReportStatus, ReportedContent},
    server::{Category, FieldsRole, FieldsServer, SystemMessageChannels},
    user::{FieldsUser, PartialUserProfile, UserStatus},
};
#[allow(dead_code)]
fn if_false(t: &bool) -> bool {
    !t
}
#[derive(Serialize, Debug, Clone, Default)]
pub struct SendMessageData {
        #[serde(skip_serializing_if = "Option::is_none")]
    pub content: Option<String>,
        #[serde(skip_serializing_if = "Option::is_none")]
    pub attachments: Option<Vec<String>>,
        #[serde(skip_serializing_if = "Option::is_none")]
    pub replies: Option<Vec<Reply>>,
                #[serde(skip_serializing_if = "Option::is_none")]
    pub embeds: Option<Vec<SendableEmbed>>,
        #[serde(skip_serializing_if = "Option::is_none")]
    pub masquerade: Option<Masquerade>,
        #[serde(skip_serializing_if = "Option::is_none")]
    pub interactions: Option<Interactions>,
}
#[derive(Serialize, Debug, Clone, Default)]
pub struct EditUserData {
        #[serde(skip_serializing_if = "Option::is_none")]
    pub status: Option<UserStatus>,
                #[serde(skip_serializing_if = "Option::is_none")]
    pub profile: Option<PartialUserProfile>,
        #[serde(skip_serializing_if = "Option::is_none")]
    pub avatar: Option<String>,
        #[serde(skip_serializing_if = "Option::is_none")]
    pub remove: Option<Vec<FieldsUser>>,
}
#[derive(Serialize, Debug, Clone)]
pub struct ChangeUsernameData {
        pub username: String,
        pub password: String,
}
#[derive(Serialize, Debug, Clone)]
pub struct SendFriendRequestData {
        pub username: String,
}
#[derive(Serialize, Debug, Clone, Default)]
pub struct EditChannelData {
        #[serde(skip_serializing_if = "Option::is_none")]
    pub name: Option<String>,
        #[serde(skip_serializing_if = "Option::is_none")]
    pub description: Option<String>,
        #[serde(skip_serializing_if = "Option::is_none")]
    pub owner: Option<String>,
        #[serde(skip_serializing_if = "Option::is_none")]
    pub icon: Option<String>,
        #[serde(skip_serializing_if = "Option::is_none")]
    pub nsfw: Option<bool>,
        #[serde(skip_serializing_if = "Option::is_none")]
    pub remove: Option<Vec<FieldsChannel>>,
}
#[derive(Serialize, Debug, Clone, Default)]
pub struct SetRolePermissionData {
        pub permissions: Override,
}
#[derive(Serialize, Debug, Clone)]
#[serde(untagged)]
pub enum SetDefaultPermissionData {
    Value {
                                permissions: Permission,
    },
    Field {
                                        permissions: Override,
    },
}
#[derive(Serialize, Debug, Clone, Default)]
pub struct FetchMessagesData {
                #[serde(skip_serializing_if = "Option::is_none")]
    pub limit: Option<i64>,
        #[serde(skip_serializing_if = "Option::is_none")]
    pub before: Option<String>,
        #[serde(skip_serializing_if = "Option::is_none")]
    pub after: Option<String>,
        #[serde(skip_serializing_if = "Option::is_none")]
    pub sort: Option<MessageSort>,
                        #[serde(skip_serializing_if = "Option::is_none")]
    pub nearby: Option<String>,
        #[serde(skip_serializing_if = "Option::is_none")]
    pub include_users: Option<bool>,
}
#[derive(Serialize, Debug, Clone, Default)]
pub struct SearchForMessagesData {
                pub query: String,
        #[serde(skip_serializing_if = "Option::is_none")]
    pub limit: Option<i64>,
        #[serde(skip_serializing_if = "Option::is_none")]
    pub before: Option<String>,
        #[serde(skip_serializing_if = "Option::is_none")]
    pub after: Option<String>,
                #[serde(skip_serializing_if = "Option::is_none")]
    pub sort: Option<MessageSort>,
        #[serde(skip_serializing_if = "Option::is_none")]
    pub include_users: Option<bool>,
}
#[derive(Serialize, Debug, Clone, Default)]
pub struct EditMessageData {
        #[serde(skip_serializing_if = "Option::is_none")]
    pub content: Option<String>,
        #[serde(skip_serializing_if = "Option::is_none")]
    pub embeds: Option<Vec<SendableEmbed>>,
}
#[derive(Serialize, Debug, Clone)]
pub struct BulkDeleteMessagesData {
        pub ids: Vec<String>,
}
#[derive(Serialize, Debug, Clone, Default)]
pub struct RemoveReactionToMessageData {
        #[serde(skip_serializing_if = "Option::is_none")]
    pub user_id: Option<String>,
        #[serde(skip_serializing_if = "Option::is_none")]
    pub remove_all: Option<bool>,
}
#[derive(Serialize, Debug, Clone, Default)]
pub struct CreateGroupData {
        name: String,
        description: Option<String>,
                users: Vec<String>,
        #[serde(skip_serializing_if = "Option::is_none")]
    nsfw: Option<bool>,
}
#[derive(Serialize, Debug, Clone)]
pub struct CreateBotData {
        name: String,
}
#[derive(Serialize, Debug, Clone)]
#[serde(untagged)]
pub enum InviteBotData {
        Server {
                server: String,
    },
        Group {
                group: String,
    },
}
#[derive(Serialize, Debug, Clone, Default)]
pub struct EditBotData {
        #[serde(skip_serializing_if = "Option::is_none")]
    pub name: Option<String>,
        #[serde(skip_serializing_if = "Option::is_none")]
    pub public: Option<bool>,
                #[serde(skip_serializing_if = "Option::is_none")]
    pub analytics: Option<bool>,
        #[serde(skip_serializing_if = "Option::is_none")]
    pub interactions_url: Option<String>,
        #[serde(skip_serializing_if = "Option::is_none")]
    pub remove: Option<Vec<FieldsBot>>,
}
#[derive(Serialize, Debug, Clone, Default)]
pub struct CreateServerData {
        pub name: String,
        pub description: Option<String>,
        #[serde(skip_serializing_if = "Option::is_none")]
    pub nsfw: Option<bool>,
}
#[derive(Serialize, Debug, Clone, Default)]
pub struct EditServerData {
        pub name: Option<String>,
        pub description: Option<String>,
        pub icon: Option<String>,
        pub banner: Option<String>,
        pub categories: Option<Vec<Category>>,
        pub system_messages: Option<SystemMessageChannels>,
        pub nsfw: Option<bool>,
        pub discoverable: Option<bool>,
                pub analytics: Option<bool>,
        pub remove: Option<Vec<FieldsServer>>,
}
#[derive(Serialize, Debug, Clone, Default)]
pub struct CreateChannelData {
        #[serde(rename = "type", default = "ChannelType::default")]
    pub channel_type: ChannelType,
        pub name: String,
        pub description: Option<String>,
        #[serde(skip_serializing_if = "Option::is_none")]
    pub nsfw: Option<bool>,
}
#[derive(Serialize, Debug, Clone)]
pub struct CreateEmojiData {
        pub name: String,
        pub parent: EmojiParent,
        pub nsfw: bool,
}
#[derive(Serialize, Debug, Clone)]
pub struct FetchSettingsData {
        pub keys: Vec<String>,
}
#[derive(Serialize, Debug, Clone)]
pub struct PushSubscribeData {
    pub endpoint: String,
    pub p256dh: String,
    pub auth: String,
}
#[derive(Serialize, Debug, Clone, Default)]
pub struct CreateRoleData {
        pub name: String,
                #[serde(skip_serializing_if = "Option::is_none")]
    pub rank: Option<i64>,
}
#[derive(Serialize, Debug, Clone, Default)]
pub struct EditRoleData {
        #[serde(skip_serializing_if = "Option::is_none")]
    pub name: Option<String>,
        #[serde(skip_serializing_if = "Option::is_none")]
    pub colour: Option<String>,
        #[serde(skip_serializing_if = "Option::is_none")]
    pub hoist: Option<bool>,
                #[serde(skip_serializing_if = "Option::is_none")]
    pub rank: Option<i64>,
        #[serde(skip_serializing_if = "Option::is_none")]
    pub remove: Option<Vec<FieldsRole>>,
}
#[derive(Serialize, Debug, Clone, Default)]
pub struct SetServerRolePermissionData {
        pub permissions: Override,
}
#[derive(Serialize, Debug, Clone, Default)]
pub struct SetDefaultRolePermissionData {
        pub permissions: Override,
}
#[derive(Serialize, Debug, Clone, Default)]
pub struct FetchMembersData {
        #[serde(skip_serializing_if = "if_false")]
    pub exclude_offline: bool,
}
#[derive(Serialize, Debug, Clone, Default)]
pub struct EditMemberData {
        #[serde(skip_serializing_if = "Option::is_none")]
    pub nickname: Option<String>,
        #[serde(skip_serializing_if = "Option::is_none")]
    pub avatar: Option<String>,
        #[serde(skip_serializing_if = "Option::is_none")]
    pub roles: Option<Vec<String>>,
        #[serde(skip_serializing_if = "Option::is_none")]
    pub timeout: Option<Timestamp>,
        #[serde(skip_serializing_if = "Option::is_none")]
    pub remove: Option<Vec<FieldsMember>>,
}
#[derive(Serialize, Debug, Clone, Default)]
pub struct BanUserData {
        #[serde(skip_serializing_if = "Option::is_none")]
    pub reason: Option<String>,
}
#[derive(Serialize, Debug, Clone, Default)]
pub struct CreateAccountData {
        pub email: String,
        pub password: String,
        #[serde(skip_serializing_if = "Option::is_none")]
    pub invite: Option<String>,
        #[serde(skip_serializing_if = "Option::is_none")]
    pub captcha: Option<String>,
}
#[derive(Serialize, Debug, Clone, Default)]
pub struct ResendVerificationData {
        pub email: String,
        #[serde(skip_serializing_if = "Option::is_none")]
    pub captcha: Option<String>,
}
#[derive(Serialize, Debug, Clone)]
pub struct ConfirmAccountDeletionData {
        pub token: String,
}
#[derive(Serialize, Debug, Clone)]
pub struct ChangePasswordData {
        pub password: String,
        pub current_password: String,
}
#[derive(Serialize, Debug, Clone)]
pub struct ChangeEmailData {
        pub email: String,
        pub current_password: String,
}
#[derive(Serialize, Debug, Clone)]
pub struct SendPasswordResetData {
        pub email: String,
        #[serde(skip_serializing_if = "Option::is_none")]
    pub captcha: Option<String>,
}
#[derive(Serialize, Debug, Clone)]
pub struct PasswordResetData {
        pub token: String,
        pub password: String,
        #[serde(default)]
    pub remove_sessions: bool,
}
#[derive(Serialize, Debug, Clone)]
pub struct CompleteOnboardingData {
        pub username: String,
}
#[derive(Serialize, Debug, Clone)]
pub struct EditReportData {
        #[serde(skip_serializing_if = "Option::is_none")]
    pub status: Option<ReportStatus>,
        #[serde(skip_serializing_if = "Option::is_none")]
    pub notes: Option<String>,
}
#[derive(Serialize, Debug, Clone)]
pub struct ReportContentData {
        pub content: ReportedContent,
        #[serde(skip_serializing_if = "Option::is_none")]
    pub additional_context: Option<String>,
}
#[derive(Serialize, Debug, Clone)]
pub struct CreateStrikeData {
        pub user_id: String,
        pub reason: String,
}
#[derive(Serialize, Debug, Clone)]
pub struct EditAccountStrikeData {
        pub reason: String,
}
#[derive(Serialize, Debug, Clone)]
#[serde(untagged)]
pub enum LoginData {
    Email {
                email: String,
                password: String,
                #[serde(skip_serializing_if = "Option::is_none")]
        friendly_name: Option<String>,
    },
    MFA {
                                mfa_ticket: String,
                                #[serde(skip_serializing_if = "Option::is_none")]
        mfa_response: Option<MFAData>,
                #[serde(skip_serializing_if = "Option::is_none")]
        friendly_name: Option<String>,
    },
}
#[derive(Serialize, Debug, Clone, Default)]
pub struct DeleteAllSessionsData {
    #[serde(skip_serializing_if = "if_false")]
    pub revoke_self: bool,
}
#[derive(Serialize, Debug, Clone)]
pub struct EditSessionData {
        pub friendly_name: String,
}
pub type CreateMFATicketData = MFAData;
pub type EnableTOTP2FAData = MFAData;
#[derive(Serialize, Debug, Clone, Default)]
pub struct CreateWebhookData {
        pub name: String,
        #[serde(skip_serializing_if = "Option::is_none")]
    pub avatar: Option<String>,
}