<?php
namespace Avision;

/**
 * Mode Gardien - Gestion automatique des avis Google
 * 
 * Ce module transforme AVI de "Conseiller" à "Pilote" en gérant
 * automatiquement les réponses aux avis Google sans intervention humaine.
 * 
 * Protocoles disponibles :
 * - AMBASSADEUR : Pour les avis positifs (4-5⭐) - Remerciement + SEO
 * - RIPOSTE STRATÉGIQUE : Pour les avis négatifs (1-2⭐) - Calme, pro, invitation privée
 * - ALERTE : Pour les avis suspects/injurieux - Pas de réponse auto
 */
class Guardian_Mode {
    private $database;
    private $nlp_analyzer;
    private $response_generator;
    
    /**
     * Constantes de configuration
     */
    const REVIEW_MODE_AUTO = 'auto';
    const REVIEW_MODE_MANUAL = 'manual';
    const REVIEW_MODE_HYBRID = 'hybrid';
    
    /**
     * Initialise le Mode Gardien
     */
    public function __construct() {
        $this->database = new Avision_Database();
        $this->database->init();
        $this->nlp_analyzer = new Guardian_NLP_Analyzer();
        $this->response_generator = new Guardian_Response_Generator();
        
        // Configurer la température à 0.7 pour varier les réponses
        $this->response_generator->set_temperature(0.7);
    }
    
    /**
     * Active le Mode Gardien pour un client
     * 
     * @param int $audit_id ID de l'audit client
     * @param array $settings Configuration du mode gardien
     * @return bool
     */
    public function activate($audit_id, $settings = []) {
        $default_settings = [
            'auto_respond' => true,
            'response_delay' => 60, // Délai en minutes (cible < 1h)
            'tone_of_voice' => 'professional', // professional, friendly, casual
            'include_seo' => true,
            'notification_email' => true,
            'languages' => ['fr', 'en']
        ];
        
        $settings = array_merge($default_settings, $settings);
        
        return $this->database->activate_guardian_mode($audit_id, $settings);
    }
    
    /**
     * Webhook pour recevoir les nouveaux avis Google
     * Redirige vers autoReplyGuardian pour le traitement
     * 
     * @param array $review_data Données de l'avis depuis l'API Google
     * @return array Résultat du traitement
     */
    public function handle_review_webhook($review_data) {
        return $this->autoReplyGuardian($review_data);
    }
    
