using MoonTools.ECS;
using Nerfed.Runtime;
using Nerfed.Runtime.Components;
using Nerfed.Runtime.Systems;
using System.Numerics;

namespace Nerfed.Editor;

internal class Program
{
    private static readonly World world = new World();
    private static List<MoonTools.ECS.System> systems = new List<MoonTools.ECS.System>();

    private static void Main(string[] args)
    {
        Engine.OnInitialize += HandleOnInitialize;
        Engine.OnUpdate += HandleOnUpdate;
        Engine.OnRender += HandleOnRender;
        Engine.OnQuit += HandleOnQuit;

        Engine.Run(args);
    }

    private static void HandleOnInitialize()
    {
        systems.Add(new ParentSystem(world));
        systems.Add(new LocalToWorldSystem(world));

        Entity ent1 = world.CreateEntity();
        world.Set(ent1, new LocalTransform(new Vector3(1, 0, 0), Quaternion.Identity, Vector3.One));

        Entity ent2 = world.CreateEntity();
        world.Set(ent2, new LocalTransform(new Vector3(0, 1, 0), Quaternion.Identity, Vector3.One));
        world.Set(ent2, new Parent(ent1));

        // Open project.
        // Setip EditorGui.
        EditorGui.Initialize();
    }

    private static void HandleOnUpdate()
    {
        foreach (MoonTools.ECS.System system in systems)
        {
            system.Update(Engine.Timestep);
        }

        // Editor Update.
        EditorGui.Update();


        // Try Catch UserCode Update.
    }

    private static void HandleOnRender()
    {
        EditorGui.Render();
    }

    private static void HandleOnQuit()
    {
        EditorGui.Quit();
    }
}