mod game;
mod game_state;

use std::path::Path;

use anyhow::Result;

use ecs::*;
use engine::prelude::*;
use game::Game;
use game_state::GameState;
use skybox::SkyBox;

fn main() -> Result<()> {
    let mut world_builder = World::builder();

    let mut engine_ci = EngineCreateInfo::default();
    engine_ci.resource_base_path = "/home/michaelh/Sync/space_game/".to_string();
    engine_ci.asset_directories.gltf_file_directory = "objects".into();
    engine_ci.raytracing_info.recursion_depth = 30;

    Engine::new::<GameState>(engine_ci, &mut world_builder)?;

    world_builder.add_system(GameState::update);
    world_builder.resources.insert(GameState::default());

    let dir = Path::new("/home/michaelh/Sync/space_game/skybox");
    SkyBox::new(
        &mut world_builder,
        [
            dir.join("left.png"),
            dir.join("right.png"),
            dir.join("front.png"),
            dir.join("back.png"),
            dir.join("top.png"),
            dir.join("bottom.png"),
        ]
        .into_iter(),
    )?;

    let view = world_builder.resources.get_mut::<Scene>().view_mut();
    let camera_control = FreeCameraControl::new(view)?;
    world_builder.resources.insert(camera_control);

    Game::setup_updates(&mut world_builder)?;
    let mut world = world_builder.build();
    Game::setup_scene(&mut world)?;

    world.run()
}