/**
 * Cargador Retrasado de AdSense
 *
 * Este script retrasa la carga de Google AdSense hasta que haya interacción
 * del usuario o se cumpla un timeout, mejorando el rendimiento de carga inicial.
 *
 * @package ROI_Theme
 * @since 1.0.0
 */

(function() {
    'use strict';

    // Configuración
    const CONFIG = {
        timeout: 5000,              // Timeout de fallback en milisegundos
        loadedClass: 'adsense-loaded',
        debug: false                // Cambiar a true para logs en consola
    };

    // Estado
    let adsenseLoaded = false;
    let loadTimeout = null;

    /**
     * Registra mensajes de debug si el modo debug está habilitado
     * @param {string} message - El mensaje a registrar
     */
    function debugLog(message) {
        if (CONFIG.debug && typeof console !== 'undefined') {
            console.log('[AdSense Loader] ' + message);
        }
    }

    /**
     * Carga los scripts de AdSense e inicializa los ads
     */
    function loadAdSense() {
        // Prevenir múltiples cargas
        if (adsenseLoaded) {
            debugLog('AdSense ya fue cargado, omitiendo...');
            return;
        }

        adsenseLoaded = true;
        debugLog('Cargando scripts de AdSense...');

        // Limpiar el timeout si existe
        if (loadTimeout) {
            clearTimeout(loadTimeout);
            loadTimeout = null;
        }

        // Remover event listeners para prevenir múltiples triggers
        removeEventListeners();

        // Cargar etiquetas de script de AdSense
        loadAdSenseScripts();

        // Ejecutar scripts de push de AdSense
        executeAdSensePushScripts();

        // Agregar clase loaded al body
        document.body.classList.add(CONFIG.loadedClass);

        debugLog('Carga de AdSense completada');
    }

    /**
     * Encuentra y carga todas las etiquetas de script de AdSense retrasadas
     */
    function loadAdSenseScripts() {
        const delayedScripts = document.querySelectorAll('script[data-adsense-script]');

        if (delayedScripts.length === 0) {
            debugLog('No se encontraron scripts retrasados de AdSense');
            return;
        }

        debugLog('Se encontraron ' + delayedScripts.length + ' script(s) retrasado(s) de AdSense');

        delayedScripts.forEach(function(oldScript) {
            const newScript = document.createElement('script');

            // Copiar atributos
            if (oldScript.src) {
                newScript.src = oldScript.src;
            }

            // Establecer atributo async
            newScript.async = true;

            // Copiar crossorigin si está presente
            if (oldScript.getAttribute('crossorigin')) {
                newScript.crossorigin = oldScript.getAttribute('crossorigin');
            }

            // Reemplazar script viejo con el nuevo
            oldScript.parentNode.replaceChild(newScript, oldScript);
        });
    }

    /**
     * Ejecuta scripts de push de AdSense retrasados
     */
    function executeAdSensePushScripts() {
        const delayedPushScripts = document.querySelectorAll('script[data-adsense-push]');

        if (delayedPushScripts.length === 0) {
            debugLog('No se encontraron scripts de push retrasados de AdSense');
            return;
        }

        debugLog('Se encontraron ' + delayedPushScripts.length + ' script(s) de push retrasado(s)');

        // Inicializar array adsbygoogle si no existe
        window.adsbygoogle = window.adsbygoogle || [];

        delayedPushScripts.forEach(function(oldScript) {
            const scriptContent = oldScript.innerHTML;

            // Crear y ejecutar nuevo script
            const newScript = document.createElement('script');
            newScript.innerHTML = scriptContent;
            newScript.type = 'text/javascript';

            // Reemplazar script viejo con el nuevo
            oldScript.parentNode.replaceChild(newScript, oldScript);
        });
    }

    /**
     * Manejador de eventos para interacciones del usuario
     */
    function handleUserInteraction() {
        debugLog('Interacción del usuario detectada');
        loadAdSense();
    }

    /**
     * Remueve todos los event listeners
     */
    function removeEventListeners() {
        window.removeEventListener('scroll', handleUserInteraction, { passive: true });
        window.removeEventListener('mousemove', handleUserInteraction, { passive: true });
        window.removeEventListener('touchstart', handleUserInteraction, { passive: true });
        window.removeEventListener('click', handleUserInteraction, { passive: true });
        window.removeEventListener('keydown', handleUserInteraction, { passive: true });
    }

    /**
     * Agrega event listeners para interacciones del usuario
     */
    function addEventListeners() {
        debugLog('Agregando event listeners para interacción del usuario');

        // Evento de scroll - cargar en primer scroll
        window.addEventListener('scroll', handleUserInteraction, { passive: true, once: true });

        // Movimiento de mouse - cargar cuando el usuario mueve el mouse
        window.addEventListener('mousemove', handleUserInteraction, { passive: true, once: true });

        // Eventos táctiles - cargar en primer toque (móviles)
        window.addEventListener('touchstart', handleUserInteraction, { passive: true, once: true });

        // Eventos de click - cargar en primer click
        window.addEventListener('click', handleUserInteraction, { passive: true, once: true });

        // Eventos de teclado - cargar en primera pulsación de tecla
        window.addEventListener('keydown', handleUserInteraction, { passive: true, once: true });
    }

    /**
     * Establece timeout de fallback para cargar AdSense después del tiempo especificado
     */
    function setTimeoutFallback() {
        debugLog('Estableciendo timeout de fallback (' + CONFIG.timeout + 'ms)');

        loadTimeout = setTimeout(function() {
            debugLog('Timeout alcanzado, cargando AdSense');
            loadAdSense();
        }, CONFIG.timeout);
    }

    /**
     * Activa slots de AdSense insertados dinamicamente
     * Escucha el evento 'roi-adsense-activate' disparado por otros scripts
     */
    function setupDynamicAdsListener() {
        window.addEventListener('roi-adsense-activate', function() {
            debugLog('Evento roi-adsense-activate recibido');

            // Si AdSense aun no ha cargado, forzar carga ahora
            if (!adsenseLoaded) {
                debugLog('AdSense no cargado, forzando carga...');
                loadAdSense();
                return;
            }

            // AdSense ya cargado - activar nuevos slots
            debugLog('Activando nuevos slots dinamicos...');
            activateDynamicSlots();
        });
    }

    /**
     * Activa slots de AdSense que fueron insertados despues de la carga inicial
     */
    function activateDynamicSlots() {
        // Buscar scripts de push que aun no han sido ejecutados
        var pendingPushScripts = document.querySelectorAll('script[data-adsense-push][type="text/plain"]');

        if (pendingPushScripts.length === 0) {
            debugLog('No hay slots pendientes por activar');
            return;
        }

        debugLog('Activando ' + pendingPushScripts.length + ' slot(s) dinamico(s)');

        // Asegurar que adsbygoogle existe
        window.adsbygoogle = window.adsbygoogle || [];

        pendingPushScripts.forEach(function(oldScript) {
            try {
                // Crear nuevo script ejecutable
                var newScript = document.createElement('script');
                newScript.type = 'text/javascript';
                newScript.innerHTML = oldScript.innerHTML;

                // Reemplazar el placeholder con el script real
                oldScript.parentNode.replaceChild(newScript, oldScript);
            } catch (e) {
                debugLog('Error activando slot: ' + e.message);
            }
        });
    }

    /**
     * Inicializa el cargador retrasado de AdSense
     */
    function init() {
        // =========================================================================
        // NUEVO: Siempre configurar listener para ads dinamicos
        // IMPORTANTE: Esto debe ejecutarse ANTES del early return
        // porque los ads dinamicos pueden necesitar activarse aunque
        // el delay global este deshabilitado
        // =========================================================================
        setupDynamicAdsListener();
        debugLog('Listener para ads dinamicos configurado');

        // Verificar si el retardo de AdSense está habilitado
        if (!window.roiAdsenseDelayed) {
            debugLog('Retardo de AdSense no habilitado');
            return;
        }

        debugLog('Inicializando cargador retrasado de AdSense');

        // Verificar si la página ya está interactiva o completa
        if (document.readyState === 'interactive' || document.readyState === 'complete') {
            debugLog('Página ya cargada, iniciando listeners');
            addEventListeners();
            setTimeoutFallback();
        } else {
            // Esperar a que el DOM esté listo
            debugLog('Esperando a DOMContentLoaded');
            document.addEventListener('DOMContentLoaded', function() {
                debugLog('DOMContentLoaded disparado');
                addEventListeners();
                setTimeoutFallback();
            });
        }
    }

    // Iniciar inicialización
    init();

})();
