using System.Numerics;
using Dalamud.Bindings.ImGui;
using Dalamud.Interface.Utility;
using Dalamud.Interface.Windowing;
using Dalamud.Utility;
using HellionChat.Util;
using Lumina.Text.ReadOnly;

namespace HellionChat.Ui;

public class CommandHelpWindow : Window
{
    private ChatLogWindow LogWindow { get; }
    private ReadOnlySeString? CommandDescription { get; set; }

    internal CommandHelpWindow(ChatLogWindow logWindow)
        : base("command help##chat2-commandhelp")
    {
        LogWindow = logWindow;

        Flags =
            ImGuiWindowFlags.NoSavedSettings
            | ImGuiWindowFlags.NoTitleBar
            | ImGuiWindowFlags.NoMove
            | ImGuiWindowFlags.NoResize
            | ImGuiWindowFlags.NoFocusOnAppearing
            | ImGuiWindowFlags.AlwaysAutoResize;

        RespectCloseHotkey = false;
        DisableWindowSounds = true;
    }

    // Sets IsOpen to true if it should be drawn
    public void UpdateContent(ReadOnlySeString commandDesc)
    {
        CommandDescription = commandDesc;

        var width = 350;
        var scaledWidth = width * ImGuiHelpers.GlobalScale;
        var pos = LogWindow.LastWindowPos;
        switch (Plugin.Config.CommandHelpSide)
        {
            case CommandHelpSide.Right:
                pos.X += LogWindow.LastWindowSize.X;
                break;
            case CommandHelpSide.Left:
                pos.X -= scaledWidth;
                break;
            case CommandHelpSide.None:
            default:
                IsOpen = false;
                return;
        }

        Position = pos;
        SizeConstraints = new WindowSizeConstraints
        {
            // Use scaledWidth here so the size constraints stay in the same
            // coordinate space as Position above; otherwise the help window
            // ends up the wrong width at non-100% DPI.
            MinimumSize = new Vector2(scaledWidth, 0),
            MaximumSize = LogWindow.LastWindowSize with { X = scaledWidth },
        };

        IsOpen = true;
    }

    public override void Draw()
    {
        if (CommandDescription == null)
            return;

        LogWindow.DrawChunks(
            ChunkUtil
                .ToChunks(CommandDescription.Value.ToDalamudString(), ChunkSource.None, null)
                .ToList()
        );
    }
}
