<?php
/**
 * Traitement des témoignages clients - SERVICES-AE (Version corrigée)
 * Gère la soumission, validation et stockage des avis clients
 */

// Démarrer la mise en mémoire tampon
ob_start();

// Inclure les fichiers de configuration
require_once 'config/config.php';
require_once 'config/db.php';

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

// Désactiver l'affichage des erreurs pour ne pas casser le JSON
ini_set('display_errors', 0);
error_reporting(0);

/**
 * Fonction pour envoyer une réponse JSON et terminer
 */
function sendJsonResponse($success, $message, $data = null) {
    $response = [
        'success' => $success,
        'message' => $message
    ];
    
    if ($data !== null) {
        $response = array_merge($response, $data);
    }
    
    echo json_encode($response, JSON_UNESCAPED_UNICODE);
    exit;
}

/**
 * Fonction pour nettoyer 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.');
    }
}

try {
    // Vérifier la méthode HTTP
    if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
        sendJsonResponse(false, 'Méthode non autorisée.');
    }
    
    // Vérifier la connexion DB
    $db = getDbConnection();
    if (!$db) {
        sendJsonResponse(false, '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])) {
            sendJsonResponse(false, "Le champ '$field' est obligatoire.");
        }
    }
    
    // Démarrer la session pour le captcha
    if (session_status() === PHP_SESSION_NONE) {
        session_start();
    }
    
    // Valider le captcha
    $captcha_answer = intval($_POST['captcha_answer'] ?? 0);
    $correct_answer = intval($_SESSION['captcha_answer'] ?? 0);
    
    if ($captcha_answer !== $correct_answer) {
        sendJsonResponse(false, 'Vérification de sécurité incorrecte. Veuillez réessayer.');
    }
    
    // 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)) {
        sendJsonResponse(false, 'Adresse email invalide.');
    }
    
    if ($note < 1 || $note > 5) {
        sendJsonResponse(false, 'La note doit être comprise entre 1 et 5.');
    }
    
    if (strlen($nom_client) < 2 || strlen($nom_client) > 100) {
        sendJsonResponse(false, 'Le nom doit contenir entre 2 et 100 caractères.');
    }
    
    if (strlen($message) < 10 || strlen($message) > 500) {
        sendJsonResponse(false, '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) {
        sendJsonResponse(false, '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 (pas critique)
        }
    }
    
    // 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
    ];
    
    // Insérer dans la base de données
    try {
        $testimonial_id = insertAndGetId('testimonials', $testimonial_data);
        
        if (!$testimonial_id) {
            sendJsonResponse(false, 'Erreur lors de la sauvegarde de votre témoignage.');
        }
        
        // Vérifier que l'insertion a bien eu lieu
        $verification = fetchOne("SELECT id FROM testimonials WHERE id = :id", ['id' => $testimonial_id]);
        if (!$verification) {
            sendJsonResponse(false, 'L\'enregistrement n\'a pas été trouvé après insertion.');
        }
        
        // Envoyer une notification par email à l'admin (optionnel)
        try {
            if (defined('COMPANY_EMAIL') && COMPANY_EMAIL) {
                $admin_email = COMPANY_EMAIL;
                $subject = "Nouveau témoignage - SERVICES-AE";
                $admin_message = "Nouveau témoignage de $nom_client ($email)\nNote: $note/5\nMessage: $message";
                
                $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) {
            // Si l'email échoue, on continue (pas critique)
        }
        
        // Réponse de succès
        sendJsonResponse(true, '🎉 Merci pour votre témoignage ! Il sera publié après validation par notre équipe.', [
            'testimonial_id' => $testimonial_id
        ]);
        
    } catch (PDOException $e) {
        error_log("Erreur PDO testimonial: " . $e->getMessage());
        sendJsonResponse(false, 'Erreur de base de données lors de la sauvegarde.');
    } catch (Exception $e) {
        error_log("Erreur insertion testimonial: " . $e->getMessage());
        sendJsonResponse(false, 'Erreur lors de la sauvegarde: ' . $e->getMessage());
    }
    
} catch (Exception $e) {
    // Log de l'erreur
    error_log("Erreur testimonial général: " . $e->getMessage());
    
    // Réponse d'erreur
    sendJsonResponse(false, $e->getMessage());
}

// Si on arrive ici, quelque chose s'est mal passé
sendJsonResponse(false, 'Une erreur inattendue s\'est produite.');
?>