<?php
/**
 * AdSense Delay Loading Functionality
 *
 * Delays the loading of AdSense scripts until user interaction or timeout
 * to improve initial page load performance.
 *
 * @package ROI_Theme
 * @since 1.0.0
 */

// Exit if accessed directly
if (!defined('ABSPATH')) {
    exit;
}

/**
 * Retarda la carga de scripts de AdSense interceptando el buffer de salida
 *
 * DESACTIVADO: El renderer (AdsensePlacementRenderer) ya genera scripts con
 * type="text/plain" data-adsense-push, por lo que este output buffer es
 * REDUNDANTE y causa conflictos con otros buffers (zlib compression).
 *
 * El buffer solo sería necesario para procesar scripts de AdSense de plugins
 * externos, pero causa pérdida de contenido al interferir con otros buffers.
 *
 * @see Public/AdsensePlacement/Infrastructure/Ui/AdsensePlacementRenderer.php
 */
function roi_delay_adsense_scripts() {
    // DESACTIVADO: Output buffer causa conflictos y pérdida de contenido
    // El renderer ya genera scripts con type="text/plain"
    return;

    // Solo ejecutar en frontend
    if (is_admin()) {
        return;
    }

    // Verificar si el retardo de AdSense está habilitado desde adsense-placement
    // IMPORTANTE: Usar adsense-placement (no adsense-delay que no existe)
    $delay_enabled = roi_get_component_setting('adsense-placement', 'forms', 'delay_enabled', true);

    if (!$delay_enabled) {
        return;
    }

    // Iniciar output buffering
    ob_start('roi_replace_adsense_scripts');
}
add_action('template_redirect', 'roi_delay_adsense_scripts', 1);

/**
 * Reemplaza scripts de AdSense con versiones retrasadas
 *
 * Esta función procesa la salida HTML y reemplaza las etiquetas de script
 * estándar de AdSense con versiones de carga retrasada.
 *
 * @param string $html El contenido HTML a procesar
 * @return string HTML modificado con scripts de AdSense retrasados
 */
function roi_replace_adsense_scripts($html) {
    // Solo procesar si hay contenido real de AdSense
    if (strpos($html, 'pagead2.googlesyndication.com') === false &&
        strpos($html, 'adsbygoogle.js') === false) {
        return $html;
    }

    // Patrones para encontrar etiquetas de script de AdSense
    // NOTA: Usamos grupos de captura ($1) para preservar la URL completa incluyendo ?client=
    $patterns = array(
        // Buscar etiquetas de script async para AdSense (captura URL completa con client ID)
        '/<script\s+async\s+src=["\'](https:\/\/pagead2\.googlesyndication\.com\/pagead\/js\/adsbygoogle\.js[^"\']*)["\']\s*(?:crossorigin=["\']anonymous["\'])?\s*><\/script>/i',

        // Buscar etiquetas de script sin async (captura URL completa con client ID)
        '/<script\s+src=["\'](https:\/\/pagead2\.googlesyndication\.com\/pagead\/js\/adsbygoogle\.js[^"\']*)["\']\s*(?:crossorigin=["\']anonymous["\'])?\s*><\/script>/i',

        // Buscar scripts inline de adsbygoogle.push
        '/<script>\s*\(adsbygoogle\s*=\s*window\.adsbygoogle\s*\|\|\s*\[\]\)\.push\(\{[^}]*\}\);\s*<\/script>/is',
    );

    // Reemplazar scripts async de AdSense con versiones retrasadas
    // IMPORTANTE: $1 preserva la URL completa incluyendo ?client=ca-pub-XXXXXX
    $replacements = array(
        // Reemplazar etiqueta de script async con atributo data para carga retrasada
        '<script type="text/plain" data-adsense-script src="$1" crossorigin="anonymous"></script>',

        // Reemplazar etiqueta de script no-async
        '<script type="text/plain" data-adsense-script src="$1" crossorigin="anonymous"></script>',

        // Reemplazar scripts de push inline con versiones retrasadas
        '<script type="text/plain" data-adsense-push>$0</script>',
    );

    // Primera pasada: reemplazar etiquetas de script
    $html = preg_replace($patterns[0], $replacements[0], $html);
    $html = preg_replace($patterns[1], $replacements[1], $html);

    // Segunda pasada: reemplazar llamadas inline de push
    $html = preg_replace_callback(
        '/<script>\s*\(adsbygoogle\s*=\s*window\.adsbygoogle\s*\|\|\s*\[\]\)\.push\(\{[^}]*\}\);\s*<\/script>/is',
        function($matches) {
            return '<script type="text/plain" data-adsense-push>' . $matches[0] . '</script>';
        },
        $html
    );

    // Agregar comentario para indicar que se procesó (solo en modo debug)
    if (defined('WP_DEBUG') && WP_DEBUG) {
        $html = str_replace('</body>', '<!-- Scripts de AdSense retrasados por ROI Theme --></body>', $html);
    }

    return $html;
}

/**
 * Agrega script inline para inicializar AdSense retrasado
 *
 * Esto agrega un pequeño script inline que marca AdSense como listo para cargar
 * después de que adsense-loader.js ha sido enqueued.
 */
function roi_add_adsense_init_script() {
    // Verificar si el retardo de AdSense está habilitado desde adsense-placement
    $delay_enabled = roi_get_component_setting('adsense-placement', 'forms', 'delay_enabled', true);

    if (!$delay_enabled || is_admin()) {
        return;
    }

    ?>
    <script>
    // Inicializar flag de retardo de AdSense
    window.roiAdsenseDelayed = true;
    </script>
    <?php
}
add_action('wp_head', 'roi_add_adsense_init_script', 1);

/**
 * INSTRUCCIONES DE USO:
 *
 * Para activar el retardo de carga de AdSense:
 * 1. Ir al panel de opciones del tema (Dashboard > ROI Theme Options)
 * 2. En la sección "Performance", activar la opción "Delay AdSense Loading"
 * 3. Guardar cambios
 *
 * Comportamiento:
 * - Los scripts de AdSense NO se cargarán hasta que el usuario:
 *   * Haga scroll en la página
 *   * Haga click en cualquier parte
 *   * Toque la pantalla (móviles)
 *   * Mueva el mouse
 *   * Presione una tecla
 * - Si no hay interacción, los scripts se cargarán después de 5 segundos
 *
 * Beneficios:
 * - Mejora significativa en Core Web Vitals (FID, TBT)
 * - Reduce el tiempo de carga inicial de la página
 * - No afecta la monetización (los ads se siguen mostrando)
 * - Sin layout shifts al cargar los ads
 *
 * Para desactivar:
 * - Desmarcar la opción en el panel de opciones del tema
 * - Los scripts de AdSense se cargarán normalmente
 */
