use serde::{Deserialize, Serialize};
use crate::{
    channel::{Channel, FieldsChannel, PartialChannel},
    emoji::Emoji,
    member::{FieldsMember, Member, MemberCompositeKey, PartialMember},
    message::{AppendMessage, Message, PartialMessage},
    report::Report,
    server::{FieldsRole, FieldsServer, PartialRole, PartialServer, Server},
    user::{FieldsUser, PartialUser, RelationshipStatus, User, UserSettings},
    webhook::{FieldsWebhook, PartialWebhook, Webhook},
};
#[derive(Deserialize, Debug, Clone, Eq, PartialEq)]
#[serde(tag = "type")]
pub enum ErrorId {
    LabelMe,
    InternalError {
        at: String,
    },
    InvalidSenssion,
    OnboardingNotFinished,
    AlreadyAuthenticated,
    MalformedData {
        msg: String,
    },
    #[serde(other)]
    Unknown,
}
#[derive(Deserialize, Debug, Clone)]
#[serde(tag = "type")]
pub enum ServerEvent {
        Bulk(BulkEvent),
        Error(ErrorEvent),
        Authenticated,
        Ready(ReadyEvent),
        Pong(PongEvent),
        Message(Message),
        MessageUpdate(MessageUpdateEvent),
        MessageAppend(MessageAppendEvent),
        MessageDelete(MessageDeleteEvent),
        MessageReact(MessageReactEvent),
        MessageUnreact(MessageUnreactEvent),
        MessageRemoveReaction(MessageRemoveReactionEvent),
        BulkMessageDelete(BulkMessageDeleteEvent),
        ChannelCreate(Channel),
        ChannelUpdate(ChannelUpdateEvent),
        ChannelDelete(ChannelDeleteEvent),
        ChannelGroupJoin(ChannelGroupJoinEvent),
        ChannelGroupLeave(ChannelGroupLeaveEvent),
        ChannelStartTyping(ChannelStartTypingEvent),
        ChannelStopTyping(ChannelStopTypingEvent),
        ChannelAck(ChannelAckEvent),
        ServerCreate(ServerCreateEvent),
        ServerUpdate(ServerUpdateEvent),
        ServerDelete(ServerDeleteEvent),
        ServerMemberUpdate(ServerMemberUpdateEvent),
        ServerMemberJoin(ServerMemberJoinEvent),
        ServerMemberLeave(ServerMemberLeaveEvent),
        ServerRoleUpdate(ServerRoleUpdateEvent),
        ServerRoleDelete(ServerRoleDeleteEvent),
        UserUpdate(UserUpdateEvent),
        UserRelationship(UserRelationshipEvent),
        UserSettingsUpdate(UserSettingsUpdateEvent),
                                        UserPlatformWipe(UserPlatformWipeEvent),
        EmojiCreate(Emoji),
        EmojiDelete(EmojiDeleteEvent),
        WebhookCreate(Webhook),
        WebhookUpdate(WebhookUpdateEvent),
        WebhookDelete(WebhookDeleteEvent),
        ReportCreate(Report),
        Auth(AuthifierEvent),
                #[serde(other)]
    Unknown,
}
#[derive(Serialize, Debug, Clone, Eq, PartialEq)]
#[serde(tag = "type")]
pub enum ClientEvent {
    Authenticate { token: String },
    Ping { data: i32 },
    BeginTyping { channel: String },
    EndTyping { channel: String },
}
#[derive(Serialize, Deserialize, Debug, Clone)]
#[serde(tag = "event_type")]
pub enum AuthifierEvent {
    DeleteSession {
        user_id: String,
        session_id: String,
    },
    DeleteAllSessions {
        user_id: String,
        exclude_session_id: Option<String>,
    },
}
#[derive(Deserialize, Debug, Clone)]
pub struct BulkEvent {
        pub v: Vec<ServerEvent>,
}
#[derive(Deserialize, Debug, Clone)]
pub struct ErrorEvent {
        pub error: ErrorId,
}
#[derive(Deserialize, Debug, Clone)]
pub struct ReadyEvent {
        pub users: Vec<User>,
        pub servers: Vec<Server>,
        pub channels: Vec<Channel>,
        pub members: Vec<Member>,
        pub emojis: Option<Vec<Emoji>>,
}
#[derive(Deserialize, Debug, Clone)]
pub struct PongEvent {
        pub data: u32,
}
#[derive(Deserialize, Debug, Clone)]
pub struct MessageUpdateEvent {
        pub id: String,
        pub channel: String,
        pub data: PartialMessage,
}
#[derive(Deserialize, Debug, Clone)]
pub struct MessageAppendEvent {
        pub id: String,
        pub channel: String,
        pub append: AppendMessage,
}
#[derive(Deserialize, Debug, Clone)]
pub struct MessageDeleteEvent {
        pub id: String,
        pub channel: String,
}
#[derive(Deserialize, Debug, Clone)]
pub struct MessageReactEvent {
        pub id: String,
        pub channel_id: String,
        pub user_id: String,
        pub emoji_id: String,
}
#[derive(Deserialize, Debug, Clone)]
pub struct MessageUnreactEvent {
        pub id: String,
        pub channel_id: String,
        pub user_id: String,
        pub emoji_id: String,
}
#[derive(Deserialize, Debug, Clone)]
pub struct MessageRemoveReactionEvent {
        pub id: String,
        pub channel_id: String,
        pub emoji_id: String,
}
#[derive(Deserialize, Debug, Clone)]
pub struct BulkMessageDeleteEvent {
        pub channel: String,
        pub ids: Vec<String>,
}
#[derive(Deserialize, Debug, Clone)]
pub struct ChannelUpdateEvent {
    pub id: String,
    pub data: PartialChannel,
    pub clear: Vec<FieldsChannel>,
}
#[derive(Deserialize, Debug, Clone)]
pub struct ChannelDeleteEvent {
        pub id: String,
}
#[derive(Deserialize, Debug, Clone)]
pub struct ChannelGroupJoinEvent {
        pub id: String,
        pub user: String,
}
#[derive(Deserialize, Debug, Clone)]
pub struct ChannelGroupLeaveEvent {
        pub id: String,
        pub user: String,
}
#[derive(Deserialize, Debug, Clone)]
pub struct ChannelStartTypingEvent {
        pub id: String,
        pub user: String,
}
#[derive(Deserialize, Debug, Clone)]
pub struct ChannelStopTypingEvent {
        pub id: String,
        pub user: String,
}
#[derive(Deserialize, Debug, Clone)]
pub struct ChannelAckEvent {
        pub id: String,
        pub user: String,
        pub message_id: String,
}
#[derive(Deserialize, Debug, Clone)]
pub struct ServerCreateEvent {
        pub id: String,
        pub server: Server,
        pub channels: Vec<Channel>,
}
#[derive(Deserialize, Debug, Clone)]
pub struct ServerUpdateEvent {
        pub id: String,
        pub data: PartialServer,
        pub clear: Vec<FieldsServer>,
}
#[derive(Deserialize, Debug, Clone)]
pub struct ServerDeleteEvent {
        pub id: String,
}
#[derive(Deserialize, Debug, Clone)]
pub struct ServerMemberUpdateEvent {
        pub id: MemberCompositeKey,
        pub data: PartialMember,
        pub clear: Vec<FieldsMember>,
}
#[derive(Deserialize, Debug, Clone)]
pub struct ServerMemberJoinEvent {
        pub id: String,
        pub user: String,
}
#[derive(Deserialize, Debug, Clone)]
pub struct ServerMemberLeaveEvent {
        pub id: String,
        pub user: String,
}
#[derive(Deserialize, Debug, Clone)]
pub struct ServerRoleUpdateEvent {
        pub id: String,
        pub role_id: String,
        pub data: PartialRole,
        pub clear: Vec<FieldsRole>,
}
#[derive(Deserialize, Debug, Clone)]
pub struct ServerRoleDeleteEvent {
        pub id: String,
        pub role_id: String,
}
#[derive(Deserialize, Debug, Clone)]
pub struct UserUpdateEvent {
        pub id: String,
        pub data: PartialUser,
        pub clear: Vec<FieldsUser>,
}
#[derive(Deserialize, Debug, Clone)]
pub struct UserRelationshipEvent {
    pub id: String,
        pub user: User,
        pub status: RelationshipStatus,
}
#[derive(Deserialize, Debug, Clone)]
pub struct UserSettingsUpdateEvent {
    pub id: String,
        pub update: UserSettings,
}
#[derive(Deserialize, Debug, Clone)]
pub struct UserPlatformWipeEvent {
        pub user_id: String,
        pub flags: i32,
}
#[derive(Deserialize, Debug, Clone)]
pub struct EmojiDeleteEvent {
        pub id: String,
}
#[derive(Deserialize, Debug, Clone)]
pub struct WebhookUpdateEvent {
        pub id: String,
        pub data: PartialWebhook,
        pub remove: Vec<FieldsWebhook>,
}
#[derive(Deserialize, Debug, Clone)]
pub struct WebhookDeleteEvent {
    pub id: String,
}