using System.IO;
using System.Linq;
using System.Text.RegularExpressions;

namespace ZB.MOM.WW.Theme.Tests;

public class StaticAssetsTests
{
    // wwwroot is copied next to the test assembly via the RCL static-web-asset pipeline,
    // but the simplest stable check is against the source tree relative to the test binary.
    private static string Wwwroot =>
        Path.GetFullPath(Path.Combine(AppContext.BaseDirectory,
            "..", "..", "..", "..", "..", "src", "ZB.MOM.WW.Theme", "wwwroot"));

    [Fact]
    public void ThemeCss_exists_and_defines_accent_token()
    {
        var css = File.ReadAllText(Path.Combine(Wwwroot, "css", "theme.css"));
        Assert.Contains("--accent:", css);
        Assert.Contains("--ok:", css);
    }

    [Fact]
    public void ThemeCss_uses_corrected_relative_font_path()
    {
        var css = File.ReadAllText(Path.Combine(Wwwroot, "css", "theme.css"));
        Assert.Contains("url('../fonts/ibm-plex-sans-400.woff2')", css);
        Assert.DoesNotContain("url('fonts/ibm-plex", css); // the latent 404 path is gone
    }

    [Theory]
    [InlineData("ibm-plex-sans-400.woff2")]
    [InlineData("ibm-plex-sans-600.woff2")]
    [InlineData("ibm-plex-mono-500.woff2")]
    public void Fonts_are_vendored(string file) =>
        Assert.True(File.Exists(Path.Combine(Wwwroot, "fonts", file)));

    [Fact]
    public void NavStateScript_ships() =>
        Assert.True(File.Exists(Path.Combine(Wwwroot, "js", "nav-state.js")));

    // Theme-002: .chip-idle pairs the idle background with the matching --idle
    // foreground token (per DESIGN-TOKENS.md), not --ink-soft.
    [Fact]
    public void ChipIdle_pairs_idle_foreground_with_idle_background()
    {
        var css = File.ReadAllText(Path.Combine(Wwwroot, "css", "theme.css"));
        var rule = Regex.Match(css, @"\.chip-idle\s*\{[^}]*\}").Value;
        Assert.Contains("color: var(--idle)", rule);
        Assert.Contains("background: var(--idle-bg)", rule);
        Assert.DoesNotContain("--ink-soft", rule);
    }

    // Theme-003: no hardcoded hex colours appear outside the :root token block in
    // either stylesheet — every shade is a named token.
    [Theory]
    [InlineData("theme.css")]
    [InlineData("layout.css")]
    public void No_hardcoded_hex_outside_root_token_block(string file)
    {
        var css = File.ReadAllText(Path.Combine(Wwwroot, "css", file));

        // Strip the :root { ... } declaration block(s) — the one place hex literals live.
        var withoutRoot = Regex.Replace(css, @":root\s*\{[^}]*\}", string.Empty);

        var hexLiterals = Regex.Matches(withoutRoot, @"#[0-9a-fA-F]{3,8}\b")
            .Select(m => m.Value)
            .ToList();

        Assert.True(hexLiterals.Count == 0,
            $"{file} has hardcoded hex outside :root: {string.Join(", ", hexLiterals)}");
    }
}
