use crate::math::Real;

/// A color for debug-rendering.
///
/// The default colors are provided in HSLA (Hue Saturation Lightness Alpha) format.
pub type DebugColor = [f32; 4];

/// Style used for computing colors when rendering the scene.
#[derive(Copy, Clone, Debug, PartialEq)]
pub struct DebugRenderStyle {
    /// The number of subdivision used to approximate the curved
    /// parts of a shape with smooth faces.
    pub subdivisions: u32,
    /// The number of subdivision used to approimate the curved
    /// borders of round shapes.
    pub border_subdivisions: u32,
    /// The color of colliders attached to dynamic rigid-bodies.
    pub collider_dynamic_color: DebugColor,
    /// The color of colliders attached to fixed rigid-bodies.
    pub collider_fixed_color: DebugColor,
    /// The color of colliders attached to kinematic rigid-bodies.
    pub collider_kinematic_color: DebugColor,
    /// The color of colliders not attached to any rigid-body.
    pub collider_parentless_color: DebugColor,
    /// The color of the line between a rigid-body’s center-of-mass and the
    /// anchors of its attached impulse joints.
    pub impulse_joint_anchor_color: DebugColor,
    /// The color of the line between the two anchors of an impulse joint.
    pub impulse_joint_separation_color: DebugColor,
    /// The color of the line between a rigid-body’s center-of-mass and the
    /// anchors of its attached multibody joints.
    pub multibody_joint_anchor_color: DebugColor,
    /// The color of the line between the two anchors of a multibody joint.
    pub multibody_joint_separation_color: DebugColor,
    /// If a rigid-body is sleeping, its attached entities will have their colors
    /// multiplied by this array. (For a joint, both attached rigid-bodies must be sleeping
    /// or non-dynamic for this multiplier to be applied).
    pub sleep_color_multiplier: [f32; 4],
    /// The length of the local coordinate axes rendered for a rigid-body.
    pub rigid_body_axes_length: Real,
    /// The collor for the segments joining the two contact points.
    pub contact_depth_color: DebugColor,
    /// The color of the contact normals.
    pub contact_normal_color: DebugColor,
    /// The length of the contact normals.
    pub contact_normal_length: Real,
    /// The color of the colliders Aabbs.
    pub collider_aabb_color: DebugColor,
}

impl Default for DebugRenderStyle {
    fn default() -> Self {
        Self {
            subdivisions: 20,
            border_subdivisions: 5,
            collider_dynamic_color: [340.0, 1.0, 0.3, 1.0],
            collider_kinematic_color: [20.0, 1.0, 0.3, 1.0],
            collider_fixed_color: [30.0, 1.0, 0.4, 1.0],
            collider_parentless_color: [30.0, 1.0, 0.4, 1.0],
            impulse_joint_anchor_color: [240.0, 0.5, 0.4, 1.0],
            impulse_joint_separation_color: [0.0, 0.5, 0.4, 1.0],
            multibody_joint_anchor_color: [300.0, 1.0, 0.4, 1.0],
            multibody_joint_separation_color: [0.0, 1.0, 0.4, 1.0],
            sleep_color_multiplier: [1.0, 1.0, 0.2, 1.0],
            rigid_body_axes_length: 0.5,
            contact_depth_color: [120.0, 1.0, 0.4, 1.0],
            contact_normal_color: [0.0, 1.0, 1.0, 1.0],
            contact_normal_length: 0.3,
            collider_aabb_color: [124.0, 1.0, 0.4, 1.0],
        }
    }
}
