using System.Collections.Generic;
using Content.Client.Stylesheets;
using Content.Shared.Crayon;
using Content.Shared.Decals;
using Robust.Client.AutoGenerated;
using Robust.Client.Graphics;
using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.CustomControls;
using Robust.Client.UserInterface.XAML;
using Robust.Client.Utility;
using Robust.Shared.Maths;
using Robust.Shared.Utility;
using static Robust.Client.UserInterface.Controls.BaseButton;

namespace Content.Client.Crayon.UI
{
    [GenerateTypedNameReferences]
    public sealed partial class CrayonWindow : DefaultWindow
    {
        public CrayonBoundUserInterface Owner { get; }

        private Dictionary<string, Texture>? _decals;
        private string? _selected;
        private Color _color;

        public CrayonWindow(CrayonBoundUserInterface owner)
        {
            RobustXamlLoader.Load(this);

            Owner = owner;

            Search.OnTextChanged += _ => RefreshList();
        }

        private void RefreshList()
        {
            // Clear
            Grid.RemoveAllChildren();
            if (_decals == null) return;

            var filter = Search.Text;
            foreach (var (decal, tex) in _decals)
            {
                if (!decal.Contains(filter))
                    continue;

                var button = new TextureButton()
                {
                    TextureNormal = tex,
                    Name = decal,
                    ToolTip = decal,
                    Modulate = _color,
                };
                button.OnPressed += ButtonOnPressed;
                if (_selected == decal)
                {
                    var panelContainer = new PanelContainer()
                    {
                        PanelOverride = new StyleBoxFlat()
                        {
                            BackgroundColor = StyleNano.ButtonColorDefault,
                        },
                        Children =
                        {
                            button,
                        },
                    };
                    Grid.AddChild(panelContainer);
                }
                else
                {
                    Grid.AddChild(button);
                }
            }
        }

        private void ButtonOnPressed(ButtonEventArgs obj)
        {
            if (obj.Button.Name == null) return;

            Owner.Select(obj.Button.Name);
            _selected = obj.Button.Name;
            RefreshList();
        }

        public void UpdateState(CrayonBoundUserInterfaceState state)
        {
            _selected = state.Selected;
            _color = state.Color;
            RefreshList();
        }

        public void Populate(IEnumerable<DecalPrototype> prototypes)
        {
            _decals = new Dictionary<string, Texture>();
            foreach (var decalPrototype in prototypes)
            {
                _decals.Add(decalPrototype.ID, decalPrototype.Sprite.Frame0());
            }

            RefreshList();
        }
    }
}
