<?php
namespace Avision;

/**
 * Guardrails de progression AVI : protection des données de la roadmap.
 *
 * Injection du contexte dynamique (niveau actuel) et règles de divulgation stricte
 * pour ne pas révéler les instructions techniques des niveaux supérieurs.
 * Universel sur les 21 niveaux.
 */
class Avision_AVI_Guardrails {

    /** Cartographie simplifiée pour l'IA (roadmap) */
    const ROADMAP_BLOCKS = [
        1  => [ 'min' => 1, 'max' => 3, 'name' => 'Fondations', 'desc' => 'Catégorie, Description, Photos' ],
        4  => [ 'min' => 4, 'max' => 4, 'name' => 'Mode Gardien', 'desc' => 'Protection' ],
        5  => [ 'min' => 5, 'max' => 10, 'name' => 'Rayonnement', 'desc' => 'GPS, Horaires, Attributs' ],
        11 => [ 'min' => 11, 'max' => 21, 'name' => 'Domination', 'desc' => 'Posts, Avis, Annuaires, Expansion' ],
    ];

    /**
     * Retourne le bloc roadmap (nom + description) pour un niveau donné.
     *
     * @param int $level_num Niveau 1-21
     * @return array { 'name' => string, 'desc' => string, 'min' => int, 'max' => int } ou null
     */
    public static function get_roadmap_block_for_level( $level_num ) {
        $level_num = (int) $level_num;
        if ( $level_num < 1 || $level_num > 21 ) {
            return null;
        }
        foreach ( self::ROADMAP_BLOCKS as $block ) {
            if ( $level_num >= $block['min'] && $level_num <= $block['max'] ) {
                return $block;
            }
        }
        return null;
    }

    /**
     * Retourne le bloc roadmap pour un niveau "futur" (sujet demandé par l'utilisateur).
     * Utilisé pour le teaser : "Tu anticipes déjà le [Nom du Sprint/Niveau]..."
     *
     * @param int $level_num Niveau 1-21
     * @return array|null
     */
    public static function get_future_block_name_for_level( $level_num ) {
        $block = self::get_roadmap_block_for_level( $level_num );
        return $block ? $block['name'] : null;
    }

    /**
     * Génère le bloc de guardrails à injecter en tête du System Prompt.
     * Contient : injection du niveau actuel, règle d'or de divulgation, structure de réponse, cartographie, ton coach.
     *
     * @param int $current_level Niveau actuel de l'utilisateur (1-21)
     * @return string Texte à préfixer au system prompt (sans trailing newline si concat simple)
     */
    public static function get_system_prompt_guardrails( $current_level ) {
        $current_level = (int) $current_level;
        if ( $current_level < 1 || $current_level > 21 ) {
            $current_level = 1;
        }

        $block = self::get_roadmap_block_for_level( $current_level );
        $block_name = $block ? $block['name'] : 'Fondations';

        $injection = sprintf(
            "L'utilisateur est au NIVEAU %d. Tu as interdiction formelle de donner les instructions techniques des niveaux supérieurs à %d.\n\n",
            $current_level,
            $current_level
        );

        $rule = <<<RULE
RÈGLE D'OR DE DIVULGATION (STRICT DISCLOSURE RULE) :
Si l'utilisateur pose une question sur un concept technique (ex: posts, annuaires, GPS, avis, tags, réputation, expansion) qui appartient à un niveau FUTUR (supérieur à {$current_level}) :
• NE PAS RÉPONDRE techniquement.
• TEASER le futur : Identifie à quel niveau/sprint appartient le sujet (voir cartographie ci-dessous).
• JUSTIFIER par la sécurité : Explique que Google surveille la cohérence et que brûler les étapes = danger de suspension.

Structure de réponse type pour les éléments cachés (niveaux > {$current_level}) :
"C'est une vision de leader, Chef. Tu anticipes déjà le [Nom du Sprint/Niveau], mais ma mission est de protéger ta fiche. Google déteste la précipitation. Nous débloquerons cette puissance au Niveau [X]. Pour l'instant, ta priorité absolue est de valider le Niveau {$current_level}. Chaque chose en son temps pour une domination durable."

RULE;

        $roadmap = <<<ROADMAP
CARTOGRAPHIE SIMPLIFIÉE (pour identifier à quel bloc appartient un sujet) :
• Niveaux 1-3 : Fondations (Catégorie, Description, Photos).
• Niveau 4 : Mode Gardien (Protection).
• Niveaux 5-10 : Rayonnement (GPS, Horaires, Attributs).
• Niveaux 11-21 : Domination (Posts, Avis, Annuaires, Expansion).

ROADMAP;

        $tone = "TON : Garde le ton 'Premium Coach' : protecteur, ferme sur la méthode, mais encourageant sur la vision long terme.\n\n";

        $post_vip_instruction = '';
        if ( class_exists( __NAMESPACE__ . '\\Guardian_Response_Generator' ) && method_exists( __NAMESPACE__ . '\\Guardian_Response_Generator', 'get_post_vip_system_instruction' ) ) {
            $post_vip_instruction = \Avision\Guardian_Response_Generator::get_post_vip_system_instruction() . "\n\n";
        } else {
            $post_vip_instruction = "INTERDICTION : Ne commence jamais tes posts par 'Bonjour {Ville}' ou 'Nous sommes ravis'. Utilise une approche VIP : commence par un emoji étoilé et une phrase d'accroche sur l'expertise, comme '🌟 Ravi de vous voir ici !'. Tes posts doivent faire exactement 3 paragraphes.\n\n";
        }

        return "--- GUARDRAILS DE PROGRESSION (NIVEAU ACTUEL = {$current_level}) ---\n\n" . $injection . $rule . "\n" . $roadmap . "\n" . $tone . "--- POSTS / FICHE GBP ---\n" . $post_vip_instruction . "--- FIN POSTS ---\n\n--- FIN GUARDRAILS ---\n\n";
    }

