using System;
using System.Collections.Generic;
using System.Linq;
using System.Numerics;
using Robust.Client.AutoGenerated;
using Robust.Client.Graphics;
using Robust.Client.Placement;
using Robust.Client.UserInterface.XAML;
using Robust.Shared.Graphics;
using Robust.Shared.IoC;
using Robust.Shared.Maths;
using Robust.Shared.Prototypes;

namespace Robust.Client.UserInterface.CustomControls
{
    [GenerateTypedNameReferences]
    public sealed partial class EntitySpawnWindow : DefaultWindow
    {
        [Dependency] private readonly IPlacementManager _placement = default!;

        public EntitySpawnButton? SelectedButton;
        public EntityPrototype? SelectedPrototype;

        [Obsolete("Use IPlacementManager.AllModeNames")]
        public static string[] InitOpts =>IoCManager.Resolve<IPlacementManager>().AllModeNames;
        public EntitySpawnWindow()
        {
            RobustXamlLoader.Load(this);
            IoCManager.InjectDependencies(this);

            MeasureButton.Measure(Vector2Helpers.Infinity);

            var modes = _placement.AllModeNames;
            for (var i = 0; i < modes.Length; i++)
            {
                OverrideMenu.AddItem(modes[i], i);
            }
        }

        // Create a spawn button and insert it into the start or end of the list.
        public EntitySpawnButton InsertEntityButton(EntityPrototype prototype, bool insertFirst, int index)
        {
            var button = new EntitySpawnButton
            {
                Prototype = prototype,
                Index = index // We track this index purely for debugging.
            };
            var entityLabelText = string.IsNullOrEmpty(prototype.Name) ? prototype.ID : prototype.Name;

            if (!string.IsNullOrWhiteSpace(prototype.EditorSuffix))
            {
                entityLabelText += $" [{prototype.EditorSuffix}]";
            }

            button.EntityLabel.Text = entityLabelText;
            button.ActualButton.ToolTip = prototype.Description;

            if (prototype == SelectedPrototype)
            {
                SelectedButton = button;
                SelectedButton.ActualButton.Pressed = true;
            }

            var rect = button.EntityTextureRects;
            rect.SetPrototype(prototype.ID);

            PrototypeList.AddChild(button);
            if (insertFirst)
            {
                button.SetPositionInParent(0);
            }

            return button;
        }
    }
}
