use crate::core::shape::CreateShape;
use crate::core::texture::FloatTexture;
use crate::{Arena, FileLoc, ParameterDictionary};
use anyhow::Result;
use shared::core::shape::Shape;
use shared::shapes::CylinderShape;
use std::collections::HashMap;
use std::sync::Arc;
use shared::{Transform, Ptr};

impl CreateShape for CylinderShape {
    fn create(
        render_from_object: Transform,
        object_from_render: Transform,
        reverse_orientation: bool,
        parameters: ParameterDictionary,
        _float_textures: &HashMap<String, Arc<FloatTexture>>,
        _loc: FileLoc,
        arena: &Arena,
    ) -> Result<Vec<Ptr<Shape>>> {
        let radius = parameters.get_one_float("radius", 1.)?;
        let z_min = parameters.get_one_float("zmin", -1.)?;
        let z_max = parameters.get_one_float("zmax", 1.)?;
        let phi_max = parameters.get_one_float("phimax", 360.)?;
        let shape = CylinderShape::new(
            render_from_object,
            object_from_render,
            reverse_orientation,
            radius,
            z_min,
            z_max,
            phi_max,
        );

         Ok(vec![arena.alloc(Shape::Cylinder(shape))])
    }
}
