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::SphereShape;
use shared::{Ptr, Transform};
use std::collections::HashMap;
use std::sync::Arc;

impl CreateShape for SphereShape {
    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 zmin = parameters.get_one_float("zmin", -radius)?;
        let zmax = parameters.get_one_float("zmax", radius)?;
        let phimax = parameters.get_one_float("phimax", 360.)?;
        let shape = SphereShape::new(
            render_from_object,
            object_from_render,
            reverse_orientation,
            radius,
            zmin,
            zmax,
            phimax,
        );
        Ok(vec![arena.alloc(Shape::Sphere(shape))])
    }
}
