<?php
require_once __DIR__ . '/phpmailer/src/PHPMailer.php';
require_once __DIR__ . '/phpmailer/src/SMTP.php';
require_once __DIR__ . '/phpmailer/src/Exception.php';
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;
/**
 * Traitement des témoignages clients - SERVICES-AE
 * Gère la soumission, validation et stockage des avis clients
 */

require_once 'config/config.php';
require_once 'config/db.php';

// Fonction pour nettoyer et valider les données
function cleanInput($data) {
    return trim(strip_tags($data));
}

// Fonction pour valider l'email
function validateEmail($email) {
    return filter_var($email, FILTER_VALIDATE_EMAIL) !== false;
}

// Fonction pour gérer l'upload de photo
function handlePhotoUpload($file) {
    if (!isset($file) || $file['error'] !== UPLOAD_ERR_OK) {
        return null;
    }
    
    $allowedTypes = ['image/jpeg', 'image/png', 'image/gif'];
    $maxSize = 2 * 1024 * 1024; // 2MB
    
    // Vérifier le type de fichier
    if (!in_array($file['type'], $allowedTypes)) {
        throw new Exception('Type de fichier non autorisé. Utilisez JPG, PNG ou GIF.');
    }
    
    // Vérifier la taille
    if ($file['size'] > $maxSize) {
        throw new Exception('La photo est trop volumineuse (max 2MB).');
    }
    
    // Créer le dossier si nécessaire
    $uploadDir = 'uploads/testimonials/';
    if (!file_exists($uploadDir)) {
        mkdir($uploadDir, 0777, true);
    }
    
    // Générer un nom unique
    $extension = pathinfo($file['name'], PATHINFO_EXTENSION);
    $filename = 'client_' . uniqid() . '.' . $extension;
    $filepath = $uploadDir . $filename;
    
    // Déplacer le fichier
    if (move_uploaded_file($file['tmp_name'], $filepath)) {
        return $filepath;
    } else {
        throw new Exception('Erreur lors de l\'upload de la photo.');
    }
}

// Nettoyer le buffer de sortie et définir les headers
ob_clean();
header('Content-Type: application/json; charset=utf-8');
header('Cache-Control: no-cache, must-revalidate');

// Activer l'affichage des erreurs en mode debug (mais pas d'output)
if (defined('DEBUG') && DEBUG) {
    error_reporting(E_ALL);
    ini_set('display_errors', 0); // Pas d'affichage direct pour ne pas casser le JSON
    ini_set('log_errors', 1); // Logger les erreurs
}

