using FluentAssertions;

namespace SatelliteProvider.Tests;

public class ToolingConfigurationTests
{
    [Fact]
    public void EditorConfig_ExistsAtRoot_AZ372_AC1()
    {
        var path = LocateRepoFile(".editorconfig");

        path.Should().NotBeNull(".editorconfig must exist at the workspace root for `dotnet format` to honor formatting rules");

        var content = File.ReadAllText(path!);
        content.Should().Contain("root = true");
        content.Should().Contain("indent_style = space");
        content.Should().Contain("end_of_line = lf");
        content.Should().Contain("insert_final_newline = true");
        content.Should().Contain("trim_trailing_whitespace = true");
    }

    [Fact]
    public void EditorConfig_DefinesInitialAnalyzerRuleset_AZ372_AC3()
    {
        var path = LocateRepoFile(".editorconfig");
        path.Should().NotBeNull();

        var content = File.ReadAllText(path!);

        content.Should().Contain("dotnet_diagnostic.CA1001.severity = warning");
        content.Should().Contain("dotnet_diagnostic.CA1051.severity = warning");
        content.Should().Contain("dotnet_diagnostic.CA1816.severity = warning");
        content.Should().Contain("dotnet_diagnostic.CA2227.severity = warning");
    }

    [Fact]
    public void DirectoryBuildProps_ExistsAtRoot_AZ372_AC3()
    {
        var path = LocateRepoFile("Directory.Build.props");
        path.Should().NotBeNull("Directory.Build.props centralizes analyzer settings for every csproj");

        var content = File.ReadAllText(path!);

        content.Should().Contain("<EnableNETAnalyzers>true</EnableNETAnalyzers>");
        content.Should().Contain("<AnalysisLevel>latest</AnalysisLevel>");
        content.Should().Contain("<AnalysisMode>None</AnalysisMode>",
            "AnalysisMode=None ensures only rules explicitly enabled in .editorconfig fire; protects against analyzer flood");
    }

    [Fact]
    public void RunTestsScript_WiresFormatVerify_AZ372_AC1()
    {
        var path = LocateRepoFile(Path.Combine("scripts", "run-tests.sh"));
        path.Should().NotBeNull();

        var content = File.ReadAllText(path!);

        content.Should().Contain("dotnet format whitespace");
        content.Should().Contain("--verify-no-changes",
            "AC-1 requires the script to gate on whitespace conformance via dotnet format");
    }

    [Fact]
    public void RunTestsScript_CollectsCoverage_AZ372_AC2()
    {
        var path = LocateRepoFile(Path.Combine("scripts", "run-tests.sh"));
        path.Should().NotBeNull();

        var content = File.ReadAllText(path!);

        content.Should().Contain("XPlat Code Coverage");
    }

    [Fact]
    public void TestProject_ReferencesCoverletCollector_AZ372_AC2()
    {
        var path = LocateRepoFile(Path.Combine("SatelliteProvider.Tests", "SatelliteProvider.Tests.csproj"));
        path.Should().NotBeNull();

        var content = File.ReadAllText(path!);

        content.Should().Contain("coverlet.collector",
            "Coverlet collector is the data collector that produces XPlat Code Coverage reports");
    }

    private static string? LocateRepoFile(string relativePath)
    {
        var dir = new DirectoryInfo(Directory.GetCurrentDirectory());
        while (dir is not null)
        {
            var candidate = Path.Combine(dir.FullName, relativePath);
            if (File.Exists(candidate))
            {
                return candidate;
            }
            dir = dir.Parent;
        }
        return null;
    }
}
