<?php
/**
 * Simulateur de menaces — Mode Gardien
 *
 * Classe de test permettant de forcer manuellement des entrées dans avi_security_logs
 * pour démonstration (Spy-Alert, NAP Shield). Utilisée par le bouton "Lancer un Scan de démonstration" (administrateurs uniquement).
 *
 * Règle stricte (Silence Radio) : ce simulateur N'appelle JAMAIS run_wave3(), ni aucun CRON/Maintainers.
 * Uniquement des injections de logs (avi_security_logs) pour éviter de déclencher les vrais CRONs (Cold Start, Drip, Infinite Posts) pendant les tests manuels.
 *
 * @package Avision
 */

namespace Avision;

if ( ! defined( 'ABSPATH' ) ) {
    exit;
}

class AVI_Tester {

    /**
     * Lance une simulation "Boost de Bienvenue" : injection de 2 logs dans avi_security_logs
     * et optionnellement un post de test dans avi_saas_posts + un média pour "Intervention en cours".
     *
     * @param int $user_id    ID utilisateur WordPress (pour avi_security_logs).
     * @param int $profile_id Optionnel. Si > 0 : insère un post démo + un média pour ce profil (avi_saas_posts, avi_saas_media).
     * @return array{ nap_shield: bool, spy_alert: bool, demo_post: bool, message: string }
     */
    public function simulate_full_protection( int $user_id, int $profile_id = 0 ): array {
        global $wpdb;

        $result = [
            'nap_shield' => false,
            'spy_alert'  => false,
            'demo_post'  => false,
            'message'    => '',
        ];

        $t_logs = $wpdb->prefix . 'avi_security_logs';
        $logs_ok = ( $wpdb->get_var( $wpdb->prepare( 'SHOW TABLES LIKE %s', $t_logs ) ) === $t_logs );
        if ( ! $logs_ok ) {
            $result['message'] = 'Table avi_security_logs manquante.';
            return $result;
        }

        $now_ts = (int) current_time( 'timestamp' );
        $message_json_fr_en = function ( $fr, $en ) {
            return wp_json_encode( [ 'fr' => $fr, 'en' => $en ], JSON_UNESCAPED_UNICODE );
        };

        // Horodatages aléatoires dans les 3 dernières heures (pour compteur "Aujourd'hui")
        $minutes_ago_1 = (int) wp_rand( 20, 90 );
        $minutes_ago_2 = (int) wp_rand( 100, 180 );
        $created_at_1  = date( 'Y-m-d H:i:s', $now_ts - ( $minutes_ago_1 * 60 ) );
        $created_at_2  = date( 'Y-m-d H:i:s', $now_ts - ( $minutes_ago_2 * 60 ) );

        // ─── Log 1 : NAP Shield — signal_id 3 = Téléphone
        $nap_fr = '🛡️ NAP Shield : Tentative de modification du numéro de téléphone par un tiers détectée et neutralisée.';
        $nap_en = '🛡️ NAP Shield: Third-party phone number change attempt detected and neutralized.';
        $wpdb->insert( $t_logs, [
            'user_id'      => $user_id,
            'event_type'   => 'real',
            'signal_id'    => 3,
            'status'       => 'blocked',
            'message_json' => $message_json_fr_en( $nap_fr, $nap_en ),
            'created_at'   => $created_at_1,
        ], [ '%d', '%s', '%d', '%s', '%s', '%s' ] );
        $result['nap_shield'] = ( $wpdb->last_error === '' );

        // ─── Log 2 : Spy-Alert — signal_id 2 = Catégorie
        $spy_fr = '🕵️ Spy-Alert : Changement de catégorie détecté chez un concurrent. Analyse d\'impact effectuée.';
        $spy_en = '🕵️ Spy-Alert: Category change detected at a competitor. Impact analysis completed.';
        $wpdb->insert( $t_logs, [
            'user_id'      => $user_id,
            'event_type'   => 'real',
            'signal_id'    => 2,
            'status'       => 'blocked',
            'message_json' => $message_json_fr_en( $spy_fr, $spy_en ),
            'created_at'   => $created_at_2,
        ], [ '%d', '%s', '%d', '%s', '%s', '%s' ] );
        $result['spy_alert'] = ( $wpdb->last_error === '' );

        $msg_parts = [ 'Boost de Bienvenue : 2 tentatives neutralisées injectées (il y a ~' . $minutes_ago_1 . ' min et ~' . $minutes_ago_2 . ' min). Compteur « Aujourd\'hui » mis à jour.' ];

        // ─── Post de test "Intervention en cours" (si profile_id fourni) — isolé pour ne jamais provoquer 500
        if ( $profile_id > 0 ) {
            try {
                $result['demo_post'] = $this->inject_demo_post_for_profile( $profile_id );
                if ( $result['demo_post'] ) {
                    $msg_parts[] = 'Un post de test (avec image) a été ajouté dans Intervention en cours.';
                }
            } catch ( \Throwable $e ) {
                $result['demo_post'] = false;
            }
        }

        $result['message'] = implode( ' ', $msg_parts );
        return $result;
    }

