use std::ops::Deref;
use std::sync::Arc;

use vulkano::command_buffer::{AutoCommandBufferBuilder, DynamicState};
use vulkano::device::Device;
use vulkano::framebuffer::{RenderPassAbstract, Subpass};

use Color;

pub struct Mesh;

pub trait Draw {
    fn draw(&self, visitor: &mut FnMut(&Mesh, Color));
}

impl<T> Draw for T
where
    T: Deref + ?Sized,
    T::Target: Draw,
{
    fn draw(&self, visitor: &mut FnMut(&Mesh, Color)) {
        self.deref().draw(visitor)
    }
}

pub(crate) struct Renderer;

impl Renderer {
    pub(crate) fn new(_: Arc<Device>, _: Subpass<Arc<RenderPassAbstract + Send + Sync>>) -> Self {
        Renderer
    }

    pub(crate) fn draw<D: Draw>(
        &self,
        cmd: AutoCommandBufferBuilder,
        _: &D,
        _: DynamicState,
    ) -> AutoCommandBufferBuilder {
        cmd
    }
}