using TeleWave.Domain.Library;

namespace TeleWave.Application.Metadata;

/// <summary>
/// Кандидат из поиска по названию в источнике метаданных. <paramref name="Kind"/> — что нашлось,
/// сериал или полнометражка (null — источник ищет только по одному типу и различать нечего);
/// в выдаче, где вперемешку и то и другое, без этого «Фарго» 1996 и «Фарго» 2014 не различить.
/// </summary>
public sealed record MetadataCandidate(
    string ExternalId,
    string Title,
    int? Year,
    string? Overview,
    string? PosterUrl,
    ShowKind? Kind = null,
    /// <summary>Название на языке оригинала (у OMDb таких данных нет — null).</summary>
    string? OriginalTitle = null
);

/// <summary>
/// Метаданные шоу из источника (PosterUrl — полный URL, скачивается локально при применении).
/// <paramref name="Genres"/> — сырые обозначения жанров в том порядке, в каком их отдал источник:
/// идентификаторы (<c>tmdb:28</c>) и названия вперемешку. Сопоставление со справочником —
/// на стороне приложения (см. GenreMatcher); первый распознанный становится основным жанром шоу.
/// <paramref name="ContentRating"/> — возрастной рейтинг ровно в том написании, в каком его отдал
/// источник (<c>PG-13</c>, <c>TV-14</c>, <c>Not Rated</c>); приведение к шкале — тоже на стороне
/// приложения (см. ContentRating), чтобы таблица соответствий жила в одном месте на все источники.
/// </summary>
public sealed record ShowMetadata(
    string ExternalId,
    string Title,
    int? Year,
    string? Overview,
    string? PosterUrl,
    IReadOnlyList<string>? Genres = null,
    string? ContentRating = null,
    /// <summary>Франшиза по данным источника (у OMDb таких данных нет — null).</summary>
    MetadataFranchise? Franchise = null,
    /// <summary>
    /// Название на языке оригинала. Нужно и как подпись, и как ключ поиска: релизы называются
    /// латиницей, а <see cref="Title"/> у русской локали источника русский.
    /// </summary>
    string? OriginalTitle = null
);

/// <summary>Метаданные серии (для этапа 2).</summary>
public sealed record EpisodeMetadata(
    string Title,
    string? Overview,
    string? StillUrl,
    DateOnly? AirDate
);
