using System.Reflection;

namespace ScadaLink.Host.Tests;

/// <summary>
/// WP-16: Tests for CoordinatedShutdown configuration.
/// Verifies no Environment.Exit calls exist in source and HOCON config is correct.
/// </summary>
public class CoordinatedShutdownTests
{
    [Fact]
    public void HostSource_DoesNotContainEnvironmentExit()
    {
        var hostProjectDir = FindHostProjectDirectory();
        Assert.NotNull(hostProjectDir);

        var sourceFiles = Directory.GetFiles(hostProjectDir, "*.cs", SearchOption.AllDirectories);
        Assert.NotEmpty(sourceFiles);

        foreach (var file in sourceFiles)
        {
            var content = File.ReadAllText(file);
            Assert.DoesNotContain("Environment.Exit", content,
                StringComparison.Ordinal);
        }
    }

    [Fact]
    public void AkkaHostedService_HoconConfig_IncludesCoordinatedShutdownSettings()
    {
        // Read the AkkaHostedService source to verify HOCON configuration
        var hostProjectDir = FindHostProjectDirectory();
        Assert.NotNull(hostProjectDir);

        var akkaServiceFile = Path.Combine(hostProjectDir, "Actors", "AkkaHostedService.cs");
        Assert.True(File.Exists(akkaServiceFile), $"AkkaHostedService.cs not found at {akkaServiceFile}");

        var content = File.ReadAllText(akkaServiceFile);

        // Verify critical HOCON settings are present
        Assert.Contains("run-by-clr-shutdown-hook = on", content);
        Assert.Contains("run-coordinated-shutdown-when-down = on", content);
    }

    private static string? FindHostProjectDirectory()
    {
        var assemblyDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)!;
        var dir = new DirectoryInfo(assemblyDir);

        while (dir != null)
        {
            var hostPath = Path.Combine(dir.FullName, "src", "ScadaLink.Host");
            if (Directory.Exists(hostPath))
                return hostPath;
            dir = dir.Parent;
        }

        return null;
    }
}
