use serde::{Deserialize, Serialize};

/// Identifiant unique d'une entité dans la scène.
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct EntityId(pub u64);

impl EntityId {
    pub fn new(id: u64) -> Self {
        Self(id)
    }

    pub fn raw(self) -> u64 {
        self.0
    }
}

impl std::fmt::Display for EntityId {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        write!(f, "Entity({})", self.0)
    }
}

/// Accès aux entités de la scène.
///
/// Implémenté par `BevyEngine` (via filtre `SceneEntity`) en Jalon 2.
pub trait EntityStore {
    /// Toutes les entités de la scène (ordre non garanti).
    fn all_entities(&self) -> Vec<EntityId>;

    /// Nom de l'entité (composant `Name` ou `None`).
    fn entity_name(&self, id: EntityId) -> Option<String>;

    /// Parent de l'entité dans la hiérarchie, ou `None` si racine.
    fn parent(&self, id: EntityId) -> Option<EntityId>;

    /// Enfants directs dans la hiérarchie.
    fn children(&self, id: EntityId) -> Vec<EntityId>;

    /// Crée une nouvelle entité vide et retourne son id.
    fn spawn(&mut self) -> EntityId;

    /// Supprime une entité (et ses enfants si applicable).
    fn despawn(&mut self, id: EntityId);

    /// Déplace une entité dans la hiérarchie.
    fn reparent(&mut self, id: EntityId, new_parent: Option<EntityId>);
}
