using Friflo.Engine.ECS;
using Microsoft.Xna.Framework;
using MrGameEng.Graphics;

namespace LittleSim.Sim;

/// <summary>
/// Рамка выделения в стиле RimWorld: четыре угловые скобки вокруг выбранного объекта. Реализована
/// как четыре спрайт-сущности на слое-оверлее (<see cref="Scenes.GameLayers.Selection"/>) — их рисует
/// штатный спрайт-рендер, а одна и та же текстура уголка (<c>ui/overlays/selectionbracket</c>)
/// зеркалится во все четыре угла флагами <see cref="SpriteFlip"/> (батчер при флипе меняет только UV,
/// квадрат остаётся на месте). Скобки не имеют <c>PlantGrowth</c>, поэтому не попадают под пикинг и
/// прочие запросы растений. <see cref="Show"/> двигает их к объекту, <see cref="Hide"/> прячет.
/// </summary>
public sealed class SelectionBrackets
{
    // По уголку на каждый угол: исходный арт лежит в левом-нижнем, флип разносит его по остальным.
    private static readonly SpriteFlip[] Corners =
    [
        SpriteFlip.None,
        SpriteFlip.X,
        SpriteFlip.Y,
        SpriteFlip.X | SpriteFlip.Y,
    ];

    private static readonly Color Tint = new(150, 210, 255);

    private readonly Entity[] _brackets = new Entity[4];
    private readonly Texture2DRegion _region;

    /// <summary>Создаёт четыре скрытые скобки на слое <paramref name="layer"/> из текстуры <paramref name="region"/>.</summary>
    public SelectionBrackets(EntityStore store, Texture2DRegion region, LayerId layer)
    {
        _region = region;
        var origin = new Vector2(region.Width / 2f, region.Height / 2f);
        for (var i = 0; i < _brackets.Length; i++)
        {
            _brackets[i] = store.CreateEntity(
                Transform2D.At(Vector2.Zero),
                new Sprite
                {
                    Region = null, // скрыта, пока ничего не выбрано
                    Color = Tint,
                    Origin = origin, // центр текстуры → квад центрируется на позиции
                    Layer = layer,
                    Flip = Corners[i],
                }
            );
        }
    }

    /// <summary>Ставит рамку вокруг точки <paramref name="center"/> с полуразмером <paramref name="radius"/>.</summary>
    public void Show(Vector2 center, float radius)
    {
        // Квад чуть больше объекта — скобки садятся снаружи (как в RimWorld); арт-уголок ~⅓ ширины.
        var scale = new Vector2(radius * 2.2f / _region.Width);
        for (var i = 0; i < _brackets.Length; i++)
        {
            ref var transform = ref _brackets[i].GetComponent<Transform2D>();
            ref var sprite = ref _brackets[i].GetComponent<Sprite>();
            transform.Position = center;
            transform.Scale = scale;
            sprite.Region = _region;
        }
    }

    /// <summary>Прячет рамку (сбрасывает регион — рендер пропускает спрайты без текстуры).</summary>
    public void Hide()
    {
        for (var i = 0; i < _brackets.Length; i++)
        {
            _brackets[i].GetComponent<Sprite>().Region = null;
        }
    }
}
