using RioJoy.Core.Plasma;
using Xunit;

namespace RioJoy.Core.Tests.Plasma;

public class PlasmaCommandsTests
{
    [Fact]
    public void EscSequences_AreCorrect()
    {
        Assert.Equal(new byte[] { 27, (byte)'@' }, PlasmaCommands.Clear());
        Assert.Equal(new byte[] { 27, (byte)'L' }, PlasmaCommands.CursorHome());
        Assert.Equal(new byte[] { 27, (byte)'R', 10 }, PlasmaCommands.CursorX(10));
        Assert.Equal(new byte[] { 27, (byte)'Q', 20 }, PlasmaCommands.CursorY(20));
        Assert.Equal(new byte[] { 27, (byte)'H', 3 }, PlasmaCommands.FontAttr(3));
        Assert.Equal(new byte[] { 27, (byte)'K', 5 }, PlasmaCommands.Font(5));
    }

    [Fact]
    public void Box_DrawAndFill_HaveExpectedLayout()
    {
        Assert.Equal(new byte[] { 27, (byte)'X', 1, 2, 3, 4 }, PlasmaCommands.BoxDraw(1, 2, 3, 4));
        // Fill inserts a leading 0 parameter.
        Assert.Equal(new byte[] { 27, (byte)'x', 0, 1, 2, 3, 4 }, PlasmaCommands.BoxFill(1, 2, 3, 4));
    }

    [Fact]
    public void Text_EncodesOneBytePerChar()
    {
        Assert.Equal(new byte[] { (byte)'A', (byte)'B', (byte)'C' }, PlasmaCommands.Text("ABC"));
    }

    [Theory]
    [InlineData(0, 5, 7)]
    [InlineData(3, 5, 7)]
    [InlineData(4, 10, 14)]
    [InlineData(5, 10, 14)]
    [InlineData(7, 5, 7)]
    public void GetFontSize_MatchesLegacy(int font, int w, int h)
    {
        Assert.Equal(new FontSize(w, h), PlasmaCommands.GetFontSize(font));
    }

    [Fact]
    public void ResolvePosText_ShortText_PicksFont5_AndCenters()
    {
        // "HELLO" (5) is non-score and ≤9 → font 5 (10×14). Centered around (56,15).
        (byte x, byte y, byte font, int len) = PlasmaCommands.ResolvePosText("HELLO", 0, 0, 0);
        Assert.Equal(5, font);
        Assert.Equal(5, len);
        Assert.Equal(31, x); // 56 - (5*10/2)
        Assert.Equal(8, y);  // 15 - (14/2)
    }

    [Fact]
    public void ResolvePosText_LongText_Font2_AndCapsLength()
    {
        string text = new string('1', 24);
        (byte x, byte y, byte font, int len) = PlasmaCommands.ResolvePosText(text, 0, 0, 0);
        Assert.Equal(2, font);
        Assert.Equal(20, len); // capped
        Assert.Equal(6, x);    // 56 - (20*5/2)
        Assert.Equal(12, y);   // 15 - (7/2)
    }

    [Fact]
    public void ResolvePosText_ScoreFont_AndExplicitPosition_Unchanged()
    {
        // font 2 (score) keeps its font; non-zero position is not re-centered.
        (byte x, byte y, byte font, int len) = PlasmaCommands.ResolvePosText("AB", 5, 6, 2);
        Assert.Equal(2, font);
        Assert.Equal(2, len);
        Assert.Equal(5, x);
        Assert.Equal(6, y);
    }
}