    /**
     * Paragraphe statique pour l’option Knowledge Center `avi_prompt_b2c_global` (complète les guardrails dynamiques par requête).
     *
     * @return string
     */
    public static function get_knowledge_center_global_gating_paragraph() {
        return __(
            'RÈGLE STRICTE — ANTI-SPOIL ET GATING (progression) : le niveau réel de l’utilisateur et des consignes chiffrées peuvent t’être injectés ailleurs dans le prompt à chaque message ; applique toujours la même logique. Si la question porte sur un palier strictement supérieur au sien, sur une option ou une fonctionnalité qu’il n’a pas encore (ex. extension Radar 75/100 mots-clés, outils du Mode Gardien non actifs), ou sur les instructions techniques détaillées d’un niveau non débloqué : ne livre pas le tutoriel pas à pas, ni les missions « brouillon » des paliers futurs, ni les détails opérationnels réservés aux niveaux suivants. Dis-lui clairement de terminer et de valider son Sprint ou son palier actuel d’abord ; tu peux seulement teaser en langage métier en nommant le grand bloc concerné, sans recopier les textes des champs Knowledge des niveaux verrouillés. Carte indicative (identification des sujets) : niveaux 1 à 3 — Fondations ; niveau 4 — Mode Gardien ; niveaux 5 à 10 — Rayonnement ; niveaux 11 à 21 — Domination. Ne promets jamais une préparation type « Mission de l’Ombre » ni un plan détaillé pour un niveau ou un Sprint que sa progression n’a pas encore ouverts. Pour les sujets futurs, tu peux évoquer la cohérence Google et le risque de précipitation, comme dans la consigne dynamique de divulgation, sans inventer de contenu de niveau supérieur.',
            'avision-dashboard'
        );
    }

    // ========================================
    // ALIAS UTILISATEUR PAR SECTEUR (personnalisation AVI)
    // ========================================

    /**
     * Retourne l'alias pour s'adresser à l'utilisateur selon le secteur.
     * FOOD, SERVICE → Chef ; FITNESS → Coach ; autres (HEALTH, AUTO, etc.) → pas d'alias ; défaut → Chef.
     *
     * @param string $sector Secteur (FOOD, SERVICE, FITNESS, HEALTH, AUTO, BEAUTY, RETAIL, PROF_SERV, HOSPITALITY)
     * @return string 'Chef', 'Coach' ou '' (vide)
     */
    public static function get_user_alias_for_sector( $sector ) {
        $s = is_string( $sector ) ? strtoupper( trim( $sector ) ) : '';
        if ( $s === 'FOOD' || $s === 'SERVICE' ) {
            return 'Chef';
        }
        if ( $s === 'FITNESS' ) {
            return 'Coach';
        }
        if ( in_array( $s, [ 'HEALTH', 'AUTO', 'BEAUTY', 'RETAIL', 'PROF_SERV', 'HOSPITALITY' ], true ) ) {
            return '';
        }
        return 'Chef'; // défaut si secteur inconnu
    }

    /**
     * Retourne l'instruction à injecter dans le System Prompt pour l'alias utilisateur.
     * À appeler à chaque requête pour que le changement soit instantané si l'utilisateur modifie ses infos.
     *
     * @param string $sector Secteur de l'audit en cours
     * @return string Bloc d'instruction pour l'IA
     */
    public static function get_user_alias_system_instruction( $sector ) {
        $user_alias = self::get_user_alias_for_sector( $sector );
        $instruction = "Ton nom pour t'adresser à l'utilisateur est " . ( $user_alias === '' ? '[VIDE]' : $user_alias ) . ". ";
        if ( $user_alias === '' ) {
            $instruction .= "Adresse-toi à lui normalement, sans titre particulier.";
        } else {
            $instruction .= "Utilise \"{$user_alias}\" de temps en temps pour marquer ton respect et ton rôle de second (ex: \"C'est une vision de leader, {$user_alias}.\"), sans en abuser.";
        }
        return "--- ALIAS UTILISATEUR (secteur = " . ( $sector ?: 'non défini' ) . ") ---\n" . $instruction . "\n--- FIN ALIAS ---\n\n";
    }
}
