use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use std::convert::TryFrom;
use uuid::Uuid;

#[derive(Debug, Clone, Serialize, Deserialize)]
// Note: Le schéma utilise VARCHAR(50) pour message_type, pas un enum PostgreSQL
// On garde l'enum Rust mais sans Type derive pour sqlx
pub enum MessageType {
    Text,
    Image,
    Audio,
    Video,
    File,
}

impl TryFrom<String> for MessageType {
    type Error = String;

    fn try_from(value: String) -> Result<Self, Self::Error> {
        match value.as_str() {
            "text" => Ok(MessageType::Text),
            "image" => Ok(MessageType::Image),
            "audio" => Ok(MessageType::Audio),
            "video" => Ok(MessageType::Video),
            "file" => Ok(MessageType::File),
            _ => Err(format!("Invalid message type: {}", value)),
        }
    }
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Message {
    pub id: Uuid,
    pub conversation_id: Uuid, // Aligné avec schéma DB (renommé de room_id)
    pub sender_id: Uuid,
    pub content: String,
    pub message_type: MessageType,
    pub parent_message_id: Option<Uuid>, // Ajouté depuis schéma DB
    pub reply_to_id: Option<Uuid>,       // Ajouté depuis migration 002
    pub is_pinned: bool,                 // Ajouté depuis schéma DB
    pub is_edited: bool,                 // Ajouté depuis migration 002
    pub is_deleted: bool,                // Aligné avec schéma DB
    pub edited_at: Option<DateTime<Utc>>, // Ajouté depuis migration 002
    pub deleted_at: Option<DateTime<Utc>>, // Ajouté depuis migration 005
    pub status: String,                  // Ajouté depuis schéma DB
    pub metadata: Option<serde_json::Value>, // Ajouté depuis migration 002 (JSONB)
    pub created_at: DateTime<Utc>,
    pub updated_at: DateTime<Utc>,
}
