using LittleSim.App;
using Microsoft.Xna.Framework;
using MrGameEng.Core;
using MrGameEng.Graphics;
using MrGameEng.UI;
using Myra.Graphics2D.UI;

namespace LittleSim.UI;

/// <summary>
/// Масштаб интерфейса для Myra-десктопа. Scale увеличивает всю отрисовку, а <c>BoundsFetcher</c>
/// отдаёт логический размер «экран ÷ масштаб», поэтому раскладка перетекает (а не обрезается):
/// при масштабе 1.25 виджеты крупнее, но углы/центры остаются прижаты к краям экрана. Ввод Myra
/// трансформируется тем же преобразованием, так что попадания/<c>IsMouseOverGUI</c> остаются верными.
/// </summary>
internal static class UiScaling
{
    /// <summary>Применяет масштаб <paramref name="scale"/> (клампится в разумные пределы) к десктопу.</summary>
    public static void Apply(EngineContext context, Desktop desktop, float scale)
    {
        scale = System.Math.Clamp(scale, 0.75f, 2f);
        desktop.TransformOrigin = Vector2.Zero; // масштабируем от левого-верхнего угла — края на месте
        desktop.Scale = new Vector2(scale);
        desktop.BoundsFetcher = () =>
        {
            var viewport = context.GetGraphicsDevice().Viewport;
            return new Rectangle(
                0,
                0,
                (int)MathF.Round(viewport.Width / scale),
                (int)MathF.Round(viewport.Height / scale)
            );
        };
    }
}

/// <summary>Расширение сцены: создаёт Myra-десктоп и сразу применяет масштаб UI из настроек.</summary>
internal static class ScaledUiExtensions
{
    /// <summary>Как <c>UseUI</c>, но десктоп уже масштабирован по <see cref="GameSettings.UiScale"/>.</summary>
    public static Desktop UseScaledUI(this Scene scene)
    {
        var desktop = scene.UseUI();
        UiScaling.Apply(scene.Context, desktop, GameSettingsStore.Load().UiScale);
        return desktop;
    }
}
