using System.Threading.Tasks;
using LittleSim.App;
using LittleSim.Content;
using LittleSim.UI;
using Microsoft.Xna.Framework;
using MrGameEng.Audio;
using MrGameEng.Core;
using MrGameEng.Host;
using MrGameEng.UI;
using Myra.Graphics2D.UI;

namespace LittleSim.Scenes;

/// <summary>
/// Загрузочный экран. Поднимает аудио и управление скоростью, грузит настройки и применяет
/// окно/громкость, затем грузит контент Core-мода в фоне (чистый CPU/диск — без GPU) с
/// анимированной надписью. По готовности регистрирует сервисы и уходит в главное меню.
/// </summary>
public sealed class BootScene : Scene
{
    private readonly string[] _steps = { "Загрузка", "Loading" };
    private Task<GameContent>? _load;
    private GameSettings _settings = new();
    private Label _label = null!;

    protected override void OnLoad()
    {
        Context.UseAudio();
        Context.UseGameSpeed(1f, 3f, 6f);

        _settings = GameSettingsStore.Load();
        var host = (GameHost)Context.Services.Get<Game>();
        host.Graphics.IsFullScreen = _settings.Fullscreen;
        host.Graphics.SynchronizeWithVerticalRetrace = _settings.VSync;
        host.Graphics.PreferredBackBufferWidth = _settings.Width;
        host.Graphics.PreferredBackBufferHeight = _settings.Height;
        host.Graphics.ApplyChanges();
        Context.Services.Get<AudioManager>().MasterVolume = _settings.Volume;

        var desktop = this.UseUI(); // ставит MyraEnvironment.Game до создания виджетов
        _label = new Label
        {
            TextColor = Ui.Accent,
            HorizontalAlignment = HorizontalAlignment.Center,
            VerticalAlignment = VerticalAlignment.Center,
        };
        desktop.Root = Ui.Screen(_label);

        // Сборка атласов и дефов — без GPU, поэтому безопасно вне главного потока.
        _load = Task.Run(GameContent.Load);
        UpdateSystems.Add(new CallbackSystem(Tick));
    }

    private void Tick()
    {
        var word = _settings.Language == "en" ? _steps[1] : _steps[0];
        var dots = new string('.', (int)(Context.Clock.UnscaledTotalTime * 2) % 4);
        _label.Text = word + dots;

        if (_load is null || !_load.IsCompleted || Context.Scenes.IsTransitioning)
        {
            return;
        }

        if (_load.IsFaulted)
        {
            _label.Text = _load.Exception?.GetBaseException().Message ?? "load failed";
            Log.Error($"Content load failed: {_label.Text}");
            return;
        }

        var content = _load.Result;
        _load = null;
        Context.Services.Add(content);
        Context.Services.Add(new ModAtlases(content.AtlasCacheDirectory));
        content.Languages.SetLanguage(_settings.Language);
        Context.Scenes.Switch(new MainMenuScene(), Transitions.Fade(0.6f));
    }
}
