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

namespace LittleSim.Scenes;

/// <summary>
/// Экран загрузки: список сохранений из <see cref="SaveStore"/> (имя, размер, дата) с
/// кнопками «Загрузить» и «Удалить». Загрузка пересоздаёт мир из полного состояния симуляции.
/// </summary>
public sealed class LoadGameScene : Scene
{
    private readonly SaveStore _store = new();
    private GameContent _content = null!;
    private Desktop _desktop = null!;

    protected override void OnLoad()
    {
        _content = Context.Services.Get<GameContent>();
        var input = this.UseInput();
        _desktop = this.UseUI();
        Rebuild();

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

    private void Rebuild()
    {
        var lang = _content.Languages;
        var column = Ui.Column(8);
        column.Widgets.Add(Ui.Title(lang.Get("load.title")));
        column.Widgets.Add(new Label { Height = 8 });

        var saves = _store.List();
        if (saves.Count == 0)
        {
            column.Widgets.Add(Ui.Subtitle(lang.Get("load.empty")));
        }

        foreach (var entry in saves)
        {
            var save = entry.Save;
            var row = Ui.Row(8);
            row.Widgets.Add(
                new Label
                {
                    TextColor = Ui.Accent,
                    Text =
                        $"{save.Name}  —  {save.Width}×{save.Height}  —  "
                        + save.SavedUtc.ToLocalTime().ToString("yyyy-MM-dd HH:mm"),
                }
            );
            var file = entry.FileName;
            row.Widgets.Add(
                Ui.Button(
                    lang.Get("load.load"),
                    () =>
                    {
                        if (!Context.Scenes.IsTransitioning)
                        {
                            Context.Scenes.Switch(
                                new WorldScene(save.ToConfig(), save),
                                Transitions.Fade(0.6f)
                            );
                        }
                    },
                    width: 130
                )
            );
            row.Widgets.Add(
                Ui.Button(
                    lang.Get("load.delete"),
                    () =>
                    {
                        _store.Delete(file);
                        Rebuild();
                    },
                    width: 130
                )
            );
            column.Widgets.Add(row);
        }

        column.Widgets.Add(new Label { Height = 8 });
        column.Widgets.Add(Ui.Button(lang.Get("load.back"), Back));

        _desktop.Root = Ui.Screen(column);
    }

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