//! Gestionnaire de connection pool PostgreSQL pour chat server
//!
//! Ce module fournit une fonction pour créer et configurer un pool de connexions
//! PostgreSQL optimisé pour le chat server.

use sqlx::postgres::PgPoolOptions;
use sqlx::PgPool;
use std::time::Duration;

/// Crée un pool de connexions PostgreSQL avec configuration optimale
///
/// # Arguments
///
/// * `database_url` - URL de connexion à la base de données PostgreSQL
///
/// # Returns
///
/// Un `PgPool` configuré ou une erreur si la connexion échoue
///
/// # Configuration
///
/// - `max_connections`: 20 connexions maximum
/// - `min_connections`: 5 connexions minimum maintenues
/// - `acquire_timeout`: 30 secondes pour acquérir une connexion
/// - `idle_timeout`: 600 secondes (10 minutes) avant fermeture d'une connexion inactive
/// - `max_lifetime`: 1800 secondes (30 minutes) durée de vie maximale d'une connexion
///
/// # Exemple
///
/// ```rust,no_run
/// use chat_server::database::pool::create_pool;
///
/// #[tokio::main]
/// async fn main() {
///     let database_url = "postgresql://user:password@localhost/veza_db";
///     let pool = create_pool(database_url).await.expect("Failed to create pool");
///     // Utiliser le pool...
/// }
/// ```
pub async fn create_pool(database_url: &str) -> Result<PgPool, sqlx::Error> {
    PgPoolOptions::new()
        .max_connections(20)
        .min_connections(5)
        .acquire_timeout(Duration::from_secs(30))
        .idle_timeout(Duration::from_secs(600))
        .max_lifetime(Duration::from_secs(1800))
        .connect(database_url)
        .await
}

/// Crée un pool de connexions avec une URL depuis une variable d'environnement
///
/// # Arguments
///
/// * `env_var` - Nom de la variable d'environnement contenant l'URL (par défaut "DATABASE_URL")
///
/// # Returns
///
/// Un `PgPool` configuré ou une erreur si la connexion échoue
pub async fn create_pool_from_env(env_var: Option<&str>) -> Result<PgPool, sqlx::Error> {
    let var_name = env_var.unwrap_or("DATABASE_URL");
    let database_url = std::env::var(var_name).map_err(|_| {
        sqlx::Error::Configuration(format!("Environment variable {} not set", var_name).into())
    })?;
    create_pool(&database_url).await
}

#[cfg(test)]
mod tests {
    use super::*;

    #[tokio::test]
    #[ignore] // Nécessite une base de données de test
    async fn test_create_pool() {
        let database_url = std::env::var("TEST_DATABASE_URL")
            .unwrap_or_else(|_| "postgresql://localhost/veza_chat_test".to_string());
        let pool = create_pool(&database_url).await;
        assert!(pool.is_ok(), "Pool creation should succeed");
    }

    #[tokio::test]
    #[ignore] // Nécessite une base de données de test
    async fn test_create_pool_from_env() {
        std::env::set_var("TEST_DATABASE_URL", "postgresql://localhost/veza_chat_test");
        let pool = create_pool_from_env(Some("TEST_DATABASE_URL")).await;
        assert!(pool.is_ok(), "Pool creation from env should succeed");
    }
}
