using System.Reflection;

namespace ZB.MOM.WW.ScadaBridge.Host.Tests;

/// <summary>
/// WP-17: Tests for Windows Service support.
/// Verifies UseWindowsService() is called in Program.cs.
/// </summary>
public class WindowsServiceTests
{
    [Fact]
    public void ProgramCs_CallsUseWindowsService()
    {
        var hostProjectDir = FindHostProjectDirectory();
        Assert.NotNull(hostProjectDir);

        var programFile = Path.Combine(hostProjectDir, "Program.cs");
        Assert.True(File.Exists(programFile), "Program.cs not found");

        var content = File.ReadAllText(programFile);

        // Verify UseWindowsService() is called for both Central and Site paths
        var occurrences = content.Split("UseWindowsService()").Length - 1;
        Assert.True(occurrences >= 2,
            $"Expected UseWindowsService() to be called at least twice (Central and Site paths), found {occurrences} occurrence(s)");
    }

    [Fact]
    public void HostProject_ReferencesWindowsServicesPackage()
    {
        var hostProjectDir = FindHostProjectDirectory();
        Assert.NotNull(hostProjectDir);

        var csprojFile = Path.Combine(hostProjectDir, "ZB.MOM.WW.ScadaBridge.Host.csproj");
        Assert.True(File.Exists(csprojFile), "ZB.MOM.WW.ScadaBridge.Host.csproj not found");

        var content = File.ReadAllText(csprojFile);
        Assert.Contains("Microsoft.Extensions.Hosting.WindowsServices", 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", "ZB.MOM.WW.ScadaBridge.Host");
            if (Directory.Exists(hostPath))
                return hostPath;
            dir = dir.Parent;
        }

        return null;
    }
}