    /**
     * ============================================
     * FONCTION PRINCIPALE : autoReplyGuardian
     * ============================================
     * 
     * Point d'entrée principal du Mode Gardien (100% Auto)
     * Analyse, génère et publie automatiquement les réponses aux avis.
     * 
     * Conditions de fonctionnement :
     * - isGuardianActive == true
     * - reviewSetting == 'auto'
     * 
     * Protocoles :
     * - 4-5⭐ : Protocole AMBASSADEUR (remerciement + ${city} + service détecté)
     * - 1-2⭐ : Protocole RIPOSTE STRATÉGIQUE (calme, pro, invitation privée)
     * - Injurieux/Spam : ALERTE (pas de réponse auto, notification immédiate)
     * - Sans texte : Réponse élégante et concise
     * 
     * @param array $reviewData Données de l'avis depuis l'API Google
     * @return array Résultat du traitement
     */
    public function autoReplyGuardian($reviewData) {
        try {
            // ============================================
            // ÉTAPE 1: RÉCEPTION & VALIDATION
            // ============================================
            $review = $this->validate_review($reviewData);
            if (!$review) {
                return ['success' => false, 'error' => 'Invalid review data', 'action' => 'rejected'];
            }
            
            // Vérifier si le Mode Gardien est actif
            $settings = $this->database->get_guardian_settings($review['audit_id']);
            $isGuardianActive = $settings && !empty($settings['is_active']);
            $reviewSetting = $settings['auto_respond'] ?? false;
            
            // Si le Mode Gardien n'est pas actif
            if (!$isGuardianActive) {
                return [
                    'success' => false, 
                    'error' => 'Guardian Mode not active',
                    'action' => 'skipped',
                    'is_guardian_active' => $isGuardianActive
                ];
            }
            
            // Mode Validation : générer la réponse et sauvegarder en attente (sans publier)
            $isValidationMode = ($reviewSetting === false || $reviewSetting === 'manual');
            
            // Enrichir le review avec les données de l'audit si manquantes
            $audit = $this->database->get_audit_by_id($review['audit_id']);
            if ($audit) {
                if (empty($review['company_name'])) {
                    $review['company_name'] = $audit['business_name'] ?? $audit['company_name'] ?? 'Notre entreprise';
                }
                if (empty($review['city'])) {
                    $review['city'] = $audit['city'] ?? '';
                }
                if (empty($review['category'])) {
                    $review['category'] = $audit['category'] ?? $review['company_name'];
                }
            }
            
            // ============================================
            // ÉTAPE 2: SCAN STARS - Identification du ton
            // ============================================
            $stars = $review['rating'];
            $tone = $this->determine_tone($stars);
            $protocol = $this->determine_protocol($stars);
            
            // ============================================
            // ÉTAPE 3: ANALYSE NLP - Extraction du contexte
            // ============================================
            $context = $this->nlp_analyzer->analyze($review['text'] ?? '', $review['language']);
            
            // ============================================
            // SÉCURITÉ: Détection avis suspect ou injurieux
            // ============================================
            if ($context['requires_human_review']) {
                // ALERTE IMMÉDIATE - Pas de réponse automatique
                $this->send_alert_notification($review, $context);
                
                // Enregistrer l'avis sans réponse (flagged)
                $this->database->save_review_response([
                    'audit_id' => $review['audit_id'],
                    'review_id' => $review['review_id'],
                    'reviewer_name' => $review['reviewer_name'] ?? 'Anonymous',
                    'stars' => $stars,
                    'review_text' => $review['text'] ?? '',
                    'language' => $review['language'] ?? 'fr',
                    'response_text' => '',
                    'context' => json_encode($context),
                    'published' => false,
                    'response_time' => 0
                ]);
                
                return [
                    'success' => true,
                    'action' => 'flagged',
                    'review_id' => $review['review_id'],
                    'reason' => $context['is_profane'] ? 'Langage injurieux détecté' : 'Spam/Avis suspect détecté',
                    'details' => $context['is_profane'] ? $context['profanity_details'] : $context['spam_details'],
                    'message' => 'Alerte envoyée à l\'utilisateur. Aucune réponse automatique générée.'
                ];
            }
            
            // ============================================
            // ÉTAPE 4: RÉDACTION - Génération de la réponse
            // ============================================
            $gen_params = [
                'stars' => $stars,
                'tone' => $tone,
                'context' => $context,
                'company' => $review['company_name'],
                'city' => $review['city'],
                'sector' => $review['category'] ?? $review['company_name'],
                'reviewer_name' => $review['reviewer_name'],
                'language' => $review['language'],
                'review_text' => $review['text'] ?? '',
                'include_seo' => true,
                'for_validation' => $isValidationMode
            ];
            $gen_result = $this->response_generator->generateWithJustification($gen_params);
            $response_text = is_array($gen_result) ? ($gen_result['response'] ?? '') : $gen_result;
            $avi_justification = is_array($gen_result) ? ($gen_result['justification'] ?? '') : '';
            
            // ============================================
            // MODE VALIDATION : Sauvegarder et retourner (sans publier)
            // ============================================
            if ($isValidationMode) {
                $context_data = is_array($context) ? $context : [];
                $context_data['avi_justification'] = $avi_justification;
                
                $this->database->save_review_response([
                    'audit_id' => $review['audit_id'],
                    'review_id' => $review['review_id'],
                    'reviewer_name' => $review['reviewer_name'] ?? 'Anonymous',
                    'stars' => $stars,
                    'review_text' => $review['text'] ?? '',
                    'language' => $review['language'] ?? 'fr',
                    'response_text' => $response_text,
                    'context' => json_encode($context_data),
                    'published' => false,
                    'response_time' => 0,
                    'review_created_at' => $review['created_at'] ?? null
                ]);
                
                // Crisis Mode : avis ≤2★ en manual → email urgence (priorité haute)
                if ($stars <= 2 && $audit) {
                    $notifications = new Avision_Notifications();
                    $dashboard_url = home_url('/premium-dashboard') . '?audit_id=' . $review['audit_id'];
                    $notifications->send_crisis_alert_email($audit, $review, $dashboard_url, $response_text);
                } else {
                    $this->send_validation_required_notification($review, $response_text, $avi_justification, $protocol);
                }
                
                return [
                    'success' => true,
                    'action' => 'pending_validation',
                    'review_id' => $review['review_id'],
                    'response_text' => $response_text,
                    'avi_justification' => $avi_justification,
                    'message' => 'Réponse générée. En attente de validation du Chef.'
                ];
            }
            
            // ============================================
            // ÉTAPE 5: PUBLICATION sur Google (mode auto)
            // ============================================
            $published = $this->publish_to_google($review['review_id'], $response_text, $review['audit_id']);
            
            // ============================================
            // ÉTAPE 6: RAPPORT - Notification à l'utilisateur
            // Crisis Mode : avis ≤2★ en auto → "J'ai neutralisé une attaque pour vous"
            // ============================================
            if ($stars <= 2 && $audit) {
                $notifications = new Avision_Notifications();
                $dashboard_url = home_url('/premium-dashboard') . '?audit_id=' . $review['audit_id'];
                $notifications->send_crisis_neutralized_email($audit, $review, $response_text, $dashboard_url);
            } else {
                $this->send_notification($review, $response_text, $published, $protocol);
            }
            
            // Enregistrement dans la base de données
            $this->database->save_review_response([
                'audit_id' => $review['audit_id'],
                'review_id' => $review['review_id'],
                'reviewer_name' => $review['reviewer_name'] ?? 'Anonymous',
                'stars' => $stars,
                'review_text' => $review['text'] ?? '',
                'language' => $review['language'] ?? 'fr',
                'response_text' => $response_text,
                'context' => json_encode($context),
                'published' => $published,
                'response_time' => time() - strtotime($review['created_at']),
                'status' => $published ? 'published' : 'pending',
                'protocol_used' => $protocol
            ]);
            
            // Déterminer le type de réponse pour le rapport
            $response_type = $this->get_response_type_label($stars, $context, $review['language']);
            
            return [
                'success' => true,
                'action' => 'auto_replied',
                'review_id' => $review['review_id'],
                'response_published' => $published,
                'response_time_minutes' => round((time() - strtotime($review['created_at'])) / 60, 2),
                'protocol_used' => $protocol,
                'response_type' => $response_type,
                'response_preview' => mb_substr($response_text, 0, 100) . '...'
            ];
            
        } catch (\Exception $e) {
            error_log('Guardian Mode autoReplyGuardian Error: ' . $e->getMessage());
            return ['success' => false, 'error' => $e->getMessage(), 'action' => 'error'];
        }
    }
    
