using Dalamud.Bindings.ImGui;
using Dalamud.Plugin.SelfTest;

namespace HellionChat.SelfTests;

// Verifies the FontManager came out of the DI container with every
// handle attached and no atlas-load failure on any of them. ItalicFont
// is allowed to be null when ItalicEnabled is off.
internal sealed class FontManagerCtorSmokeStep : ISelfTestStep
{
    private readonly Plugin plugin;

    public FontManagerCtorSmokeStep(Plugin plugin)
    {
        this.plugin = plugin;
    }

    public string Name => "Hellion Chat - FontManager ctor smoke";

    public SelfTestStepResult RunStep()
    {
        var fm = this.plugin.FontManager;
        if (fm is null)
        {
            ImGui.Text("Plugin.FontManager is null");
            return SelfTestStepResult.Fail;
        }

        if (fm.Axis is null)
        {
            ImGui.Text("Axis handle is null");
            return SelfTestStepResult.Fail;
        }

        if (fm.AxisItalic is null)
        {
            ImGui.Text("AxisItalic handle is null");
            return SelfTestStepResult.Fail;
        }

        if (fm.FontAwesome is null)
        {
            ImGui.Text("FontAwesome handle is null");
            return SelfTestStepResult.Fail;
        }

        if (fm.RegularFont is null)
        {
            ImGui.Text("RegularFont handle is null");
            return SelfTestStepResult.Fail;
        }

        if (Plugin.Config.ItalicEnabled && fm.ItalicFont is null)
        {
            ImGui.Text("ItalicEnabled is on but ItalicFont handle is null");
            return SelfTestStepResult.Fail;
        }

        if (fm.Axis.LoadException is { } e1)
        {
            ImGui.Text($"Axis load exception: {e1.Message}");
            return SelfTestStepResult.Fail;
        }

        if (fm.AxisItalic.LoadException is { } e2)
        {
            ImGui.Text($"AxisItalic load exception: {e2.Message}");
            return SelfTestStepResult.Fail;
        }

        if (fm.FontAwesome.LoadException is { } e3)
        {
            ImGui.Text($"FontAwesome load exception: {e3.Message}");
            return SelfTestStepResult.Fail;
        }

        if (fm.RegularFont.LoadException is { } e4)
        {
            ImGui.Text($"RegularFont load exception: {e4.Message}");
            return SelfTestStepResult.Fail;
        }

        if (fm.ItalicFont?.LoadException is { } e5)
        {
            ImGui.Text($"ItalicFont load exception: {e5.Message}");
            return SelfTestStepResult.Fail;
        }

        return SelfTestStepResult.Pass;
    }

    public void CleanUp() { }
}
