using AmiReel.Models;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace AmiReel.Tests.Models;

[TestClass]
public class AppSettingsTests
{
    [TestMethod]
    public void Default_SetsFallbackOutputFolderAndSensibleDefaults()
    {
        // Arrange
        const string outputFolder = @"C:\Videos";

        // Act
        AppSettings settings = AppSettings.Default(outputFolder);

        // Assert
        Assert.AreEqual(outputFolder, settings.OutputFolder);
        Assert.AreEqual("Dark", settings.Theme);
        Assert.AreEqual("Auto", settings.Encoder);
        Assert.IsTrue(settings.ShouldMoveSourcesToOriginals);
    }

    [TestMethod]
    public void ShouldMoveSourcesToOriginals_WhenFlagIsNull_DefaultsToTrue()
    {
        // Arrange
        AppSettings settings = AppSettings.Default(@"C:\Videos") with { MoveSourcesToOriginals = null };

        // Act
        bool result = settings.ShouldMoveSourcesToOriginals;

        // Assert
        Assert.IsTrue(result);
    }

    [TestMethod]
    public void ShouldMoveSourcesToOriginals_WhenFlagIsExplicitlyFalse_ReturnsFalse()
    {
        // Arrange
        AppSettings settings = AppSettings.Default(@"C:\Videos") with { MoveSourcesToOriginals = false };

        // Act
        bool result = settings.ShouldMoveSourcesToOriginals;

        // Assert
        Assert.IsFalse(result);
    }

    [TestMethod]
    public void Normalize_WithBlankOutputFolder_UsesFallback()
    {
        // Arrange
        AppSettings settings = AppSettings.Default("") with { OutputFolder = "   " };

        // Act
        AppSettings normalized = settings.Normalize(@"C:\Fallback");

        // Assert
        Assert.AreEqual(@"C:\Fallback", normalized.OutputFolder);
    }

    [TestMethod]
    public void Normalize_WithBlankTimingValues_RestoresDefaults()
    {
        // Arrange
        AppSettings settings = AppSettings.Default(@"C:\Videos") with
        {
            TrimStart = "",
            FadeSeconds = "  ",
            EndCardHoldSeconds = "",
            ThumbnailInterval = "",
        };

        // Act
        AppSettings normalized = settings.Normalize(@"C:\Videos");

        // Assert
        Assert.AreEqual("4.414", normalized.TrimStart);
        Assert.AreEqual("3", normalized.FadeSeconds);
        Assert.AreEqual("4", normalized.EndCardHoldSeconds);
        Assert.AreEqual("10", normalized.ThumbnailInterval);
    }

    [TestMethod]
    public void Normalize_WithPopulatedValues_KeepsThemUnchanged()
    {
        // Arrange
        AppSettings settings = AppSettings.Default(@"C:\Videos") with
        {
            TrimStart = "1.5",
            FadeSeconds = "2.5",
            Theme = "Light",
            Encoder = "NvidiaNvenc",
        };

        // Act
        AppSettings normalized = settings.Normalize(@"C:\Videos");

        // Assert
        Assert.AreEqual("1.5", normalized.TrimStart);
        Assert.AreEqual("2.5", normalized.FadeSeconds);
        Assert.AreEqual("Light", normalized.Theme);
        Assert.AreEqual("NvidiaNvenc", normalized.Encoder);
    }
}
