#![allow(unused)]

use serde::Deserialize;

#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Activities {
    #[serde(rename = "@context")]
    pub(crate) context: String,
    pub(crate) id: String,
    #[serde(rename = "type")]
    pub(crate) activities_type: String,
    pub(crate) ordered_items: Vec<OrderedItem>,
    pub(crate) total_items: i64,
}

#[derive(Debug, Clone, Deserialize)]
pub struct OrderedItem {
    pub(crate) actor: String,
    pub(crate) cc: Vec<String>,
    pub(crate) context: String,
    pub(crate) context_id: Option<i64>,
    #[serde(default, rename = "directMessage")]
    pub(crate) direct_message: bool,
    pub(crate) id: String,
    pub(crate) object: ObjectUnion,
    pub(crate) published: String,
    pub(crate) to: Vec<String>,
    #[serde(rename = "type")]
    pub(crate) ordered_item_type: OrderedItemType,
}

#[derive(Debug, Clone, Deserialize)]
#[serde(untagged)]
pub enum ObjectUnion {
    ObjectClass(Activity),
    String(String),
}

#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Activity {
    pub(crate) actor: String,
    pub(crate) attachment: Vec<Attachment>,
    pub(crate) attributed_to: String,
    pub(crate) cc: Vec<String>,
    pub(crate) content: String,
    pub(crate) context: String,
    pub(crate) conversation: String,
    pub(crate) id: String,
    pub(crate) in_reply_to: Option<String>,
    pub(crate) in_reply_to_status_id: Option<String>,
    pub(crate) published: String,
    pub(crate) summary: Option<String>,
    pub(crate) tag: Vec<Tag>,
    pub(crate) to: Vec<String>,
    #[serde(rename = "type")]
    pub(crate) object_type: OneOfType,
    pub(crate) sensitive: Option<bool>,
    pub(crate) replies_count: Option<i64>,
    pub(crate) replies: Option<ObjectReplies>,
    pub(crate) closed: Option<String>,
    pub(crate) one_of: Option<Vec<OneOf>>,
    pub(crate) source: Option<SourceUnion>,
}

#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Attachment {
    pub(crate) media_type: String,
    pub(crate) name: String,
    #[serde(rename = "type")]
    pub(crate) attachment_type: AttachmentType,
    pub(crate) url: String,
}

#[derive(Debug, Clone, Deserialize)]
pub enum AttachmentType {
    Document,
}

#[derive(Debug, Clone, Deserialize)]
pub enum OneOfType {
    Note,
    Question,
}

#[derive(Debug, Clone, Deserialize)]
pub struct OneOf {
    pub(crate) name: String,
    pub(crate) replies: OneOfReplies,
    #[serde(rename = "type")]
    pub(crate) one_of_type: OneOfType,
}

#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct OneOfReplies {
    pub(crate) total_items: i64,
    #[serde(rename = "type")]
    pub(crate) replies_type: RepliesType,
}

#[derive(Debug, Clone, Deserialize)]
pub enum RepliesType {
    Collection,
}

#[derive(Debug, Clone, Deserialize)]
pub struct ObjectReplies {
    pub(crate) items: Vec<String>,
    #[serde(rename = "type")]
    pub(crate) replies_type: RepliesType,
}

#[derive(Debug, Clone, Deserialize)]
#[serde(untagged)]
pub enum SourceUnion {
    SourceClass(SourceClass),
    String(String),
}

#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SourceClass {
    pub(crate) content: String,
    pub(crate) media_type: String,
}

#[derive(Debug, Clone, Deserialize)]
pub struct Tag {
    pub(crate) href: String,
    pub(crate) name: String,
    #[serde(rename = "type")]
    pub(crate) tag_type: TagType,
}

#[derive(Debug, Clone, Deserialize)]
pub enum TagType {
    Hashtag,
    Mention,
}

#[derive(Debug, Clone, Deserialize)]
pub enum OrderedItemType {
    Announce,
    Create,
}