    /**
     * Détermine le protocole à utiliser selon les étoiles
     * 
     * @param int $stars Nombre d'étoiles
     * @return string Nom du protocole
     */
    private function determine_protocol($stars) {
        if ($stars >= 4) {
            return 'ambassador'; // Protocole Ambassadeur
        } elseif ($stars <= 2) {
            return 'strategic_response'; // Protocole Riposte Stratégique
        } else {
            return 'standard'; // Réponse standard
        }
    }
    
    /**
     * Génère un label descriptif du type de réponse
     * 
     * @param int $stars Nombre d'étoiles
     * @param array $context Contexte NLP
     * @param string $language Langue
     * @return string Label descriptif
     */
    private function get_response_type_label($stars, $context, $language = 'fr') {
        $labels = [
            'fr' => [
                5 => 'Client très satisfait',
                4 => 'Client satisfait',
                3 => 'Avis mitigé',
                2 => 'Client mécontent',
                1 => 'Client très mécontent'
            ],
            'en' => [
                5 => 'Very satisfied customer',
                4 => 'Satisfied customer',
                3 => 'Mixed review',
                2 => 'Unhappy customer',
                1 => 'Very unhappy customer'
            ]
        ];
        
        $base_label = $labels[$language][$stars] ?? $labels['fr'][$stars] ?? 'Avis';
        
        // Ajouter le contexte détecté
        if (!empty($context['categories'])) {
            $main_category = array_key_first($context['categories']);
            $category_names = [
                'fr' => [
                    'service' => 'de l\'accueil',
                    'quality' => 'de la qualité',
                    'price' => 'du prix',
                    'speed' => 'de la rapidité',
                    'cleanliness' => 'de la propreté',
                    'location' => 'de l\'emplacement',
                    'expertise' => 'du professionnalisme'
                ],
                'en' => [
                    'service' => 'with service',
                    'quality' => 'with quality',
                    'price' => 'with pricing',
                    'speed' => 'with speed',
                    'cleanliness' => 'with cleanliness',
                    'location' => 'with location',
                    'expertise' => 'with professionalism'
                ]
            ];
            
            $category_label = $category_names[$language][$main_category] ?? '';
            if ($category_label) {
                $base_label .= ' ' . $category_label;
            }
        }
        
        return $base_label;
    }
    
