using System.IO;
using Encompass;
using KavTest.Components;
using KavTest.Messages;
using KavTest.Renderers;
using KavTest.Spawners;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;

namespace KavTest
{
    class KavTestGame : Game
    {
        GraphicsDeviceManager graphics;

        WorldBuilder WorldBuilder { get; } = new WorldBuilder();
        World World { get; set; }

        public KavTestGame()
        {
            graphics = new GraphicsDeviceManager(this);
            graphics.PreferredBackBufferWidth = 1280;
            graphics.PreferredBackBufferHeight = 720;
            graphics.PreferMultiSampling = true;
            Content.RootDirectory = "Content";

            Window.AllowUserResizing = true;
            IsMouseVisible = true;
        }

        protected override void LoadContent()
        {
            var rustyBallModel = ModelLoader.Load(
                GraphicsDevice,
                Smuggler.Importer.ImportGLB(GraphicsDevice, File.OpenRead("Content/cube.glb"))
            );

            WorldBuilder.AddEngine(new RustyBallSpawner(rustyBallModel));
            WorldBuilder.AddEngine(new LightBulbSpawner());
            WorldBuilder.AddGeneralRenderer(new SceneRenderer(GraphicsDevice), 0);

            WorldBuilder.SendMessage(new RustyBallSpawnMessage(
                Matrix.CreateTranslation(0, 0, 0)
            ));
            WorldBuilder.SendMessage(new LightBulbSpawnMessage(
                Matrix.CreateTranslation(10, 0, -5),
                Color.White,
                300f
            ));

            var cameraMatrix = Matrix.CreateLookAt(new Vector3(10, 0, 0), Vector3.Zero, Vector3.Up);
            var cameraEntity = WorldBuilder.CreateEntity();
            WorldBuilder.SetComponent(cameraEntity, new CameraComponent(
                new Kav.Camera(
                    cameraMatrix
                )
            ));

            World = WorldBuilder.Build();
        }

        protected override void UnloadContent()
        {
            base.UnloadContent();
        }

        protected override void Update(GameTime gameTime)
        {
            World.Update(gameTime.ElapsedGameTime.TotalSeconds);

            base.Update(gameTime);
        }

        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.CornflowerBlue);

            World.Draw();

            base.Draw(gameTime);
        }
    }
}
