Documentation
use super::entity_manager::{EntityIdAccessor, EntityManager};
use super::component::Component;
use super::system::System;

pub struct World {
	entity_manager: EntityManager,
	entity_id_accessor: EntityIdAccessor,
	systems: Vec<Box<dyn System>>
}

impl World {
	pub fn new() -> Self {
		World {
			entity_manager: EntityManager::new(),
			entity_id_accessor: EntityIdAccessor::new(),
			systems: vec![]
		}
	}

	pub fn create_entity(&mut self) -> usize {
		self.entity_manager.create_entity()
	}

	pub fn remove_entity(&mut self, entity_id: usize) {
		self.entity_manager.remove_entity(entity_id);
	}

	pub fn register_component<T: 'static + Component>(&mut self) -> &mut Self {
		self.entity_manager.register::<T>();
		self
	}

	pub fn add_system<T: 'static + System>(&mut self, system: T) -> &mut Self {
		self.systems.push(Box::new(system));
		self
	}

	pub fn add_component_to_entity<T: 'static + Component>(&mut self, entity_id: usize, component: T) -> &mut Self {
		self.entity_manager.add_component_to_entity(entity_id, component);
		self
	}

	pub fn update(&mut self) {
		for system in self.systems.iter_mut() {
			system.update(&mut self.entity_manager, &mut self.entity_id_accessor);
			self.entity_manager.increment_frame();
		}
	}
}