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

namespace LittleSim.Scenes;

/// <summary>
/// Экран настроек игры (язык, экран, громкость, разрешение). Использует общий
/// <see cref="SettingsPanel"/>. «Применить» сохраняет в settings.json и применяет к движку
/// (смена языка перестраивает подписи на лету); «Назад»/Esc — в главное меню.
/// </summary>
public sealed class SettingsScene : Scene
{
    private GameContent _content = null!;
    private AudioManager _audio = null!;
    private GameHost _host = null!;
    private Desktop _desktop = null!;
    private GameSettings _settings = GameSettingsStore.Load();

    protected override void OnLoad()
    {
        _content = Context.Services.Get<GameContent>();
        _audio = Context.Services.Get<AudioManager>();
        _host = (GameHost)Context.Services.Get<Game>();
        var input = this.UseInput();

        _desktop = this.UseUI();
        Rebuild();

        UpdateSystems.Add(
            new CallbackSystem(() =>
            {
                if (input.IsKeyPressed(Keys.Escape))
                {
                    Back();
                }
            })
        );
    }

    private void Rebuild() =>
        _desktop.Root = Ui.Screen(SettingsPanel.Build(_settings, _content.Languages, Apply, Back));

    private void Apply()
    {
        GameSettingsStore.Save(_settings);
        GameSettingsStore.Apply(_settings, _host.Graphics, _content.Languages, _audio);
        Rebuild(); // язык мог смениться — перестраиваем подписи
    }

    private void Back()
    {
        if (!Context.Scenes.IsTransitioning)
        {
            Context.Scenes.Switch(new MainMenuScene(), Transitions.Fade(0.4f));
        }
    }
}