    /**
     * Envoie une notification "Validation requise" pour le mode hybride
     * 
     * @param array $review Données de l'avis
     * @param string $response_text Réponse générée par AVI
     * @param string $avi_justification Explication tactique d'AVI
     * @param string $protocol Protocole utilisé
     */
    private function send_validation_required_notification($review, $response_text, $avi_justification, $protocol = 'standard') {
        $audit = $this->database->get_audit_by_id($review['audit_id']);
        
        if (!$audit || !$audit['email']) {
            return;
        }
        
        $stars_visual = str_repeat('⭐', $review['rating']) . str_repeat('☆', 5 - $review['rating']);
        $review_text = !empty($review['text']) ? $review['text'] : '(Avis sans commentaire - étoiles uniquement)';
        $owner_name = $audit['business_name'] ?? ($audit['company_name'] ?? '');
        $business_name = $audit['business_name'] ?? ($audit['company_name'] ?? '');
        $pending_hours = '24';
        $to_email = sanitize_email((string) $audit['email']);
        $wp_uid = 0;
        if (is_email($to_email)) {
            $wp_lookup = get_user_by('email', $to_email);
            $wp_uid = ($wp_lookup instanceof \WP_User) ? (int) $wp_lookup->ID : 0;
        }

        $subject = "✍️ AVI - Validation requise : avis de {$review['reviewer_name']} ({$stars_visual})";
        $message = "
        <html>
        <body style='font-family: Arial, sans-serif; max-width: 600px; margin: 0 auto;'>
            <div style='background: linear-gradient(135deg, #d97706 0%, #b45309 100%); padding: 20px; border-radius: 10px 10px 0 0;'>
                <h1 style='color: white; margin: 0;'>🤖 Mode Gardien - Validation</h1>
                <p style='color: rgba(255,255,255,0.9); margin: 5px 0 0 0;'>Chef, une réponse attend ta validation</p>
            </div>
            
            <div style='background: white; padding: 25px; border: 1px solid #e5e7eb;'>
                <div style='background: #fef3c7; padding: 12px; border-radius: 8px; margin-bottom: 20px; border-left: 4px solid #d97706;'>
                    <p style='margin: 0; font-weight: bold; color: #92400e;'>📋 {$stars_visual} | Avis de {$review['reviewer_name']}</p>
                    <p style='margin: 8px 0 0 0; font-style: italic; color: #78350f;'>\"{$review_text}\"</p>
                </div>
                
                <div style='background: #f9fafb; padding: 15px; border-radius: 8px; margin: 20px 0;'>
                    <p style='margin: 0 0 8px 0; font-weight: bold; color: #374151;'>💬 Proposition AVI</p>
                    <p style='margin: 0; color: #374151; white-space: pre-line;'>{$response_text}</p>
                </div>
                
                " . (!empty($avi_justification) ? "
                <div style='background: #eff6ff; padding: 12px; border-radius: 8px; margin: 15px 0; border-left: 4px solid #3b82f6;'>
                    <p style='margin: 0; font-size: 0.95rem; color: #1e40af;'>💡 <em>{$avi_justification}</em></p>
                </div>
                " : "") . "
                
                <div style='text-align: center; margin: 25px 0;'>
                    <a href='" . home_url('/premium-dashboard') . "?audit_id={$review['audit_id']}' style='background: linear-gradient(135deg, #d97706 0%, #b45309 100%); color: white; padding: 12px 24px; text-decoration: none; border-radius: 6px; display: inline-block;'>
                        ✍️ Valider la réponse sur le Dashboard
                    </a>
                </div>
            </div>
            
            <div style='background: #fffbeb; padding: 15px; border-radius: 0 0 10px 10px; border: 1px solid #e5e7eb; border-top: none;'>
                <p style='margin: 0; color: #78350f; font-size: 12px; text-align: center;'>
                    Tu es le Chef. AVI propose, tu valides. Ne laisse pas tes clients sans réponse plus de 24h ! ⏱️
                </p>
            </div>
        </body>
        </html>
        ";

        $sent = false;
        if (class_exists('\Avision\Avision_Email_Manager')) {
            $sent = \Avision\Avision_Email_Manager::send_avi_email(
                $wp_uid,
                \Avision\Avision_Email_Manager::TYPE_GUARDIAN_VALIDATION,
                [
                    'recipient_email' => $to_email,
                    'user_name' => $owner_name,
                    'business_name' => $business_name,
                    'reviewer_name' => (string) ($review['reviewer_name'] ?? ''),
                    'stars_display' => $stars_visual,
                    'review_text' => $review_text,
                    'suggested_reply' => (string) $response_text,
                    'pending_hours' => $pending_hours,
                    'dashboard_url' => trailingslashit(home_url('/premium-dashboard/')),
                ]
            );
        }
        if (!$sent && function_exists('wp_mail')) {
            wp_mail($to_email, $subject, $message, ['Content-Type: text/html; charset=UTF-8']);
        }
    }
    
    /**
     * Publie une réponse validée sur Google (depuis le Hub de Validation)
     * 
     * @param string $review_id ID de l'avis Google
     * @param int $audit_id ID de l'audit
     * @param string|null $response_text Texte final (ou null pour utiliser celui en base)
     * @return array Résultat
     */
    public function publishValidatedResponse($review_id, $audit_id, $response_text = null) {
        $reviews = $this->database->get_pending_reviews($audit_id);
        $review = null;
        foreach ($reviews as $r) {
            if ($r['review_id'] === $review_id) {
                $review = $r;
                break;
            }
        }
        
        if (!$review) {
            return ['success' => false, 'error' => 'Review not found or already published'];
        }
        
        $text_to_publish = $response_text !== null && $response_text !== '' 
            ? $response_text 
            : ($review['response_text'] ?? '');
        
        if (empty($text_to_publish)) {
            return ['success' => false, 'error' => 'No response text to publish'];
        }
        
        $published = $this->publish_to_google($review_id, $text_to_publish, $audit_id);
        
        if ($published) {
            $this->database->mark_review_published($review_id, $text_to_publish);
        }
        
        return [
            'success' => $published,
            'published' => $published,
            'message' => $published ? 'Réponse publiée avec succès' : 'Erreur lors de la publication'
        ];
    }
    
