namespace TeleWave.Domain.Broadcast;

/// <summary>
/// Кэш отрендеренной ТВ-заставки. Ключ — <see cref="Signature"/>, хэш **содержимого**: оформление
/// блока с его ревизией плюс уже подставленный текст. Ни канала, ни пары шоу в ключе нет намеренно:
/// одинаковая заставка на трёх каналах рендерится один раз, а плейсхолдер вроде <c>{channel}</c>
/// разводит их по разным сигнатурам сам собой.
///
/// Подставленный текст (<see cref="RenderedLinesJson"/>) приходится хранить: время показа из ссылок
/// задним числом не восстанавливается, а ffmpeg запускается фоновым сервисом уже после того, как
/// лента записана.
/// </summary>
public class BumperAsset
{
    public Guid Id { get; private set; }

    /// <summary>Хэш содержимого: блок + ревизия + подблок + подставленные строки + фон.</summary>
    public string Signature { get; private set; } = string.Empty;

    /// <summary>Блок и подблок — оформление рендера и чистка осиротевших ассетов.</summary>
    public Guid TemplateId { get; private set; }
    public Guid VariantId { get; private set; }

    /// <summary>Готовые строки заставки (JSON). Домен их не интерпретирует — схема живёт в Application.</summary>
    public string RenderedLinesJson { get; private set; } = string.Empty;

    /// <summary>Шоу, чей постер идёт фоном, или null (фон блока/градиент).</summary>
    public Guid? PosterShowId { get; private set; }

    /// <summary>
    /// Ассет ролика-подложки, если текст пишется поверх готового видео. Хранится именно ассет,
    /// а не шоу: рендеру нужен конкретный файл, а перезалив ролика обязан дать новую сигнатуру.
    /// </summary>
    public Guid? BackgroundAssetId { get; private set; }

    /// <summary>Сгенерированный ассет-заставка (нарезается в assets/{id} фоновым рендерером).</summary>
    public Guid MediaAssetId { get; private set; }

    public DateTimeOffset CreatedAt { get; private set; }

    private BumperAsset() { }

    public static BumperAsset Create(
        Guid templateId,
        Guid variantId,
        string signature,
        string renderedLinesJson,
        Guid? posterShowId,
        Guid mediaAssetId,
        Guid? backgroundAssetId = null
    ) =>
        new()
        {
            Id = Guid.NewGuid(),
            TemplateId = templateId,
            VariantId = variantId,
            Signature = signature,
            RenderedLinesJson = renderedLinesJson,
            PosterShowId = posterShowId,
            BackgroundAssetId = backgroundAssetId,
            MediaAssetId = mediaAssetId,
            CreatedAt = DateTimeOffset.UtcNow,
        };
}
