using System;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using MrGameEng.Core;

namespace LittleSim.Web;

/// <summary>
/// Веб-хост LittleSim поверх KNI (BlazorGL/WebGL) — браузерный аналог
/// MrGameEng.Host.GameHost: владеет EngineContext ядра, гонит GameClock и фазы сцены.
/// Цикл тикается из requestAnimationFrame (см. Pages/Index.razor.cs). Когда графика
/// движка научится собираться под KNI, этот класс переедет в MrGameEng.Host.Web.
/// </summary>
public class LittleSimWebGame : Game
{
    /// <summary>Контекст ядра движка, общий со сценами и системами.</summary>
    public EngineContext Context { get; } = new EngineContext();

    private GraphicsDeviceManager _graphics;
    private SpriteBatch _spriteBatch = null!;
    private Texture2D _pixel = null!;
    private WorldViewScene _scene = null!;

    /// <summary>Игра-наблюдатель: мира не создаёт, ждёт <see cref="Connect"/> из UI.</summary>
    public LittleSimWebGame()
    {
        _graphics = new GraphicsDeviceManager(this);
        Content.RootDirectory = "Content";
    }

    /// <summary>Состояние соединения со сценой-наблюдателем — читает оверлей подключения.</summary>
    public ConnectionStatus Status => _scene?.Status ?? ConnectionStatus.Idle;

    /// <summary>Число реплицированных жителей — для статуса в оверлее.</summary>
    public int EntityCount => _scene?.EntityCount ?? 0;

    /// <summary>Подключиться к серверу <paramref name="server"/> (вызывается из Blazor-оверлея).</summary>
    public void Connect(Uri server) => _scene?.Connect(server);

    /// <inheritdoc />
    protected override void Initialize()
    {
        base.Initialize();
        _scene = new WorldViewScene(() => _spriteBatch, () => _pixel);
        Context.Scenes.Switch(_scene);
    }

    /// <inheritdoc />
    protected override void LoadContent()
    {
        _spriteBatch = new SpriteBatch(GraphicsDevice);
        _pixel = new Texture2D(GraphicsDevice, 1, 1);
        _pixel.SetData(new[] { Color.White });
    }

    /// <inheritdoc />
    protected override void Update(GameTime gameTime)
    {
        Context.Clock.Advance((float)gameTime.ElapsedGameTime.TotalSeconds);
        Context.Scenes.Update(Context.Clock);
        base.Update(gameTime);
    }

    /// <inheritdoc />
    protected override void Draw(GameTime gameTime)
    {
        GraphicsDevice.Clear(new Color(12, 16, 24));
        Context.Scenes.Draw(Context.Clock);
        base.Draw(gameTime);
    }
}
