/**
 * FIX SCROLL - Correção definitiva do problema de scroll travando
 */

(function() {
    'use strict';
    
    console.log('🔧 Iniciando correção de scroll...');
    
    // Função para garantir scroll livre
    function garantirScrollLivre() {
        // Remover overflow hidden do body e html
        document.documentElement.style.overflow = 'visible';
        document.documentElement.style.overflowY = 'auto';
        document.body.style.overflow = 'visible';
        document.body.style.overflowY = 'auto';
        
        // Remover classes que bloqueiam scroll
        document.body.classList.remove('no-scroll', 'scroll-lock', 'overflow-hidden');
        document.documentElement.classList.remove('no-scroll', 'scroll-lock', 'overflow-hidden');
        
        // Garantir que o body tenha altura mínima
        if (document.body.scrollHeight <= window.innerHeight) {
            document.body.style.minHeight = (window.innerHeight + 100) + 'px';
        }
    }
    
    // Executar imediatamente
    garantirScrollLivre();
    
    // Executar quando DOM estiver pronto
    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', garantirScrollLivre);
    } else {
        garantirScrollLivre();
    }
    
    // Executar após carregamento completo
    window.addEventListener('load', garantirScrollLivre);
    
    // Monitorar mudanças no body
    const observer = new MutationObserver(function(mutations) {
        mutations.forEach(function(mutation) {
            if (mutation.type === 'attributes' && 
                (mutation.attributeName === 'style' || mutation.attributeName === 'class')) {
                // Verificar se o overflow foi alterado
                const bodyOverflow = window.getComputedStyle(document.body).overflow;
                const htmlOverflow = window.getComputedStyle(document.documentElement).overflow;
                
                if (bodyOverflow === 'hidden' || htmlOverflow === 'hidden') {
                    // Apenas permitir overflow hidden quando sidebar está aberto
                    const sidebarAberto = document.getElementById('sidebarLeft')?.classList.contains('ativo');
                    const carrinhoAberto = document.getElementById('carrinhoPanel')?.classList.contains('ativo');
                    
                    if (!sidebarAberto && !carrinhoAberto) {
                        console.log('⚠️ Overflow hidden detectado - corrigindo...');
                        garantirScrollLivre();
                    }
                }
            }
        });
    });
    
    // Observar mudanças no body e html
    observer.observe(document.body, {
        attributes: true,
        attributeFilter: ['style', 'class']
    });
    
    observer.observe(document.documentElement, {
        attributes: true,
        attributeFilter: ['style', 'class']
    });
    
    // Prevenir que preventDefault bloqueie scroll
    const originalPreventDefault = Event.prototype.preventDefault;
    Event.prototype.preventDefault = function() {
        // Não prevenir eventos de scroll, wheel e touchmove
        if (this.type === 'scroll' || this.type === 'wheel' || this.type === 'touchmove') {
            // Apenas permitir preventDefault em elementos específicos
            const target = this.target;
            if (target && (
                target.classList?.contains('sidebar') ||
                target.classList?.contains('modal') ||
                target.closest('.sidebar') ||
                target.closest('.modal')
            )) {
                return originalPreventDefault.call(this);
            }
            // Não prevenir o evento padrão de scroll
            console.log('🚫 Bloqueado preventDefault em evento de scroll');
            return;
        }
        return originalPreventDefault.call(this);
    };
    
    // Garantir que eventos de scroll sejam passivos
    const originalAddEventListener = EventTarget.prototype.addEventListener;
    EventTarget.prototype.addEventListener = function(type, listener, options) {
        if (type === 'touchmove' || type === 'wheel' || type === 'scroll') {
            // Forçar passive: true para eventos de scroll
            if (typeof options === 'object' && options !== null) {
                options.passive = true;
            } else {
                options = { passive: true };
            }
        }
        return originalAddEventListener.call(this, type, listener, options);
    };
    
    // Verificar periodicamente se o scroll está funcionando
    let ultimaPosicao = window.scrollY;
    let tentativasScroll = 0;
    
    setInterval(function() {
        const posicaoAtual = window.scrollY;
        
        // Se a posição mudou, o scroll está funcionando
        if (posicaoAtual !== ultimaPosicao) {
            tentativasScroll = 0;
            ultimaPosicao = posicaoAtual;
        } else {
            // Verificar se deveria estar rolando
            const bodyHeight = document.body.scrollHeight;
            const windowHeight = window.innerHeight;
            
            if (bodyHeight > windowHeight) {
                tentativasScroll++;
                
                if (tentativasScroll > 3) {
                    console.log('⚠️ Scroll pode estar travado - aplicando correção...');
                    garantirScrollLivre();
                    tentativasScroll = 0;
                }
            }
        }
    }, 1000);
    
    console.log('✅ Correção de scroll ativada');
    
})();
