<?php
/**
 * Pont entre Elementor et le plugin.
 * - Enregistre l'endpoint REST API
 * - Injecte les scripts/styles dans l'éditeur Elementor
 * - Gère le rate limiting
 */

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

class AICF_Elementor_Bridge {

    /** @var AICF_Elementor_Bridge|null */
    private static $instance = null;

    /** Namespace de la REST API */
    const REST_NAMESPACE = 'ai-content-filler/v1';

    /** Clé du transient pour le rate limiting (préfixe + user_id) */
    const RATE_LIMIT_PREFIX = 'aicf_rate_limit_';

    /** Délai minimum entre deux appels (en secondes) */
    const RATE_LIMIT_SECONDS = 10;

    public static function get_instance() {
        if ( null === self::$instance ) {
            self::$instance = new self();
        }
        return self::$instance;
    }

    private function __construct() {
        add_action( 'rest_api_init', array( $this, 'register_routes' ) );

        // Injection des assets uniquement dans l'éditeur Elementor
        add_action( 'elementor/editor/after_enqueue_scripts', array( $this, 'enqueue_editor_assets' ) );
    }

    /**
     * Enregistre la route REST POST /wp-json/ai-content-filler/v1/generate
     */
    public function register_routes() {
        register_rest_route( self::REST_NAMESPACE, '/generate', array(
            'methods'             => 'POST',
            'callback'            => array( $this, 'handle_generate_request' ),
            'permission_callback' => array( $this, 'check_permissions' ),
            'args'                => array(
                'page_id'     => array(
                    'required'          => true,
                    'validate_callback' => function ( $value ) {
                        return is_numeric( $value ) && intval( $value ) > 0;
                    },
                    'sanitize_callback' => 'absint',
                ),
                'user_prompt' => array(
                    'required'          => true,
                    'sanitize_callback' => 'sanitize_textarea_field',
                ),
                'widgets'     => array(
                    'required'          => true,
                    'validate_callback' => function ( $value ) {
                        return is_array( $value ) && ! empty( $value );
                    },
                ),
            ),
        ) );
    }

    /**
     * Vérifie que l'utilisateur a le droit d'éditer des posts.
     */
    public function check_permissions( WP_REST_Request $request ) {
        return current_user_can( 'edit_posts' );
    }

    /**
     * Callback principal de l'endpoint /generate.
     *
     * @param WP_REST_Request $request
     * @return WP_REST_Response|WP_Error
     */
    public function handle_generate_request( WP_REST_Request $request ) {
        // --- Limite quotidienne (plan gratuit) ---
        if ( AICF_License::is_daily_limit_reached() ) {
            return new WP_Error(
                'aicf_daily_limit',
                sprintf(
                    /* translators: %d: daily generation limit for free plan */
                    __( 'Limite quotidienne atteinte (%d générations/jour en plan gratuit). Passez en Pro pour des générations illimitées.', 'ai-content-filler' ),
                    AICF_License::FREE_DAILY_LIMIT
                ),
                array( 'status' => 429 )
            );
        }

        // --- Rate limiting ---
        $user_id        = get_current_user_id();
        $transient_key  = self::RATE_LIMIT_PREFIX . $user_id;

        if ( get_transient( $transient_key ) ) {
            return new WP_Error(
                'aicf_rate_limited',
                sprintf(
                    /* translators: %d: number of seconds to wait between requests */
                    __( 'Veuillez patienter %d secondes entre chaque génération.', 'ai-content-filler' ),
                    self::RATE_LIMIT_SECONDS
                ),
                array( 'status' => 429 )
            );
        }

        // Poser le verrou de rate limiting
        set_transient( $transient_key, true, self::RATE_LIMIT_SECONDS );

        // --- Extraction et nettoyage des paramètres ---
        $page_id     = $request->get_param( 'page_id' );
        $user_prompt = $request->get_param( 'user_prompt' );
        $raw_widgets = $request->get_param( 'widgets' );

        // Nettoyage de chaque widget
        $widgets = array();
        foreach ( $raw_widgets as $w ) {
            if ( empty( $w['id'] ) || empty( $w['type'] ) ) {
                continue;
            }

            $widget_data = array(
                'id'   => sanitize_text_field( $w['id'] ),
                'type' => sanitize_text_field( $w['type'] ),
            );

            // Nouveau format multi-champs
            if ( isset( $w['fields'] ) && is_array( $w['fields'] ) ) {
                $fields = array();
                foreach ( $w['fields'] as $key => $value ) {
                    $safe_key           = sanitize_text_field( $key );
                    $fields[ $safe_key ] = sanitize_textarea_field( $value );
                }
                $widget_data['fields'] = $fields;
            }
            // Rétrocompatibilité ancien format
            elseif ( isset( $w['current_text'] ) ) {
                $widget_data['current_text'] = sanitize_textarea_field( $w['current_text'] );
            }

            $widgets[] = $widget_data;
        }

        if ( empty( $widgets ) ) {
            return new WP_Error(
                'aicf_no_widgets',
                __( 'Aucun widget valide trouvé dans la requête.', 'ai-content-filler' ),
                array( 'status' => 400 )
            );
        }

        // --- Filtrage des widgets selon le plan (gratuit = types limités) ---
        if ( ! aicf_is_pro() ) {
            $allowed = array_merge( AICF_License::FREE_WIDGETS, AICF_License::FREE_BLOCKS );
            $widgets = array_values( array_filter( $widgets, function( $w ) use ( $allowed ) {
                return in_array( $w['type'], $allowed, true );
            } ) );

            if ( empty( $widgets ) ) {
                return new WP_Error(
                    'aicf_pro_widgets_only',
                    __( 'Les types de widgets sélectionnés sont réservés au plan Pro.', 'ai-content-filler' ),
                    array( 'status' => 403 )
                );
            }
        }

        // --- Appel à l'API IA (ton et style lus depuis les réglages) ---
        $api_handler = new AICF_API_Handler();
        $result      = $api_handler->generate_content( $user_prompt, $widgets, $page_id );

        if ( is_wp_error( $result ) ) {
            // Supprimer le rate limit en cas d'erreur pour permettre un retry
            delete_transient( $transient_key );
            return $result;
        }

        // Incrémenter le compteur quotidien (plan gratuit)
        AICF_License::increment_daily_count();

        return new WP_REST_Response( array(
            'success'          => true,
            'widgets'          => $result,
            'dailyRemaining'   => AICF_License::get_remaining_generations(),
        ), 200 );
    }

