use crate::vertex_2d::{ColoredVertex2D, Vertex2D};
use std::sync::Arc;
use std::collections::HashMap;
use crate::canvas::{Drawable, CanvasTextureHandle, CanvasImageHandle};

pub struct CanvasFrame {
    pub colored_drawables: Vec<ColoredVertex2D>,
    pub textured_drawables: HashMap<Arc<CanvasTextureHandle>, Vec<Vec<Vertex2D>>>,
    pub image_drawables: HashMap<Arc<CanvasImageHandle>, Vec<Vec<Vertex2D>>>,
}

impl CanvasFrame {
    pub fn new() -> CanvasFrame {
        CanvasFrame {
            colored_drawables: vec![],
            textured_drawables: Default::default(),
            image_drawables: Default::default(),
        }
    }

    // Accumulates the drawables vertices and colors
    pub fn draw(&mut self, drawable: &dyn Drawable) {
        match drawable.get_texture_handle() {
            Some(handle) => {
                self.textured_drawables
                    .entry(handle.clone())
                    .or_insert(Vec::new())
                    .push(drawable.get_vertices().iter().map(|n|
                        Vertex2D {
                            position: [n.0, n.1],
                        }
                    ).collect::<Vec<Vertex2D>>());
            }
            None => {
                match drawable.get_image_handle() {
                    Some(handle) => {
                        self.image_drawables
                            .entry(handle.clone())
                            .or_insert(Vec::new())
                            .push(drawable.get_vertices().iter().map(|n|
                                Vertex2D {
                                    position: [n.0, n.1],
                                }
                            ).collect());
                    }
                    None => {
                        let colors = drawable.get_color();

                        self.colored_drawables.extend(
                            drawable.get_vertices().iter().map(|n|
                                ColoredVertex2D {
                                    position: [n.0, n.1],
                                    color: [colors.0, colors.1, colors.2, colors.3],
                                }
                            )
                        );
                    }
                }
            }
        }
    }
}