    /**
     * Régénère une réponse pour un avis en attente de validation
     * 
     * @param string $review_id ID de l'avis
     * @param int $audit_id ID de l'audit
     * @return array Nouvelle réponse + justification
     */
    public function regeneratePendingResponse($review_id, $audit_id) {
        $reviews = $this->database->get_pending_reviews($audit_id);
        $review_data = null;
        foreach ($reviews as $r) {
            if ($r['review_id'] === $review_id) {
                $review_data = $r;
                break;
            }
        }
        
        if (!$review_data) {
            return ['success' => false, 'error' => 'Review not found'];
        }
        
        $context = json_decode($review_data['context_data'] ?? '{}', true) ?: [];
        unset($context['avi_justification']);
        
        $audit = $this->database->get_audit_by_id($audit_id);
        $company = $audit['business_name'] ?? $audit['company_name'] ?? 'Notre entreprise';
        $city = $audit['city'] ?? '';
        $category = $audit['category'] ?? $company;
        
        $gen_result = $this->response_generator->generateWithJustification([
            'stars' => (int) $review_data['rating'],
            'context' => $context,
            'company' => $company,
            'city' => $city,
            'sector' => $category,
            'reviewer_name' => $review_data['reviewer_name'],
            'language' => $review_data['review_language'] ?? 'fr',
            'review_text' => $review_data['review_text'] ?? '',
            'include_seo' => true,
            'for_validation' => true
        ]);
        
        $response_text = is_array($gen_result) ? ($gen_result['response'] ?? '') : $gen_result;
        $avi_justification = is_array($gen_result) ? ($gen_result['justification'] ?? '') : '';
        
        $context['avi_justification'] = $avi_justification;
        $this->database->update_pending_review_response($review_id, $response_text, json_encode($context));
        
        return [
            'success' => true,
            'response_text' => $response_text,
            'avi_justification' => $avi_justification
        ];
    }
    
    /**
     * Envoie une ALERTE immédiate pour avis suspect ou injurieux
     * 
     * @param array $review Données de l'avis
     * @param array $context Contexte NLP avec détails de détection
     */
    private function send_alert_notification($review, $context) {
        $audit = $this->database->get_audit_by_id($review['audit_id']);
        
        if (!$audit || !$audit['email']) {
            return;
        }
        
        // Déterminer le type d'alerte
        if ($context['is_profane']) {
            $alert_type = '🚨 ALERTE : Langage Injurieux Détecté';
            $alert_reason = 'J\'ai détecté un langage inapproprié dans cet avis.';
            $details = $context['profanity_details'];
        } else {
            $alert_type = '⚠️ ALERTE : Avis Suspect Détecté';
            $alert_reason = 'J\'ai détecté des éléments suspects dans cet avis (spam potentiel).';
            $details = $context['spam_details'];
        }
        
        $subject = "🤖 AVI - {$alert_type}";
        $detection_reason = implode(', ', $details['reasons'] ?? [$details['severity'] ?? 'Suspicious content detected']);
        $stars = (int) ($review['rating'] ?? 0);
        $stars_display = str_repeat('⭐', max(0, min(5, $stars)));
        $review_text = (string) ($review['text'] ?? '');
        $owner_name = $audit['business_name'] ?? ($audit['company_name'] ?? '');
        $business_name = $audit['business_name'] ?? ($audit['company_name'] ?? '');
        $to_email = sanitize_email((string) $audit['email']);
        $wp_uid = 0;
        if (is_email($to_email)) {
            $wp_lookup = get_user_by('email', $to_email);
            $wp_uid = ($wp_lookup instanceof \WP_User) ? (int) $wp_lookup->ID : 0;
        }

        $message = "
        <html>
        <body style='font-family: Arial, sans-serif;'>
            <div style='background: #fef2f2; border: 2px solid #ef4444; border-radius: 10px; padding: 20px; margin-bottom: 20px;'>
                <h2 style='color: #dc2626; margin: 0;'>{$alert_type}</h2>
            </div>
            
            <p>Bonjour,</p>
            <p><strong>{$alert_reason}</strong></p>
            <p>Je vous laisse reprendre la main pour celui-ci.</p>
            
            <div style='background: #f5f5f5; padding: 15px; border-radius: 8px; margin: 20px 0;'>
                <h3>📝 Avis concerné ({$review['rating']} ⭐)</h3>
                <p><strong>Auteur :</strong> {$review['reviewer_name']}</p>
                <p style='font-style: italic;'>\"{$review['text']}\"</p>
            </div>
            
            <div style='background: #fef3c7; padding: 15px; border-radius: 8px; margin: 20px 0;'>
                <h3>🔍 Détails de la détection</h3>
                <p><strong>Raisons :</strong> " . esc_html($detection_reason) . "</p>
            </div>
            
            <div style='background: #dbeafe; padding: 15px; border-radius: 8px; margin: 20px 0;'>
                <h3>💡 Que faire ?</h3>
                <ul>
                    <li>Vérifiez l'avis sur votre fiche Google Business</li>
                    <li>Si l'avis est abusif, signalez-le à Google</li>
                    <li>Si l'avis est légitime, répondez manuellement avec tact</li>
                </ul>
            </div>
            
            <p><a href='https://business.google.com' style='background: #667eea; color: white; padding: 12px 24px; text-decoration: none; border-radius: 6px; display: inline-block;'>Voir sur Google Business</a></p>
            
            <hr style='margin: 30px 0;'>
            <p style='color: #666; font-size: 12px;'>
                Cette alerte a été générée automatiquement par AVI en Mode Gardien.<br>
                <strong>Aucune réponse automatique n'a été publiée pour cet avis.</strong>
            </p>
        </body>
        </html>
        ";

        $sent = false;
        if (class_exists('\Avision\Avision_Email_Manager')) {
            $sent = \Avision\Avision_Email_Manager::send_avi_email(
                $wp_uid,
                \Avision\Avision_Email_Manager::TYPE_GUARDIAN_ALERT_NLP,
                [
                    'recipient_email' => $to_email,
                    'user_name' => $owner_name,
                    'business_name' => $business_name,
                    'reviewer_name' => (string) ($review['reviewer_name'] ?? ''),
                    'stars_display' => $stars_display,
                    'review_text' => $review_text,
                    'alert_type' => $alert_type,
                    'detection_reason' => $detection_reason,
                    'dashboard_url' => trailingslashit(home_url('/premium-dashboard/')),
                ]
            );
        }
        if (!$sent && function_exists('wp_mail')) {
            wp_mail($to_email, $subject, $message, ['Content-Type: text/html; charset=UTF-8']);
        }
    }
    