try {
    // Vérifier la méthode HTTP
    if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
        throw new Exception('Méthode non autorisée.');
    }
    
    // Vérifier la connexion DB
    $db = getDbConnection();
    if (!$db) {
        throw new Exception('Impossible de se connecter à la base de données.');
    }
    
    // Validation des champs obligatoires
    $required_fields = ['nom_client', 'email', 'message', 'note', 'consentement'];
    
    foreach ($required_fields as $field) {
        if (empty($_POST[$field])) {
            throw new Exception("Le champ '{$field}' est obligatoire.");
        }
    }
    
    // Nettoyer et valider les données
    $nom_client = cleanInput($_POST['nom_client']);
    $email = cleanInput($_POST['email']);
    $entreprise = cleanInput($_POST['entreprise'] ?? '');
    $poste = cleanInput($_POST['poste'] ?? '');
    $message = cleanInput($_POST['message']);
    $note = intval($_POST['note']);
    $service_utilise = cleanInput($_POST['service_utilise'] ?? '');
    
    // Validations spécifiques
    if (!validateEmail($email)) {
        throw new Exception('Adresse email invalide.');
    }
    
    if ($note < 1 || $note > 5) {
        throw new Exception('La note doit être comprise entre 1 et 5.');
    }
    
    if (strlen($nom_client) < 2 || strlen($nom_client) > 100) {
        throw new Exception('Le nom doit contenir entre 2 et 100 caractères.');
    }
    
    if (strlen($message) < 10 || strlen($message) > 500) {
        throw new Exception('Le message doit contenir entre 10 et 500 caractères.');
    }
    
    // Vérifier si le client a déjà laissé un avis récemment (anti-spam)
    $existing = fetchOne(
        "SELECT id FROM testimonials WHERE email = :email AND date_creation > DATE_SUB(NOW(), INTERVAL 30 DAY)",
        ['email' => $email]
    );
    
    if ($existing) {
        throw new Exception('Vous avez déjà soumis un témoignage récemment. Veuillez patienter 30 jours avant de soumettre un nouveau témoignage.');
    }
    
    // Gérer l'upload de photo (optionnelle)
    $photo_path = null;
    if (isset($_FILES['photo_client']) && $_FILES['photo_client']['error'] === UPLOAD_ERR_OK) {
        try {
            $photo_path = handlePhotoUpload($_FILES['photo_client']);
        } catch (Exception $e) {
            // Si l'upload échoue, on continue sans photo
            error_log("Erreur upload photo testimonial: " . $e->getMessage());
        }
    }
    
    // Préparer les données pour insertion
    $testimonial_data = [
        'nom_client' => $nom_client,
        'email' => $email,
        'entreprise' => $entreprise,
        'poste' => $poste,
        'message' => $message,
        'note' => $note,
        'service_utilise' => $service_utilise,
        'image_client' => $photo_path,
        'ip_address' => $_SERVER['REMOTE_ADDR'] ?? 'unknown',
        'user_agent' => $_SERVER['HTTP_USER_AGENT'] ?? 'unknown',
        'approuve' => 0, // En attente d'approbation par défaut
        'affiche_page_accueil' => 0 // Pas sur la page d'accueil par défaut
    ];
    
    // Debug des données avant insertion
    if (defined('DEBUG') && DEBUG) {
        error_log("Données testimonial: " . print_r($testimonial_data, true));
    }
    
    // Insérer dans la base de données
    try {
        $testimonial_id = insertAndGetId('testimonials', $testimonial_data);
        
        if (!$testimonial_id) {
            throw new Exception('La fonction insertAndGetId a retourné un ID vide.');
        }
        
        // Vérifier que l'insertion a bien eu lieu
        $verification = fetchOne("SELECT id FROM testimonials WHERE id = :id", ['id' => $testimonial_id]);
        if (!$verification) {
            throw new Exception('L\'enregistrement n\'a pas été trouvé après insertion.');
        }
        
    } catch (PDOException $e) {
        error_log("Erreur PDO testimonial: " . $e->getMessage());
        throw new Exception('Erreur de base de données: ' . $e->getMessage());
    } catch (Exception $e) {
        error_log("Erreur insertion testimonial: " . $e->getMessage());
        throw new Exception('Erreur lors de la sauvegarde: ' . $e->getMessage());
    }
    
    // Envoyer une notification par email à l'admin (optionnel)
    try {
        require_once __DIR__ . '/phpmailer/src/PHPMailer.php';
        require_once __DIR__ . '/phpmailer/src/SMTP.php';
        require_once __DIR__ . '/phpmailer/src/Exception.php';
        $db = getDbConnection();
        $row = $db->query('SELECT * FROM smtp_config WHERE id=1')->fetch(PDO::FETCH_ASSOC);
        if ($row && !empty($row['statut']) && $row['statut'] == '1') {
                                    $mail = new PHPMailer(true);
                                    try {
                                            $mail->isSMTP();
                                            $mail->Host = $row['smtp_host'];
                                            $mail->Port = (int)$row['smtp_port'];
                                            $mail->SMTPAuth = true;
                                            $mail->Username = $row['smtp_user'];
                                            $mail->Password = $row['smtp_pass'];
                                            $mail->CharSet = 'UTF-8';
                                            $mail->setFrom($row['smtp_from'], $row['smtp_from_name'] ?? 'SERVICES-AE');
                                            $mail->addAddress($row['email_admin']);
                                            if (!empty($row['email_cc1'])) $mail->addCC($row['email_cc1']);
                                            if (!empty($row['email_cc2'])) $mail->addCC($row['email_cc2']);
                                            $mail->Subject = 'Nouveau témoignage reçu - SERVICES-AE';
                                            $mail->Body = "Un nouveau témoignage a été soumis sur le site SERVICES-AE.\n\nClient: $nom_client ($email)\nEntreprise: $entreprise\nPoste: $poste\nService: $service_utilise\nNote: $note/5\n\nMessage:\n$message\n\nLe témoignage est en attente d'approbation dans le panel d'administration.";
                                            // Chiffrement
                                            if ($row['smtp_ssl'] === 'ssl') $mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;
                                            elseif ($row['smtp_ssl'] === 'tls') $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
                                            else $mail->SMTPSecure = false;
                                            $mail->SMTPOptions = [
                                                'ssl' => [
                                                    'verify_peer' => false,
                                                    'verify_peer_name' => false,
                                                    'allow_self_signed' => true
                                                ]
                                            ];
                                            $mail->SMTPDebug = 2;
                                            $mail->Debugoutput = function($str, $level) use (&$smtp_debug) {
                                                    $smtp_debug .= "[Level $level] $str\n";
                                            };
                                            $smtp_debug = '';
                                            $mail->send();
                                    } catch (Exception $e) {
                                            error_log('Erreur PHPMailer testimonial: ' . $mail->ErrorInfo);
                                            echo '<pre style="color:red;background:#fff;border:1px solid #ccc;padding:10px;">';
                                            echo 'Erreur d\'envoi email admin: ' . htmlspecialchars($mail->ErrorInfo) . "\n\n";
                                            echo htmlspecialchars($smtp_debug ?? '');
                                            echo '</pre>';
                                            exit;
                                    }
        } else {
            // SMTP désactivé, fallback mail()
            $admin_email = COMPANY_EMAIL;
            $subject = "Nouveau témoignage reçu - SERVICES-AE";
            $admin_message = "Un nouveau témoignage a été soumis sur le site SERVICES-AE.\n\nClient: $nom_client ($email)\nEntreprise: $entreprise\nPoste: $poste\nService: $service_utilise\nNote: $note/5\n\nMessage:\n$message\n\nLe témoignage est en attente d'approbation dans le panel d'administration.";
            $headers = [
                'From: ' . COMPANY_EMAIL,
                'Reply-To: ' . $email,
                'Content-Type: text/plain; charset=utf-8'
            ];
            mail($admin_email, $subject, $admin_message, implode("\r\n", $headers));
        }
    } catch (Exception $e) {
        error_log("Erreur envoi notification admin: " . $e->getMessage());
    }
    
    // Réponse de succès
    echo json_encode([
        'success' => true,
        'message' => '🎉 Merci pour votre témoignage ! Il sera publié après validation par notre équipe. Vous recevrez une notification par email une fois approuvé.',
        'testimonial_id' => $testimonial_id
    ]);
    
} catch (Exception $e) {
    // Log de l'erreur
    error_log("Erreur testimonial: " . $e->getMessage());
    
    // Réponse d'erreur
    echo json_encode([
        'success' => false,
        'message' => '❌ ' . $e->getMessage()
    ]);
} catch (PDOException $e) {
    // Erreur de base de données
    error_log("Erreur DB testimonial: " . $e->getMessage());
    
    echo json_encode([
        'success' => false,
        'message' => '❌ Erreur technique. Veuillez réessayer plus tard.'
    ]);
}
?>