use crate::asset::AssetStore;
use crate::command::EditorCommand;
use crate::component::ComponentStore;
use crate::entity::EntityStore;
use crate::scene::SceneHandle;

/// Point d'entrée unique du moteur d'édition.
///
/// Composition de tous les stores + opérations de scène + exécution de commandes.
/// Implémenté par `BevyEngine` dans `san-motor-bevy` (Jalon 2).
pub trait Engine {
    type Error: std::error::Error + Send + Sync + 'static;

    // --- Stores ---

    fn entities(&self) -> &dyn EntityStore;
    fn entities_mut(&mut self) -> &mut dyn EntityStore;

    fn components(&self) -> &dyn ComponentStore;
    fn components_mut(&mut self) -> &mut dyn ComponentStore;

    fn assets(&self) -> &dyn AssetStore;

    // --- Scène ---

    /// Handle de la scène courante (`None` si aucune scène chargée).
    fn current_scene(&self) -> Option<&SceneHandle>;

    /// Charge une scène depuis le chemin donné.
    fn load_scene(&mut self, path: &str) -> Result<(), Self::Error>;

    /// Sauvegarde la scène courante.
    fn save_scene(&self, path: &str) -> Result<(), Self::Error>;

    /// Crée une scène vide (remplace la scène courante).
    fn new_scene(&mut self);

    // --- Commandes ---

    /// Exécute une commande d'édition atomique.
    ///
    /// Les commandes mutantes sont enregistrées dans l'historique undo/redo (Phase 2).
    fn execute(&mut self, cmd: EditorCommand) -> Result<(), Self::Error>;
}