    /**
     * Enqueue les scripts et styles dans l'éditeur Elementor uniquement.
     */
    public function enqueue_editor_assets() {
        // CSS du panneau
        wp_enqueue_style(
            'aicf-editor-panel',
            AICF_PLUGIN_URL . 'assets/css/editor-panel.css',
            array(),
            AICF_VERSION
        );

        // JS du panneau
        wp_enqueue_script(
            'aicf-editor-panel',
            AICF_PLUGIN_URL . 'assets/js/editor-panel.js',
            array( 'jquery' ),
            AICF_VERSION,
            true
        );

        // Variables JS (nonce, URL API, licence, etc.) — jamais la clé API !
        $is_pro = aicf_is_pro();
        wp_localize_script( 'aicf-editor-panel', 'aicfConfig', array(
            'restUrl'    => esc_url_raw( rest_url( self::REST_NAMESPACE . '/generate' ) ),
            'nonce'      => wp_create_nonce( 'wp_rest' ),
            'isPro'      => $is_pro,
            'upgradeUrl' => esc_url_raw( AICF_License::get_upgrade_url() ),
            'freeWidgets'    => $is_pro ? array() : AICF_License::FREE_WIDGETS,
            'freeTemplates'  => $is_pro ? array() : AICF_License::FREE_TEMPLATES,
            'dailyRemaining' => AICF_License::get_remaining_generations(),
            'dailyLimit'     => $is_pro ? -1 : AICF_License::FREE_DAILY_LIMIT,
            'i18n'       => array(
                'idle'           => __( 'Prêt à générer', 'ai-content-filler' ),
                'loading'        => __( 'Génération en cours...', 'ai-content-filler' ),
                'success'        => __( 'Contenu généré avec succès !', 'ai-content-filler' ),
                'error'          => __( 'Erreur', 'ai-content-filler' ),
                'no_widgets'     => __( 'Aucun widget avec du contenu texte trouvé sur cette page.', 'ai-content-filler' ),
                'empty_prompt'   => __( 'Veuillez saisir un prompt.', 'ai-content-filler' ),
                'no_api_key'     => __( 'Configurez votre clé API dans Réglages > TextFlow.', 'ai-content-filler' ),
                'rate_limited'   => __( 'Veuillez patienter quelques secondes avant de relancer.', 'ai-content-filler' ),
                'save_reminder'  => __( 'N\'oubliez pas de sauvegarder la page avec le bouton Elementor.', 'ai-content-filler' ),
                'daily_limit'    => __( 'Limite quotidienne atteinte. Revenez demain ou passez en Pro.', 'ai-content-filler' ),
                'pro_feature'    => __( 'Fonctionnalité Pro', 'ai-content-filler' ),
                'upgrade'        => __( 'Passer en Pro', 'ai-content-filler' ),
                'pro_widget'     => __( 'Ce type de widget est réservé au plan Pro.', 'ai-content-filler' ),
            ),
        ) );
    }
}
