Documentation
use crate::core::ecs::{Scheduler, SystemType};
use crate::core::Window;

use super::components::MeshRenderer;

#[derive(Default)]
pub struct Engine {
    scheduler: Scheduler,
    renders: Vec<MeshRenderer>
}

impl Engine {
    pub fn add_system(&mut self, system_type: SystemType, system: impl FnMut(&mut Window, &mut Vec<MeshRenderer>) + 'static) {
        self.scheduler.insert(system_type, system);
    }

    pub fn run(&mut self) {
        let mut window = Window::new("Foux Engine", 800, 480);
        self.scheduler.invoke(SystemType::Startup, &mut window, &mut self.renders);

        while !window.should_close() {
            window.clear(0.07, 0.17, 0.07, 1.0);
            self.scheduler.invoke(SystemType::Update, &mut window, &mut self.renders);
            for render in self.renders.iter() {
                render.render();
            }
            window.update();
        }
    }
}