    /**
     * Valide et normalise les données de l'avis
     */
    private function validate_review($data) {
        $required = ['review_id', 'rating', 'text', 'reviewer_name', 'created_at', 'audit_id'];
        
        foreach ($required as $field) {
            if (empty($data[$field])) {
                return null;
            }
        }
        
        // Détection automatique de la langue si non fournie
        if (empty($data['language'])) {
            $data['language'] = $this->nlp_analyzer->detect_language($data['text']);
        }
        
        return $data;
    }
    
    /**
     * Détermine le ton de la réponse selon le nombre d'étoiles
     * 
     * @param int $stars Nombre d'étoiles (1-5)
     * @return string Ton à utiliser
     */
    private function determine_tone($stars) {
        if ($stars >= 4) {
            return 'grateful'; // Reconnaissance et remerciement
        } elseif ($stars == 3) {
            return 'constructive'; // Constructif et amélioration
        } else {
            return 'empathetic'; // Empathie et résolution
        }
    }
    
    /**
     * Publie la réponse sur Google Business Profile
     * 
     * @param string $review_id ID de l'avis
     * @param string $response_text Texte de la réponse
     * @param int $audit_id ID de l'audit pour récupérer les credentials
     * @return bool Succès de la publication
     */
    private function publish_to_google($review_id, $response_text, $audit_id = null) {
        // Récupérer les credentials Google depuis les settings
        if ($audit_id) {
            $settings = $this->database->get_guardian_settings($audit_id);
            
            if ($settings && !empty($settings['google_access_token']) && !empty($settings['google_location_id'])) {
                require_once AVISION_PATH . 'includes/class-google-my-business-api.php';
                
                try {
                    $google_api = new Google_My_Business_API(
                        $settings['google_access_token'],
                        $settings['google_location_id']
                    );
                    
                    // Vérifier que le token est valide
                    if (!$google_api->verify_token()) {
                        error_log('Guardian Mode: Google token expired or invalid');
                        return false;
                    }
                    
                    // Publier la réponse
                    return $google_api->reply_to_review($review_id, $response_text);
                    
                } catch (\Exception $e) {
                    error_log('Guardian Mode: Google API Error - ' . $e->getMessage());
                    return false;
                }
            }
        }
        
        // Mode simulation si pas de credentials
        error_log('Guardian Mode: Simulation mode - Response not published to Google');
        return true; // Retourne true pour les tests
    }
    
