namespace TeleWave.Infrastructure.Media;

public sealed class MediaOptions
{
    public const string SectionName = "Media";

    public string FfmpegPath { get; init; } = "ffmpeg";
    public string FfprobePath { get; init; } = "ffprobe";

    /// <summary>Максимальный размер загружаемого файла, байт (по умолчанию 20 ГБ).</summary>
    public long MaxUploadBytes { get; init; } = 20L * 1024 * 1024 * 1024;

    /// <summary>Число потоков одного ffmpeg (0 — авто/все ядра). На многоядерных лучше сочетать с
    /// <see cref="MaxParallelTranscodes"/>: несколько файлов по меньшему числу потоков дают больший
    /// суммарный throughput, чем один файл на всех ядрах.</summary>
    public int TranscodeThreads { get; init; } = 3;

    /// <summary>Сколько файлов транскодировать одновременно (по умолчанию 1 — как было). Подбирается
    /// под ядра: ориентир — <c>ядра / TranscodeThreads</c>, но не больше, чем позволяет память/диск.</summary>
    public int MaxParallelTranscodes { get; init; } = 1;

    /// <summary>Период опроса inbox/ сканером, секунды.</summary>
    public int InboxScanSeconds { get; init; } = 15;

    /// <summary>
    /// Заводить фильм по файлу из inbox/ автоматически, когда имя уверенно опознано в источнике
    /// метаданных. Неуверенное совпадение всё равно остаётся человеку — файл станет ассетом без шоу
    /// и попадёт в разбор. Выключить стоит, если inbox наполняется сериалами: у них имя опознаётся
    /// как фильм ровно никогда, и лишние запросы к источнику ни к чему.
    /// </summary>
    public bool InboxAutoMovies { get; init; } = true;

    /// <summary>Нормализовать громкость при обработке (ffmpeg loudnorm, EBU R128) — чтобы все ролики
    /// звучали одинаково.</summary>
    public bool NormalizeLoudness { get; init; } = true;

    /// <summary>Целевая интегральная громкость, LUFS (−16 — типично для стриминга; тише — уменьшить).</summary>
    public int LoudnessTargetLufs { get; init; } = -16;

    /// <summary>Таймаут одного вызова ffprobe, секунды (0 — без таймаута). Пробирование метаданных —
    /// быстрая операция; страхует от подвисшего ffprobe на битом/сетевом источнике.</summary>
    public int ProbeTimeoutSeconds { get; init; } = 120;

    /// <summary>Таймаут одного вызова ffmpeg (транскод/рендер заставки), секунды (0 — без таймаута).
    /// Не даёт зависшему процессу вечно держать слот параллелизма. Поднять для очень длинных файлов.</summary>
    public int TranscodeTimeoutSeconds { get; init; } = 1800;

    /// <summary>Предпочитаемые языки аудиодорожек по умолчанию, через запятую в порядке приоритета
    /// (напр. «rus,eng»). Используется, если админ не задал список в настройках сайта. Пусто — без
    /// предпочтения (дефолтный выбор ffmpeg).</summary>
    public string PreferredAudioLanguages { get; init; } = string.Empty;
}
