using TeleWave.Domain.Broadcast;

namespace TeleWave.Application.Common.Interfaces;

/// <summary>Готовая строка заставки: роль, цвет из палитры блока и уже подставленный текст.</summary>
public sealed record BumperRenderLine(BumperLineStyle Style, BumperLineColor Color, string Text);

/// <summary>
/// Полная спецификация одной заставки для рендера: оформление блока + готовые строки. Плейсхолдеры
/// в <see cref="Lines"/> уже подставлены — рендер работает с текстом, а не с шаблоном.
/// <see cref="DurationSeconds"/> уже выровнена на длину сегмента (готовит оркестратор), а
/// <see cref="FontFile"/> — абсолютный путь к TTF внутри контейнера.
/// </summary>
public sealed record BumperRenderSpec(
    int DurationSeconds,
    int Width,
    int Height,
    string BackgroundColor,
    string BackgroundColor2,
    string AccentColor,
    string TextColor,
    string FontFile,
    IReadOnlyList<BumperRenderLine> Lines,
    string? BackgroundFile = null,
    string? MusicFile = null,
    /// <summary>Постер шоу как фон (используется, если подблок его запросил; затемняется).</summary>
    string? PosterFile = null,
    /// <summary>
    /// Готовый ролик как подложка: плейлист ассета из библиотеки. Побеждает остальные источники —
    /// это самый явный выбор из всех, его не подставляют молча.
    /// </summary>
    string? ClipFile = null,
    /// <summary>
    /// Брать звук из самого ролика. Ставится, когда у блока нет джингла: подкладывать под чужую
    /// заставку синтезированный писк хуже, чем оставить её собственную дорожку.
    /// </summary>
    bool UseClipAudio = false
);

/// <summary>Итог рендера заставки — та же форма метаданных, что у обычного ассета после нарезки.</summary>
public sealed record BumperRenderResult(
    TimeSpan Duration,
    int SegmentSeconds,
    int SegmentCount,
    int Width,
    int Height,
    string RelativePath
);

/// <summary>
/// Порт рендера ТВ-заставок. Реализация синтезирует короткий клип (анимированный фон + строки текста
/// + джингл) по <see cref="BumperRenderSpec"/> и режет его на HLS-сегменты в assets/{assetId} — так
/// же, как обычный ассет, чтобы раздача эфира не отличала заставку от программы.
/// </summary>
public interface IBumperRenderer
{
    Task<BumperRenderResult> RenderAsync(
        Guid assetId,
        BumperRenderSpec spec,
        CancellationToken cancellationToken
    );
}
