use super::*;
use ::world::util::Grid;

pub struct Chunks {
    chunks: Grid<Chunk>,
    pub chunks_to_load: Vec<Vec2<i32>>,
    pub chunks_to_unload: Vec<Vec2<i32>>,
}

impl Chunks {
    pub fn new(size: Vec2<u32>) -> Self {
        Chunks {
            chunks: Grid::populate_from(size.map(|e| e as i32), |_| Chunk {
                is_loaded: false,
            }),
            chunks_to_load: Vec::new(),
            chunks_to_unload: Vec::new(),
        }
    }

    pub fn chunk(&self, key: Vec2<i32>) -> Option<&Chunk> { self.chunks.get(key) }

    pub fn size(&self) -> Vec2<u32> { self.chunks.size().map(|e| e as u32) }

    pub fn chunk_mut(&mut self, key: Vec2<i32>) -> Option<&mut Chunk> { self.chunks.get_mut(key) }

    pub fn chunk_at(&self, pos: Vec2<f32>) -> Option<&Chunk> {
        self.chunks.get(pos.map2(TerrainChunk::RECT_SIZE, |e, sz| (e.floor() as i32).div_euclid(sz as i32)))
    }
}

pub struct Chunk {
    pub is_loaded: bool,
}