    /**
     * Envoie une notification à l'utilisateur après réponse automatique
     * 
     * @param array $review Données de l'avis
     * @param string $response_text Réponse générée
     * @param bool $published Statut de publication
     * @param string $protocol Protocole utilisé
     */
    private function send_notification($review, $response_text, $published, $protocol = 'standard') {
        $audit = $this->database->get_audit_by_id($review['audit_id']);
        
        if (!$audit || !$audit['email']) {
            return;
        }
        
        // Labels des protocoles
        $protocol_labels = [
            'ambassador' => '🌟 Protocole Ambassadeur',
            'strategic_response' => '🛡️ Protocole Riposte Stratégique',
            'standard' => '📝 Réponse Standard'
        ];
        $protocol_label = $protocol_labels[$protocol] ?? '📝 Réponse Standard';
        
        // Couleur selon les étoiles
        $stars = $review['rating'];
        if ($stars >= 4) {
            $color = '#10b981'; // Vert
            $emoji = '🌟';
        } elseif ($stars == 3) {
            $color = '#f59e0b'; // Orange
            $emoji = '⚠️';
        } else {
            $color = '#ef4444'; // Rouge
            $emoji = '🔴';
        }
        
        // Étoiles visuelles
        $stars_visual = str_repeat('⭐', $stars) . str_repeat('☆', 5 - $stars);
        
        $response_time = round((time() - strtotime($review['created_at'])) / 60, 0);
        
        $subject = "🤖 AVI a répondu pour vous à l'avis de {$review['reviewer_name']} ({$stars_visual})";
        
        $review_text = !empty($review['text']) ? $review['text'] : '(Avis sans commentaire - étoiles uniquement)';
        $owner_name = $audit['business_name'] ?? ($audit['company_name'] ?? '');
        $business_name = $audit['business_name'] ?? ($audit['company_name'] ?? '');
        $to_email = sanitize_email((string) $audit['email']);
        $wp_uid = 0;
        if (is_email($to_email)) {
            $wp_lookup = get_user_by('email', $to_email);
            $wp_uid = ($wp_lookup instanceof \WP_User) ? (int) $wp_lookup->ID : 0;
        }

        $message = "
        <html>
        <body style='font-family: Arial, sans-serif; max-width: 600px; margin: 0 auto;'>
            <div style='background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); padding: 20px; border-radius: 10px 10px 0 0;'>
                <h1 style='color: white; margin: 0;'>🤖 Mode Gardien</h1>
                <p style='color: rgba(255,255,255,0.9); margin: 5px 0 0 0;'>J'ai répondu automatiquement pour vous</p>
            </div>
            
            <div style='background: white; padding: 25px; border: 1px solid #e5e7eb;'>
                <div style='display: flex; justify-content: space-between; align-items: center; margin-bottom: 20px;'>
                    <span style='background: {$color}; color: white; padding: 6px 12px; border-radius: 20px; font-size: 14px;'>
                        {$emoji} {$stars} étoiles
                    </span>
                    <span style='background: #f3f4f6; padding: 6px 12px; border-radius: 20px; font-size: 12px; color: #4b5563;'>
                        {$protocol_label}
                    </span>
                </div>
                
                <div style='background: #f9fafb; padding: 15px; border-radius: 8px; margin: 20px 0; border-left: 4px solid {$color};'>
                    <p style='margin: 0 0 8px 0; font-weight: bold; color: #374151;'>📝 Avis de {$review['reviewer_name']}</p>
                    <p style='margin: 0; font-style: italic; color: #6b7280;'>\"{$review_text}\"</p>
                </div>
                
                <div style='background: #ecfdf5; padding: 15px; border-radius: 8px; margin: 20px 0; border-left: 4px solid #10b981;'>
                    <p style='margin: 0 0 8px 0; font-weight: bold; color: #374151;'>💬 Ma réponse</p>
                    <p style='margin: 0; color: #374151; white-space: pre-line;'>{$response_text}</p>
                </div>
                
                <div style='display: grid; grid-template-columns: 1fr 1fr; gap: 15px; margin: 20px 0;'>
                    <div style='background: #f3f4f6; padding: 12px; border-radius: 8px; text-align: center;'>
                        <p style='margin: 0; font-size: 12px; color: #6b7280;'>Statut</p>
                        <p style='margin: 5px 0 0 0; font-weight: bold; color: " . ($published ? '#10b981' : '#f59e0b') . ";'>
                            " . ($published ? '✅ Publié' : '⏳ En attente') . "
                        </p>
                    </div>
                    <div style='background: #f3f4f6; padding: 12px; border-radius: 8px; text-align: center;'>
                        <p style='margin: 0; font-size: 12px; color: #6b7280;'>Temps de réponse</p>
                        <p style='margin: 5px 0 0 0; font-weight: bold; color: " . ($response_time <= 60 ? '#10b981' : '#f59e0b') . ";'>
                            {$response_time} minutes
                        </p>
                    </div>
                </div>
                
                <div style='text-align: center; margin: 25px 0;'>
                    <a href='https://business.google.com' style='background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 12px 24px; text-decoration: none; border-radius: 6px; display: inline-block;'>
                        📍 Voir sur Google Maps
                    </a>
                </div>
            </div>
            
            <div style='background: #f9fafb; padding: 15px; border-radius: 0 0 10px 10px; border: 1px solid #e5e7eb; border-top: none;'>
                <p style='margin: 0; color: #6b7280; font-size: 12px; text-align: center;'>
                    Cette réponse a été générée automatiquement par AVI en Mode Gardien.<br>
                    <a href='#' style='color: #667eea;'>Gérer mes préférences</a> • <a href='#' style='color: #667eea;'>Voir l'historique</a>
                </p>
            </div>
        </body>
        </html>
        ";

        $sent = false;
        if (class_exists('\Avision\Avision_Email_Manager')) {
            $sent = \Avision\Avision_Email_Manager::send_avi_email(
                $wp_uid,
                \Avision\Avision_Email_Manager::TYPE_GUARDIAN_REPLY_AUTO,
                [
                    'recipient_email' => $to_email,
                    'user_name' => $owner_name,
                    'business_name' => $business_name,
                    'reviewer_name' => (string) ($review['reviewer_name'] ?? ''),
                    'stars_display' => $stars_visual,
                    'review_text' => $review_text,
                    'reply_text' => (string) $response_text,
                    'dashboard_url' => trailingslashit(home_url('/premium-dashboard/')),
                ]
            );
        }
        if (!$sent && function_exists('wp_mail')) {
            wp_mail($to_email, $subject, $message, ['Content-Type: text/html; charset=UTF-8']);
        }
    }
    
    /**
     * Obtient les statistiques du Mode Gardien pour un client
     * 
     * @param int $audit_id ID de l'audit
     * @return array Statistiques
     */
    public function get_statistics($audit_id) {
        return $this->database->get_guardian_statistics($audit_id);
    }
    
