using GmRelay.Shared.Domain;

namespace GmRelay.Bot.Tests.Domain;

public sealed class GameSystemTests
{
    [Theory]
    [InlineData("Dnd5e", GameSystem.Dnd5e)]
    [InlineData("D&D", GameSystem.Dnd5e)]
    [InlineData("dnd5e", GameSystem.Dnd5e)]
    [InlineData("  dnd5e  ", GameSystem.Dnd5e)]
    [InlineData("D&D 5e", GameSystem.Dnd5e)]
    [InlineData("pathfinder", GameSystem.Pathfinder2e)]
    [InlineData("call of cthulhu", GameSystem.CallOfCthulhu7e)]
    [InlineData("shadow", GameSystem.Shadowdark)]
    [InlineData("dark", GameSystem.Shadowdark)]
    [InlineData("unknown xyz", GameSystem.Other)]
    public void TryParseFuzzy_ShouldMapInputToExpectedSystem(string input, GameSystem expected)
    {
        var result = GameSystemExtensions.TryParseFuzzy(input);

        Assert.Equal(expected, result);
    }

    [Theory]
    [InlineData("днд")]
    [InlineData("колова")]
    public void TryParseFuzzy_ShouldReturnOtherForUnmatchedCyrillicInput(string input)
    {
        var result = GameSystemExtensions.TryParseFuzzy(input);

        Assert.Equal(GameSystem.Other, result);
    }

    [Fact]
    public void TryParseFuzzy_ShouldReturnNullForNullInput()
    {
        var result = GameSystemExtensions.TryParseFuzzy(null!);

        Assert.Null(result);
    }

    [Theory]
    [InlineData("")]
    [InlineData("   ")]
    public void TryParseFuzzy_ShouldReturnNullForEmptyOrWhitespaceInput(string input)
    {
        var result = GameSystemExtensions.TryParseFuzzy(input);

        Assert.Null(result);
    }

    [Theory]
    [InlineData(GameSystem.Dnd5e, "D&D 5e")]
    [InlineData(GameSystem.Other, "Другое")]
    [InlineData(GameSystem.Pathfinder2e, "Pathfinder 2e")]
    [InlineData(GameSystem.Shadowdark, "Shadowdark")]
    [InlineData((GameSystem)999, "Другое")]
    public void ToDisplayName_ShouldReturnExpectedName(GameSystem system, string expected)
    {
        var result = system.ToDisplayName();

        Assert.Equal(expected, result);
    }
}
