using RioJoy.Core.Overlay;
using Xunit;

namespace RioJoy.Core.Tests.Overlay;

public class GoobieDataImporterTests
{
    private const string Sample = """
        ; a comment, ignored
        ( a-00 b-00 b-01 b-02 )
        ( "tag" "FIRE" "" "GEAR UP" )
        """;

    [Fact]
    public void Parse_ReadsFieldsAndRow()
    {
        GoobieDataImporter.Sheet sheet = GoobieDataImporter.Parse(Sample);

        Assert.Equal(new[] { "a-00", "b-00", "b-01", "b-02" }, sheet.Fields);
        Assert.Single(sheet.Rows);
        Assert.Equal("tag", sheet.Rows[0]["a-00"]);
        Assert.Equal("FIRE", sheet.Rows[0]["b-00"]);
        Assert.Equal("GEAR UP", sheet.Rows[0]["b-02"]); // quoted strings keep spaces
    }

    [Fact]
    public void LabelsForRow_DropsEmptyValues()
    {
        IDictionary<string, string> labels =
            GoobieDataImporter.LabelsForRow(GoobieDataImporter.Parse(Sample));

        Assert.True(labels.ContainsKey("b-00"));
        Assert.False(labels.ContainsKey("b-01")); // empty string dropped
        Assert.Equal(3, labels.Count);            // a-00, b-00, b-02
    }

    [Fact]
    public void Parse_Field0_IsTheRowFileTag()
    {
        GoobieDataImporter.Sheet sheet = GoobieDataImporter.Parse(Sample);
        Assert.Equal("a-00", sheet.Fields[0]);
        Assert.Equal("tag", sheet.Rows[0][sheet.Fields[0]]);
    }

    [Fact]
    public void Loads_RealTestDataFile()
    {
        GoobieDataImporter.Sheet sheet = GoobieDataImporter.Load(TestRepo.CustomBackground("TEST.data"));

        Assert.Equal("a-00", sheet.Fields[0]);
        Assert.NotEmpty(sheet.Rows);
        // Header: ( a-00 b-00 b-01 ... )  Row0: ( "defalt" "LSDI" "ZOOM" ... )
        Assert.Equal("defalt", sheet.Rows[0]["a-00"]);
        Assert.Equal("LSDI", sheet.Rows[0]["b-00"]);
        Assert.Equal("ZOOM", sheet.Rows[0]["b-01"]);
    }
}
