using Kompas.Mcp.Core.Interop;

namespace Kompas.Mcp.Tests;

/// <summary>
/// Разбор значения <c>LocalServer32</c>. Тесты кроссплатформенные намеренно: значения — всегда
/// Windows-пути, но гоняются они и на Linux-раннере, поэтому разбор в локаторе не опирается
/// на <c>Path</c>.
/// </summary>
[Trait("Category", "Unit")]
public sealed class KompasInstallLocatorTests
{
    [Theory]
    // Реальное значение на v24 Home — путь в кавычках.
    [InlineData("\"C:\\Program Files\\ASCON\\KOMPAS-3D v24 Home\\Bin\\kHome.Exe\"",
                "C:\\Program Files\\ASCON\\KOMPAS-3D v24 Home\\Bin\\kHome.Exe")]
    [InlineData("C:\\ASCON\\Bin\\kompas.exe", "C:\\ASCON\\Bin\\kompas.exe")]
    // Без кавычек аргументы отрезаются по расширению, а не по первому пробелу.
    [InlineData("C:\\Program Files\\ASCON\\Bin\\kHome.Exe /automation",
                "C:\\Program Files\\ASCON\\Bin\\kHome.Exe")]
    public void ParseServerCommand_extracts_executable(string raw, string expected)
        => Assert.Equal(expected, KompasInstallLocator.ParseServerCommand(raw));

    [Theory]
    [InlineData(null)]
    [InlineData("")]
    [InlineData("   ")]
    public void ParseServerCommand_returns_null_for_empty(string? raw)
        => Assert.Null(KompasInstallLocator.ParseServerCommand(raw));

    [Fact]
    public void ParseServerCommand_returns_null_for_unclosed_quote()
        => Assert.Null(KompasInstallLocator.ParseServerCommand("\"C:\\ASCON\\Bin\\kHome.Exe"));

    [Fact]
    public void InstallRootFromServerCommand_strips_bin_subdirectory()
    {
        var root = KompasInstallLocator.InstallRootFromServerCommand(
            "\"C:\\Program Files\\ASCON\\KOMPAS-3D v24 Home\\Bin\\kHome.Exe\"");

        Assert.Equal("C:\\Program Files\\ASCON\\KOMPAS-3D v24 Home", root);
    }

    [Fact]
    public void InstallRootFromServerCommand_keeps_directory_when_not_bin()
    {
        var root = KompasInstallLocator.InstallRootFromServerCommand("\"C:\\ASCON\\KOMPAS\\kHome.Exe\"");

        Assert.Equal("C:\\ASCON\\KOMPAS", root);
    }

    [Fact]
    public void InstallRootFromServerCommand_returns_null_for_empty()
        => Assert.Null(KompasInstallLocator.InstallRootFromServerCommand(null));
}
