namespace AmiReel.Models;

/// <summary>
/// Persisted user settings (%LOCALAPPDATA%\AmiReel\settings.json). Uses named init
/// properties rather than a positional constructor: several members share the same
/// <see langword="string"/> type (e.g. TrimStart/FadeSeconds/EndCardHoldSeconds), so a
/// positional record would let two arguments be silently transposed at a call site
/// without the compiler catching it.
/// </summary>
public sealed record AppSettings
{
    public required string OutputFolder { get; init; }
    public required string EndCardPath { get; init; }
    public required string FfmpegPath { get; init; }
    public required string FfprobePath { get; init; }
    public required string PreviewPlayerPath { get; init; }
    public required string Theme { get; init; }
    public required string Encoder { get; init; }
    public required string TrimStart { get; init; }
    public required string FadeSeconds { get; init; }
    public required string EndCardHoldSeconds { get; init; }
    public required string ThumbnailInterval { get; init; }
    public bool? MoveSourcesToOriginals { get; init; }

    // Shorts tab defaults (sticky across launches, same as the fields above).
    public string ShortsStyle { get; init; } = "Brand";
    public string ShortsHook { get; init; } = "THIS RAN ON AN AMIGA";
    public string ShortsWebsite { get; init; } = "AMIGADB.NET";
    public string ShortsFontFile { get; init; } = "";
    public string ShortsBackgroundImage { get; init; } = "";
    public string ShortsCrf { get; init; } = "16";
    public string ShortsPreset { get; init; } = "slow";

    public bool ShouldMoveSourcesToOriginals => MoveSourcesToOriginals != false;

    public static AppSettings Default(string outputFolder) => new()
    {
        OutputFolder = outputFolder,
        EndCardPath = "",
        FfmpegPath = "",
        FfprobePath = "",
        PreviewPlayerPath = "",
        Theme = "Dark",
        Encoder = "Auto",
        TrimStart = "4.414",
        FadeSeconds = "3",
        EndCardHoldSeconds = "4",
        ThumbnailInterval = "10",
        MoveSourcesToOriginals = true,
    };

    public AppSettings Normalize(string fallbackOutputFolder) => this with
    {
        OutputFolder = string.IsNullOrWhiteSpace(OutputFolder) ? fallbackOutputFolder : OutputFolder,
        EndCardPath = EndCardPath ?? "",
        FfmpegPath = FfmpegPath ?? "",
        FfprobePath = FfprobePath ?? "",
        PreviewPlayerPath = PreviewPlayerPath ?? "",
        Theme = string.IsNullOrWhiteSpace(Theme) ? "Dark" : Theme,
        Encoder = string.IsNullOrWhiteSpace(Encoder) ? "Auto" : Encoder,
        TrimStart = string.IsNullOrWhiteSpace(TrimStart) ? "4.414" : TrimStart,
        FadeSeconds = string.IsNullOrWhiteSpace(FadeSeconds) ? "3" : FadeSeconds,
        EndCardHoldSeconds = string.IsNullOrWhiteSpace(EndCardHoldSeconds) ? "4" : EndCardHoldSeconds,
        ThumbnailInterval = string.IsNullOrWhiteSpace(ThumbnailInterval) ? "10" : ThumbnailInterval,
        MoveSourcesToOriginals = MoveSourcesToOriginals ?? true,
        ShortsStyle = string.IsNullOrWhiteSpace(ShortsStyle) ? "Brand" : ShortsStyle,
        ShortsHook = ShortsHook ?? "THIS RAN ON AN AMIGA",
        ShortsWebsite = ShortsWebsite ?? "AMIGADB.NET",
        ShortsFontFile = ShortsFontFile ?? "",
        ShortsBackgroundImage = ShortsBackgroundImage ?? "",
        ShortsCrf = string.IsNullOrWhiteSpace(ShortsCrf) ? "16" : ShortsCrf,
        ShortsPreset = string.IsNullOrWhiteSpace(ShortsPreset) ? "slow" : ShortsPreset,
    };
}
