use std::collections::HashSet;
use chrono::{DateTime, NaiveDate, Utc};
use crate::entity::language::Language;
use crate::entity::prelude::{AsStr, Page};
use crate::entity::tvshow_subscription::{TvShowSubscriptionDocument, TvShowSubscriptionEntity};
use crate::entity::{Entity, Relation};
crate::create_kind!(TvShowKind, "tvshows");
pub type TvShowEntity = Entity<u64, TvShowKind>;
#[cfg_attr(feature = "facet", derive(facet::Facet))]
#[derive(Clone, Debug, PartialEq, Eq, serde::Deserialize, serde::Serialize)]
#[serde(rename_all = "camelCase")]
pub struct TvShowDocument {
pub id: u64,
#[serde(rename = "type")]
pub kind: TvShowKind,
pub attributes: TvShowAttributes,
pub relationships: TvShowRelationships,
}
#[cfg_attr(feature = "facet", derive(facet::Facet))]
#[derive(Clone, Debug, PartialEq, Eq, serde::Deserialize, serde::Serialize)]
#[serde(rename_all = "camelCase")]
pub struct TvShowAttributes {
pub source: TvShowSource,
pub original_name: String,
pub original_language: String,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub origin_country: Vec<String>,
pub language: Language,
pub name: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub overview: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub tagline: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub poster_url: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub backdrop_url: Option<String>,
pub homepage: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub first_air_date: Option<NaiveDate>,
pub in_production: bool,
pub adult: bool,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
}
#[cfg_attr(feature = "facet", derive(facet::Facet))]
#[cfg_attr(feature = "facet", repr(C))]
#[derive(Clone, Debug, Default, PartialEq, Eq, Hash, serde::Deserialize, serde::Serialize)]
#[serde(rename_all = "kebab-case")]
pub enum TvShowInclude {
#[default]
Subscription,
}
impl AsStr for TvShowInclude {
fn as_str(&self) -> &str {
match self {
Self::Subscription => "subscription",
}
}
}
impl std::str::FromStr for TvShowInclude {
type Err = crate::entity::prelude::ParseEnumError;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
"subscription" => Ok(Self::Subscription),
other => Err(crate::entity::prelude::ParseEnumError::new(other)),
}
}
}
#[cfg_attr(feature = "facet", derive(facet::Facet))]
#[derive(Clone, Debug, PartialEq, Eq, serde::Deserialize, serde::Serialize)]
#[serde(rename_all = "camelCase")]
pub struct TvShowRelationships {
pub subscription: Relation<TvShowSubscriptionEntity>,
}
#[cfg_attr(feature = "facet", derive(facet::Facet))]
#[cfg_attr(feature = "facet", repr(C))]
#[derive(Clone, Debug, PartialEq, Eq, serde::Deserialize, serde::Serialize)]
#[serde(rename_all = "camelCase", untagged)]
pub enum TvShowRelation {
TvShowSubscription(TvShowSubscriptionDocument),
}
#[cfg_attr(feature = "facet", derive(facet::Facet))]
#[cfg_attr(feature = "facet", repr(C))]
#[derive(Clone, Debug, PartialEq, Eq, serde::Deserialize, serde::Serialize)]
#[serde(rename_all = "camelCase")]
pub enum TvShowSource {
Tmdb { tmdb_id: u64 },
}
#[cfg_attr(feature = "facet", derive(facet::Facet))]
#[derive(Clone, Debug, Default, PartialEq, Eq, serde::Deserialize, serde::Serialize)]
#[serde(rename_all = "camelCase")]
pub struct FindTvShowByIdParams {
pub include: HashSet<TvShowInclude>,
}
impl FindTvShowByIdParams {
pub fn include(mut self, item: TvShowInclude) -> Self {
self.include.insert(item);
self
}
}
#[cfg_attr(feature = "facet", derive(facet::Facet))]
#[derive(Clone, Debug, Default, PartialEq, Eq, serde::Deserialize, serde::Serialize)]
#[serde(rename_all = "camelCase")]
pub struct ListTvShowParams {
#[serde(default, skip_serializing_if = "HashSet::is_empty")]
pub include: HashSet<TvShowInclude>,
#[serde(default, skip_serializing_if = "Page::is_default")]
pub page: Page,
}