    /**
     * Insère un post de démo (draft) et un média (image) pour le profil, visibles dans "Intervention en cours".
     * Texte : Guardian_Response_Generator (templates VIP, comme "Régénérer le Texte"). Image : cascade Unsplash puis Pexels.
     *
     * @param int $profile_id avi_saas_profiles.id
     * @return bool true si les deux insertions ont réussi
     */
    private function inject_demo_post_for_profile( int $profile_id ): bool {
        global $wpdb;
        $t_posts = $wpdb->prefix . 'avi_saas_posts';
        $t_media = $wpdb->prefix . 'avi_saas_media';
        $t_profiles = $wpdb->prefix . 'avi_saas_profiles';

        if ( $wpdb->get_var( $wpdb->prepare( 'SHOW TABLES LIKE %s', $t_posts ) ) !== $t_posts ) {
            return false;
        }
        if ( $wpdb->get_var( $wpdb->prepare( 'SHOW TABLES LIKE %s', $t_media ) ) !== $t_media ) {
            return false;
        }

        $profile = $wpdb->get_row( $wpdb->prepare(
            "SELECT id, user_id, business_name, city, category FROM {$t_profiles} WHERE id = %d LIMIT 1",
            $profile_id
        ), ARRAY_A );
        if ( ! $profile || empty( $profile['user_id'] ) ) {
            return false;
        }
        $user_id  = (int) $profile['user_id'];
        $city     = isset( $profile['city'] ) ? trim( (string) $profile['city'] ) : 'votre ville';
        $business = isset( $profile['business_name'] ) ? trim( (string) $profile['business_name'] ) : 'notre établissement';
        $category = isset( $profile['category'] ) ? trim( (string) $profile['category'] ) : 'nos services';

        $title   = 'Présentation — Bienvenue';
        $content = '';
        $ctx     = [ 'city' => $city, 'business_name' => $business, 'category' => $category ];

        // Chemin includes garanti (ce fichier est dans includes/)
        $inc = __DIR__ . DIRECTORY_SEPARATOR;

        // 1) Texte premium : charger le générateur puis appeler rewrite_post_text (même logique que "Régénérer le Texte")
        if ( ! class_exists( __NAMESPACE__ . '\Guardian_Response_Generator' ) && file_exists( $inc . 'class-guardian-response-generator.php' ) ) {
            require_once $inc . 'class-guardian-response-generator.php';
        }
        if ( class_exists( __NAMESPACE__ . '\Guardian_Response_Generator' ) ) {
            try {
                $content   = ( new Guardian_Response_Generator() )->rewrite_post_text( '', $ctx );
            } catch ( \Throwable $e ) {
                $content = '';
            }
        }
        $content = is_string( $content ) ? trim( $content ) : '';
        if ( $content === '' || strlen( $content ) < 80 ) {
            $content = 'Bienvenue sur notre fiche. Merci de nous laisser un avis après votre visite.';
        }

        // 2) Image : cascade Unsplash/Pexels via Maintainers (même logique que production ; pas d'URL statique en dur)
        if ( ! class_exists( __NAMESPACE__ . '\Avision_Guardian_Maintainers' ) && file_exists( $inc . 'class-avision-guardian-maintainers.php' ) ) {
            require_once $inc . 'class-avision-guardian-maintainers.php';
        }
        $image_url = null;
        if ( class_exists( __NAMESPACE__ . '\Avision_Guardian_Maintainers' ) ) {
            try {
                $maintainers = new Avision_Guardian_Maintainers();
                $img_result  = $maintainers->get_best_available_image( $profile_id, $category, $city );
                $image_url   = isset( $img_result['url'] ) && is_string( $img_result['url'] ) && $img_result['url'] !== '' ? $img_result['url'] : null;
            } catch ( \Throwable $e ) {
                $image_url = null;
            }
        }
        if ( $image_url === null || $image_url === '' ) {
            if ( ! class_exists( __NAMESPACE__ . '\Avision_Image_API' ) && file_exists( $inc . 'class-avision-image-api.php' ) ) {
                require_once $inc . 'class-avision-image-api.php';
            }
            $image_url = class_exists( __NAMESPACE__ . '\Avision_Image_API' )
                ? Avision_Image_API::get_fallback_placeholder_url()
                : 'https://images.unsplash.com/photo-1566073771259-6a8506099945?w=800&q=80';
        }

        $wpdb->insert( $t_media, [
            'profile_id' => $profile_id,
            'file_path'  => $image_url,
            'media_type' => 'photo',
            'category'   => $category !== '' ? $category : 'demo',
            'status'     => 'in_stock',
        ], [ '%d', '%s', '%s', '%s', '%s' ] );
        if ( $wpdb->last_error !== '' ) {
            return false;
        }

        // Sécurité ultime : si le contenu est trop court (< 100 car.), réessayer avec le générateur VIP pour obtenir un texte long et premium.
        if ( strlen( $content ) < 100 && class_exists( __NAMESPACE__ . '\Guardian_Response_Generator' ) ) {
            $generator = new Guardian_Response_Generator();
            $content   = $generator->rewrite_post_text( '', $ctx );
            $content   = is_string( $content ) ? trim( $content ) : $content;
        }
        // Sécurité : $content ne doit jamais contenir le texte fantôme (verrouillage simulateur).
        if ( stripos( $content, 'Bonjour London' ) !== false && class_exists( __NAMESPACE__ . '\Guardian_Response_Generator' ) ) {
            $content = ( new Guardian_Response_Generator() )->rewrite_post_text( '', $ctx );
            $content = is_string( $content ) ? trim( $content ) : $content;
        }

        $wpdb->insert( $t_posts, [
            'user_id'    => $user_id,
            'profile_id' => $profile_id,
            'post_type'  => 'update',
            'title'     => $title,
            'content'   => $content,
            'status'    => 'draft',
        ], [ '%d', '%d', '%s', '%s', '%s', '%s' ] );

        return ( $wpdb->last_error === '' );
    }

    /**
     * Vérifie si l'utilisateur courant peut voir le bouton "Scan de démonstration".
     * Réservé aux administrateurs (manage_options).
     *
     * @return bool
     */
    public static function can_run_demo_scan(): bool {
        return current_user_can( 'manage_options' );
    }
}
