using RioJoy.Core.Overlay;
using Xunit;

namespace RioJoy.Core.Tests.Overlay;

/// <summary>
/// Regression tests over the committed cockpit <c>regions.json</c> extracted from
/// riojoy.xcf by tools/XcfRegionExtract. Anchors the extracted geometry and proves
/// the asset loads through <see cref="OverlayTemplateStore"/>.
/// </summary>
public class CockpitRegionsTests
{
    private static OverlayTemplate Load() =>
        OverlayTemplateStore.Load(TestRepo.CustomBackground("regions.json"));

    [Fact]
    public void Loads_WithExpectedCanvasAndCount()
    {
        OverlayTemplate t = Load();
        Assert.Equal(2720, t.Width);
        Assert.Equal(600, t.Height);
        Assert.Equal(119, t.Regions.Count);
    }

    [Fact]
    public void HasExpectedButtonCell()
    {
        OverlayRegion? b00 = Load().FindRegion("b-00");
        Assert.NotNull(b00);
        Assert.Equal(2558, b00!.X, 6);
        Assert.Equal(428, b00.Y, 6);
        Assert.Equal(153, b00.Width, 6);
        Assert.Equal(53, b00.Height, 6);
        Assert.Equal(45, b00.FontSizePx, 6);
        Assert.Equal("Sans", b00.FontFamily);
    }

    [Fact]
    public void IncludesNamedControlLabels()
    {
        OverlayTemplate t = Load();
        Assert.NotNull(t.FindRegion("Throttle"));
        Assert.NotNull(t.FindRegion("Trigger"));
        Assert.NotNull(t.FindRegion("HatUp"));
    }

    [Fact]
    public void VerticalCells_AreTaggedCcw90()
    {
        OverlayTemplate t = Load();
        Assert.Equal(90.0, t.FindRegion("a-00")!.RotationDegrees);
        Assert.Equal(90.0, t.FindRegion("b-10")!.RotationDegrees);
        Assert.Equal(90.0, t.FindRegion("b-1F")!.RotationDegrees);
        Assert.Null(t.FindRegion("b-00")!.RotationDegrees); // a normal upright cell
    }

    [Fact]
    public void AllRegionsLieWithinCanvas()
    {
        OverlayTemplate t = Load();
        Assert.All(t.Regions, r =>
        {
            Assert.True(r.X >= 0 && r.Y >= 0, $"{r.Name} has negative offset");
            Assert.True(r.X + r.Width <= t.Width, $"{r.Name} overflows width");
            Assert.True(r.Y + r.Height <= t.Height, $"{r.Name} overflows height");
        });
    }
}
