using System;
using Friflo.Engine.ECS.Systems;
using Microsoft.Xna.Framework;
using Myra.Graphics2D.UI;

namespace LittleSim.UI;

/// <summary>
/// Общие фабрики виджетов Myra для экранов меню — единый стиль и отсутствие дублирования
/// разметки между сценами. Все подписи приходят готовыми строками (локализованными вызывающим).
/// </summary>
internal static class Ui
{
    /// <summary>Акцентный цвет заголовков и активных элементов.</summary>
    public static readonly Color Accent = new(120, 200, 255);

    /// <summary>Приглушённый цвет вторичного текста.</summary>
    public static readonly Color Muted = new(150, 160, 175);

    private const int ButtonWidth = 280;

    /// <summary>Крупный заголовок по центру.</summary>
    public static Label Title(string text) =>
        new()
        {
            Text = text,
            TextColor = Accent,
            HorizontalAlignment = HorizontalAlignment.Center,
        };

    /// <summary>Подпись вторичным цветом по центру.</summary>
    public static Label Subtitle(string text) =>
        new()
        {
            Text = text,
            TextColor = Muted,
            HorizontalAlignment = HorizontalAlignment.Center,
        };

    /// <summary>Кнопка фиксированной ширины с обработчиком клика.</summary>
    public static TextButton Button(string text, Action onClick, int width = ButtonWidth)
    {
        var button = new TextButton
        {
            Text = text,
            Width = width,
            HorizontalAlignment = HorizontalAlignment.Center,
        };
        button.Click += (_, _) => onClick();
        return button;
    }

    /// <summary>Вертикальная колонка по центру экрана.</summary>
    public static VerticalStackPanel Column(int spacing = 10) =>
        new()
        {
            Spacing = spacing,
            HorizontalAlignment = HorizontalAlignment.Center,
            VerticalAlignment = VerticalAlignment.Center,
        };

    /// <summary>Горизонтальный ряд.</summary>
    public static HorizontalStackPanel Row(int spacing = 8) =>
        new() { Spacing = spacing, HorizontalAlignment = HorizontalAlignment.Center };

    /// <summary>Оборачивает содержимое в панель на весь экран (абсолютное позиционирование детей).</summary>
    public static Panel Screen(params Widget[] children)
    {
        var panel = new Panel();
        foreach (var child in children)
        {
            panel.Widgets.Add(child);
        }

        return panel;
    }
}

/// <summary>
/// Минимальная система, вызывающая колбэк каждый кадр обновления. Сцены меню используют её
/// для опроса ввода (Esc/горячие клавиши) без отдельного класса-системы на каждую сцену.
/// </summary>
internal sealed class CallbackSystem(Action update) : BaseSystem
{
    protected override void OnUpdateGroup() => update();
}