    /**
     * Désactive le Mode Gardien
     * 
     * @param int $audit_id ID de l'audit
     * @return bool
     */
    public function deactivate($audit_id) {
        return $this->database->deactivate_guardian_mode($audit_id);
    }
    
    /**
     * Obtient la dernière réponse automatique pour affichage dans le dashboard
     * 
     * @param int $audit_id ID de l'audit
     * @return array|null Dernière réponse ou null
     */
    public function getLastAutoResponse($audit_id) {
        $reviews = $this->database->get_recent_reviews($audit_id, 1);
        
        if (empty($reviews)) {
            return null;
        }
        
        $review = $reviews[0];
        
        // Calculer le temps écoulé depuis la réponse
        $response_time = strtotime($review['response_published_at'] ?? $review['created_at']);
        $time_diff = time() - $response_time;
        
        if ($time_diff < 60) {
            $time_ago = 'à l\'instant';
        } elseif ($time_diff < 3600) {
            $minutes = round($time_diff / 60);
            $time_ago = "il y a {$minutes} minute" . ($minutes > 1 ? 's' : '');
        } elseif ($time_diff < 86400) {
            $hours = round($time_diff / 3600);
            $time_ago = "il y a {$hours} heure" . ($hours > 1 ? 's' : '');
        } else {
            $days = round($time_diff / 86400);
            $time_ago = "il y a {$days} jour" . ($days > 1 ? 's' : '');
        }
        
        // Label du type d'avis
        $context = json_decode($review['context_data'] ?? '{}', true);
        $response_type = $this->get_response_type_label(
            $review['rating'], 
            $context ?: [], 
            $review['review_language'] ?? 'fr'
        );
        
        return [
            'review_id' => $review['review_id'],
            'reviewer_name' => $review['reviewer_name'],
            'rating' => $review['rating'],
            'review_text' => $review['review_text'],
            'response_text' => $review['response_text'],
            'response_published' => $review['response_published'],
            'time_ago' => $time_ago,
            'response_type' => $response_type,
            'protocol_used' => $review['protocol_used'] ?? 'standard',
            'response_time_minutes' => round(($review['response_time_seconds'] ?? 0) / 60, 0)
        ];
    }
    
    /**
     * Obtient le statut complet du Mode Gardien pour le dashboard
     * 
     * @param int $audit_id ID de l'audit
     * @return array Statut complet
     */
    public function getDashboardStatus($audit_id) {
        $settings = $this->database->get_guardian_settings($audit_id);
        $stats = $this->get_statistics($audit_id);
        $last_response = $this->getLastAutoResponse($audit_id);
        
        $is_active = $settings && !empty($settings['is_active']);
        
        return [
            'is_active' => $is_active,
            'status_label' => $is_active ? '🛡️ Mode Gardien Actif' : '⏸️ Mode Gardien Inactif',
            'status_class' => $is_active ? 'active' : 'inactive',
            'settings' => $settings,
            'statistics' => [
                'total_reviews' => $stats['total_reviews'] ?? 0,
                'total_responses' => $stats['total_responses'] ?? 0,
                'avg_response_time' => round($stats['avg_response_time_minutes'] ?? 0, 1),
                'reviews_by_rating' => [
                    5 => $stats['reviews_5_stars'] ?? 0,
                    4 => $stats['reviews_4_stars'] ?? 0,
                    3 => $stats['reviews_3_stars'] ?? 0,
                    2 => $stats['reviews_2_stars'] ?? 0,
                    1 => $stats['reviews_1_star'] ?? 0
                ]
            ],
            'last_response' => $last_response,
            'last_response_summary' => $last_response 
                ? "Dernière réponse automatique générée {$last_response['time_ago']} ({$last_response['rating']}⭐ - {$last_response['response_type']})"
                : 'Aucune réponse automatique générée pour le moment'
        ];
    }
    
    /**
     * Vérifie si le Mode Gardien peut traiter un avis
     * Utile pour les tests et le debug
     * 
     * @param array $reviewData Données de l'avis
     * @return array Résultat de la vérification
     */
    public function canProcessReview($reviewData) {
        $review = $this->validate_review($reviewData);
        
        if (!$review) {
            return ['can_process' => false, 'reason' => 'Données invalides'];
        }
        
        $settings = $this->database->get_guardian_settings($review['audit_id']);
        
        if (!$settings || empty($settings['is_active'])) {
            return ['can_process' => false, 'reason' => 'Mode Gardien non actif'];
        }
        
        if ($settings['auto_respond'] !== true) {
            return ['can_process' => false, 'reason' => 'Mode automatique désactivé'];
        }
        
        // Vérifier si l'avis est suspect
        $context = $this->nlp_analyzer->analyze($review['text'] ?? '', $review['language']);
        
        if ($context['requires_human_review']) {
            return [
                'can_process' => false, 
                'reason' => 'Avis suspect/injurieux détecté',
                'will_alert' => true,
                'details' => $context['is_profane'] ? 'Langage injurieux' : 'Spam détecté'
            ];
        }
        
        return [
            'can_process' => true, 
            'reason' => 'Prêt pour traitement automatique',
            'protocol' => $this->determine_protocol($review['rating'])
        ];
    }
}
