use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use sqlx::FromRow;
use uuid::Uuid;

#[derive(Debug, Clone, Deserialize)]
pub struct NewPageTag {
    pub tag: String,
}

/// Returned by `GET /v1/me/page-tags`. Joins through chapters and
/// mangas so the library Page-tags tab can render the breadcrumb
/// without follow-up requests.
#[derive(Debug, Clone, Serialize, FromRow)]
pub struct TaggedPageItem {
    pub tag: String,
    pub page_id: Uuid,
    pub chapter_id: Uuid,
    pub manga_id: Uuid,
    pub page_number: i32,
    pub chapter_number: i32,
    pub chapter_title: Option<String>,
    pub manga_title: String,
    pub storage_key: String,
    pub tagged_at: DateTime<Utc>,
}

/// Distinct-tags histogram row. Used both for autocomplete in the
/// "Add tag" sheet and for the chip cloud in the library Page-tags
/// tab.
#[derive(Debug, Clone, Serialize, FromRow)]
pub struct PageTagSummary {
    pub tag: String,
    pub count: i64,
}

/// One chapter (with breadcrumb) ranked by how many of its pages the
/// caller has tagged with a given tag. Returned by the `/search`
/// page's Chapters tab via `GET /v1/me/page-tags/chapters`.
#[derive(Debug, Clone, Serialize, FromRow)]
pub struct TaggedChapterAggregate {
    pub chapter_id: Uuid,
    pub manga_id: Uuid,
    pub manga_title: String,
    pub chapter_number: i32,
    pub chapter_title: Option<String>,
    pub match_count: i64,
    /// Up to 3 storage keys of matching pages in this chapter,
    /// page-number ascending. Powers the thumbnail strip in the row.
    pub sample_storage_keys: Vec<String>,
}

/// One manga ranked by how many of its pages (across all chapters)
/// the caller has tagged with a given tag. Returned by the `/search`
/// page's Mangas tab.
#[derive(Debug, Clone, Serialize, FromRow)]
pub struct TaggedMangaAggregate {
    pub manga_id: Uuid,
    pub manga_title: String,
    pub manga_cover_image_path: Option<String>,
    pub match_count: i64,
    pub sample_storage_keys: Vec<String>,
}
