using System.Numerics;
using Dalamud.Interface;
using Dalamud.Interface.Components;
using Dalamud.Utility;
using ImGuiNET;
using MareSynchronos.Models;
using MareSynchronos.UI.Handlers;
namespace MareSynchronos.UI.Components;
public class SelectGroupForPairUi
{
    /// 
    /// Should the panel show, yes/no
    /// 
    private bool _show;
    /// 
    /// The group UI is always open for a specific pair. This defines which pair the UI is open for.
    /// 
    /// 
    private Pair? _pair;
    /// 
    /// For the add category option, this stores the currently typed in tag name
    /// 
    private string _tagNameToAdd = "";
    private readonly TagHandler _tagHandler;
    public SelectGroupForPairUi(TagHandler tagHandler)
    {
        _show = false;
        _pair = null;
        _tagHandler = tagHandler;
    }
    public void Open(Pair pair)
    {
        _pair = pair;
        // Using "_show" here to de-couple the opening of the popup
        // The popup name is derived from the name the user currently sees, which is
        // based on the showUidForEntry dictionary.
        // We'd have to derive the name here to open it popup modal here, when the Open() is called
        _show = true;
    }
    public void Draw(Dictionary showUidForEntry)
    {
        if (_pair == null)
        {
            return;
        }
        var name = PairName(showUidForEntry, _pair);
        var popupName = $"Choose Groups for {name}";
        // Is the popup supposed to show but did not open yet? Open it
        if (_show)
        {
            ImGui.OpenPopup(popupName);
            _show = false;
        }
        if (ImGui.BeginPopup(popupName))
        {
            var tags = _tagHandler.GetAllTagsSorted();
            var childHeight = tags.Count != 0 ? tags.Count * 25 : 1;
            var childSize = new Vector2(0, childHeight > 100 ? 100 : childHeight) * ImGuiHelpers.GlobalScale;
            UiShared.FontText($"Select the groups you want {name} to be in.", UiBuilder.DefaultFont);
            if (ImGui.BeginChild(name + "##listGroups", childSize))
            {
                foreach (var tag in tags)
                {
                    UiShared.DrawWithID($"groups-pair-{_pair.UserData.UID}-{tag}", () => DrawGroupName(_pair, tag));
                }
                ImGui.EndChild();
            }
            ImGui.Separator();
            UiShared.FontText($"Create a new group for {name}.", UiBuilder.DefaultFont);
            if (ImGuiComponents.IconButton(FontAwesomeIcon.Plus))
            {
                HandleAddTag();
            }
            ImGui.SameLine();
            ImGui.InputTextWithHint("##category_name", "New Group", ref _tagNameToAdd, 40);
            {
                if (ImGui.IsKeyDown(ImGuiKey.Enter))
                {
                    HandleAddTag();
                }
            }
            ImGui.EndPopup();
        }
    }
    private void DrawGroupName(Pair pair, string name)
    {
        var hasTagBefore = _tagHandler.HasTag(pair.UserPair!, name);
        var hasTag = hasTagBefore;
        if (ImGui.Checkbox(name, ref hasTag))
        {
            if (hasTag)
            {
                _tagHandler.AddTagToPairedUid(pair.UserPair!, name);
            }
            else
            {
                _tagHandler.RemoveTagFromPairedUid(pair.UserPair!, name);
            }
        }
    }
    private void HandleAddTag()
    {
        if (!_tagNameToAdd.IsNullOrWhitespace() && _tagNameToAdd is not (TagHandler.CustomOfflineTag or TagHandler.CustomOnlineTag or TagHandler.CustomVisibleTag))
        {
            _tagHandler.AddTag(_tagNameToAdd);
            if (_pair != null)
            {
                _tagHandler.AddTagToPairedUid(_pair.UserPair!, _tagNameToAdd);
            }
            _tagNameToAdd = string.Empty;
        }
        else
        {
            _tagNameToAdd = string.Empty;
        }
    }
    private string PairName(Dictionary showUidForEntry, Pair pair)
    {
        showUidForEntry.TryGetValue(pair.UserData.UID, out var showUidInsteadOfName);
        var playerText = pair.GetNote();
        if (showUidInsteadOfName || string.IsNullOrEmpty(playerText))
        {
            playerText = pair.UserData.AliasOrUID;
        }
        return playerText;
    }
}