//! Labels that can be used to load part of an FBX asset
use bevy::asset::AssetPath;

/// Labels that can be used to load part of an FBX asset
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum FbxAssetLabel {
    /// `Scene{}`: FBX Scene as a Bevy [`Scene`](bevy::scene::Scene)
    Scene(usize),
    /// `Mesh{}`: FBX Mesh as a Bevy [`Mesh`](bevy::render::mesh::Mesh)
    Mesh(usize),
    /// `Material{}`: FBX material as a Bevy [`StandardMaterial`](bevy::pbr::StandardMaterial)
    Material(usize),
    /// `Animation{}`: FBX animation as a Bevy [`AnimationClip`](bevy::animation::AnimationClip)
    Animation(usize),
    /// `AnimationStack{}`: FBX animation stack with multiple layers
    AnimationStack(usize),
    /// `Skeleton{}`: FBX skeleton for skeletal animation
    Skeleton(usize),
    /// `Node{}`: Individual FBX node in the scene hierarchy
    Node(usize),
    /// `Skin{}`: FBX skin for skeletal animation
    Skin(usize),
    /// `Light{}`: FBX light definition
    Light(usize),
    /// `Camera{}`: FBX camera definition
    Camera(usize),
    /// `Texture{}`: FBX texture reference
    Texture(usize),
    /// `DefaultScene`: Main scene with all objects
    DefaultScene,
    /// `DefaultMaterial`: Fallback material used when no material is present
    DefaultMaterial,
    /// `RootNode`: Root node of the scene hierarchy
    RootNode,
}

impl core::fmt::Display for FbxAssetLabel {
    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
        match self {
            FbxAssetLabel::Scene(index) => f.write_str(&format!("Scene{index}")),
            FbxAssetLabel::Mesh(index) => f.write_str(&format!("Mesh{index}")),
            FbxAssetLabel::Material(index) => f.write_str(&format!("Material{index}")),
            FbxAssetLabel::Animation(index) => f.write_str(&format!("Animation{index}")),
            FbxAssetLabel::AnimationStack(index) => f.write_str(&format!("AnimationStack{index}")),
            FbxAssetLabel::Skeleton(index) => f.write_str(&format!("Skeleton{index}")),
            FbxAssetLabel::Node(index) => f.write_str(&format!("Node{index}")),
            FbxAssetLabel::Skin(index) => f.write_str(&format!("Skin{index}")),
            FbxAssetLabel::Light(index) => f.write_str(&format!("Light{index}")),
            FbxAssetLabel::Camera(index) => f.write_str(&format!("Camera{index}")),
            FbxAssetLabel::Texture(index) => f.write_str(&format!("Texture{index}")),
            FbxAssetLabel::DefaultScene => f.write_str("DefaultScene"),
            FbxAssetLabel::DefaultMaterial => f.write_str("DefaultMaterial"),
            FbxAssetLabel::RootNode => f.write_str("RootNode"),
        }
    }
}

impl FbxAssetLabel {
    /// Add this label to an asset path
    pub fn from_asset(&self, path: impl Into<AssetPath<'static>>) -> AssetPath<'static> {
        path.into().with_label(self.to_string())
    }
}
