namespace TeleWave.Domain.Library;

/// <summary>Одна серия шоу — ссылка на медиа-ассет и позиция в порядке показа + метаданные.</summary>
public class ShowEpisode
{
    public Guid Id { get; private set; }
    public Guid ShowId { get; private set; }
    public Guid MediaAssetId { get; private set; }

    /// <summary>Порядковый номер внутри шоу (может иметь разрывы после удалений).</summary>
    public int Position { get; private set; }

    /// <summary>Распознанные сезон/серия (из имени файла) — база для довыгрузки метаданных.</summary>
    public int? Season { get; private set; }
    public int? Episode { get; private set; }

    // ── Метаданные серии ──
    public string? Title { get; private set; }
    public string? Overview { get; private set; }

    /// <summary>Кадр серии — ссылка на запись общего реестра изображений или null.</summary>
    public Guid? StillImageId { get; private set; }
    public DateOnly? AirDate { get; private set; }

    public DateTimeOffset CreatedAt { get; private set; }

    private ShowEpisode() { }

    internal static ShowEpisode Create(Guid showId, Guid mediaAssetId, int position) =>
        new()
        {
            Id = Guid.NewGuid(),
            ShowId = showId,
            MediaAssetId = mediaAssetId,
            Position = position,
            CreatedAt = DateTimeOffset.UtcNow,
        };

    /// <summary>Проставить распознанные номера сезона/серии.</summary>
    public void SetNumbers(int? season, int? episode)
    {
        Season = season;
        Episode = episode;
    }

    /// <summary>Применить метаданные серии (кадр — уже зарегистрирован в реестре — может быть null).</summary>
    public void ApplyMetadata(
        string? title,
        string? overview,
        Guid? stillImageId,
        DateOnly? airDate
    )
    {
        Title = title;
        Overview = overview;
        if (stillImageId is not null)
            StillImageId = stillImageId;
        AirDate = airDate;
    }

    public void ClearMetadata()
    {
        Title = null;
        Overview = null;
        StillImageId = null;
        AirDate = null;
    }
}
