<?php
/**
 * Configuration de la base de données SERVICES-AE
 * Connexion MySQL avec PDO
 */

// Configuration de la base de données
define('DB_HOST', 'localhost');
define('DB_NAME', 'serv');
define('DB_USER', 'root');
define('DB_PASS', '');
define('DB_CHARSET', 'utf8mb4');

// Configuration PDO
$dsn = "mysql:host=" . DB_HOST . ";dbname=" . DB_NAME . ";charset=" . DB_CHARSET;

// Options PDO pour une sécurité optimale
$options = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false,
    PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES " . DB_CHARSET
];

try {
    // Création de la connexion PDO
    $pdo = new PDO($dsn, DB_USER, DB_PASS, $options);
    
} catch (PDOException $e) {
    // Gestion des erreurs de connexion
    if (defined('DEBUG') && DEBUG === true) {
        // En mode debug : afficher l'erreur complète
        die("❌ Erreur de connexion à la base de données : " . $e->getMessage());
    } else {
        // En mode production : message générique
        die("❌ Erreur de connexion à la base de données. Veuillez contacter l'administrateur.");
    }
}

/**
 * Fonction pour obtenir la connexion PDO
 * @return PDO
 */
function getDbConnection() {
    global $pdo;
    return $pdo;
}

/**
 * Fonction utilitaire pour exécuter des requêtes préparées
 * @param string $query La requête SQL avec placeholders
 * @param array $params Les paramètres à bind
 * @return PDOStatement
 */
function executeQuery($query, $params = []) {
    global $pdo;
    
    try {
        $stmt = $pdo->prepare($query);
        $stmt->execute($params);
        return $stmt;
    } catch (PDOException $e) {
        if (defined('DEBUG') && DEBUG === true) {
            die("❌ Erreur SQL : " . $e->getMessage() . "<br>Requête : " . $query);
        } else {
            die("❌ Erreur lors de l'exécution de la requête.");
        }
    }
}

/**
 * Fonction pour récupérer un seul enregistrement
 * @param string $query
 * @param array $params
 * @return array|false
 */
function fetchOne($query, $params = []) {
    $stmt = executeQuery($query, $params);
    return $stmt->fetch();
}

/**
 * Fonction pour récupérer plusieurs enregistrements
 * @param string $query
 * @param array $params
 * @return array
 */
function fetchAll($query, $params = []) {
    $stmt = executeQuery($query, $params);
    return $stmt->fetchAll();
}

/**
 * Fonction pour insérer des données et retourner l'ID
 * @param string $query
 * @param array $params
 * @return string
 */
function insertAndGetIdFromQuery($query, $params = []) {
    global $pdo;
    executeQuery($query, $params);
    return $pdo->lastInsertId();
}

/**
 * Fonction pour insérer des données depuis un tableau et retourner l'ID
 * @param string $table
 * @param array $data
 * @return string
 */
function insertAndGetId($table, $data) {
    global $pdo;
    
    // Construire la requête d'insertion
    $fields = array_keys($data);
    $placeholders = ':' . implode(', :', $fields);
    $fields_str = implode(', ', $fields);
    
    $query = "INSERT INTO $table ($fields_str) VALUES ($placeholders)";
    
    executeQuery($query, $data);
    return $pdo->lastInsertId();
}

/**
 * Fonction pour compter les enregistrements
 * @param string $table
 * @param string $where
 * @param array $params
 * @return int
 */
function countRecords($table, $where = '', $params = []) {
    $query = "SELECT COUNT(*) as total FROM $table";
    if ($where) {
        $query .= " WHERE $where";
    }
    
    $result = fetchOne($query, $params);
    return (int)$result['total'];
}

/**
 * Fonction pour échapper les chaînes (sécurité supplémentaire)
 * @param string $string
 * @return string
 */
function escape($string) {
    return htmlspecialchars(strip_tags(trim($string)), ENT_QUOTES, 'UTF-8');
}

// Optionnel : Créer les tables nécessaires si elles n'existent pas
function createTablesIfNotExist() {
    global $pdo;
    
    // Table des contacts
    $createContacts = "
        CREATE TABLE IF NOT EXISTS contacts (
            id INT AUTO_INCREMENT PRIMARY KEY,
            first_name VARCHAR(100) NOT NULL,
            last_name VARCHAR(100) NOT NULL,
            email VARCHAR(255) NOT NULL,
            phone VARCHAR(20),
            subject VARCHAR(255),
            message TEXT NOT NULL,
            status ENUM('nouveau', 'lu', 'traite') DEFAULT 'nouveau',
            created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
            updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
            INDEX idx_status (status),
            INDEX idx_created (created_at)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci";
    
    // Table des services (pour future expansion)
    $createServices = "
        CREATE TABLE IF NOT EXISTS services (
            id INT AUTO_INCREMENT PRIMARY KEY,
            name VARCHAR(255) NOT NULL,
            description TEXT,
            price DECIMAL(10,2),
            active BOOLEAN DEFAULT TRUE,
            created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
            updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci";
    
    // Table des témoignages clients
    $createTestimonials = "
        CREATE TABLE IF NOT EXISTS testimonials (
            id INT AUTO_INCREMENT PRIMARY KEY,
            client_name VARCHAR(100) NOT NULL,
            client_company VARCHAR(150),
            testimonial TEXT NOT NULL,
            rating INT DEFAULT 5,
            active BOOLEAN DEFAULT TRUE,
            created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci";
    
    try {
        $pdo->exec($createContacts);
        $pdo->exec($createServices);
        $pdo->exec($createTestimonials);
        
        if (defined('DEBUG') && DEBUG === true) {
            echo "✅ Tables créées ou vérifiées avec succès !<br>";
        }
    } catch (PDOException $e) {
        if (defined('DEBUG') && DEBUG === true) {
            echo "⚠️ Erreur lors de la création des tables : " . $e->getMessage() . "<br>";
        }
    }
}

// Décommenter la ligne suivante pour créer automatiquement les tables
// createTablesIfNotExist();

?>
