//! Protocole de communication éditeur ↔ jeu (mode play out-of-process).
//!
//! Transport : TCP, messages newline-delimited JSON.
//! Port par défaut : 9090.

use serde::{Deserialize, Serialize};

/// Port TCP par défaut pour le bridge éditeur ↔ jeu.
pub const DEBUG_PORT: u16 = 9090;

/// Adresse TCP par défaut (localhost).
pub const DEBUG_ADDR: &str = "127.0.0.1:9090";

/// Propriété d'entité transmise en live éditeur → jeu.
///
/// `entity_name` identifie l'entité dans le jeu via son composant `Name`.
/// `PlayerController` met à jour la resource `PlayerControllerLive` (pas besoin de
/// chercher par nom puisque le système de mouvement est global).
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "prop")]
pub enum LiveProp {
    /// Transformation complète : position, rotation (quaternion xyzw), échelle.
    Transform {
        translation: [f32; 3],
        rotation: [f32; 4],
        scale: [f32; 3],
    },
    /// Visibilité de l'entité.
    Visibility { hidden: bool },
    /// Paramètres du contrôleur joueur (vitesse, gravité, saut).
    PlayerController {
        speed: f32,
        sprint_speed: f32,
        jump_height: f32,
        gravity: f32,
    },
}

/// Messages envoyés par l'éditeur vers le jeu.
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type")]
pub enum EditorToGame {
    Play,
    Pause,
    Stop,
    GetEntities,
    /// Mise à jour live du composant CameraFollow sans recompilation.
    SetCameraFollow { offset: [f32; 3], smooth: f32, look_at_target: bool },
    /// Mise à jour live de propriétés d'une entité identifiée par son nom.
    SetEntityProperties { entity_name: String, props: Vec<LiveProp> },
    /// Demande de capture d'écran du jeu.
    TakeScreenshot,
}

/// Messages envoyés par le jeu vers l'éditeur.
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type")]
pub enum GameToEditor {
    Pong,
    StateChanged { state: GamePlayState },
    EntityList { entities: Vec<DebugEntity> },
    Error { message: String },
    /// Données PNG de la capture d'écran du jeu (encodées en base64).
    ScreenshotData { png_base64: String },
}

/// État de jeu transmis au débogueur.
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum GamePlayState {
    Playing,
    Paused,
    Stopped,
}

/// Snapshot léger d'une entité pour le débogueur.
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DebugEntity {
    pub id: u64,
    pub name: Option<String>,
    pub position: Option<[f32; 3]>,
}
