// script.js - Lógica Principal do Aplicativo (Aprimorado e Finalizado pelo Cometê)
// Última Alteração: Adicionado listener com depuração para o campo de ID de produto.

import { DataService } from './api.js';
import { checkVersionUpdate } from './version-check.js';
import { showToast } from './utils.js';
const localforage = window.localforage;

// =======================================================================
// FUNÇÃO GLOBAL DE EXCLUSÃO DEFINITIVA (SALDO, RETÍFICA E REDIRECIONAMENTO)
// =======================================================================
window.excluirItemDoSistema = function(patrimonio, nomeProduto) {
    const sessionUserStr = sessionStorage.getItem('currentUser');
    if (!sessionUserStr) {
        Swal.fire('Erro', 'Sessão expirada. Faça login novamente.', 'error');
        return;
    }
    
    const sessionUser = JSON.parse(sessionUserStr);
    
    // Pega o cargo, tira espaços em branco e joga tudo para minúsculo para não ter erro de digitação
    const rawRole = sessionUser.role || sessionUser.funcao || '';
    const userRole = rawRole.trim().toLowerCase();

    // Agora liberamos para desenvolvedor, administrador E estoquista (tudo em minúsculo na verificação)
    const cargosPermitidos = ['desenvolvedor', 'administrador', 'estoquista'];

    if (!cargosPermitidos.includes(userRole)) {
        Swal.fire('Acesso Negado', `Seu cargo atual (${rawRole}) não tem permissão para excluir itens do banco.`, 'error');
        return;
    }

    Swal.fire({
        title: 'Exclusão Definitiva!',
        html: `Você está prestes a apagar <strong>${nomeProduto} (Pat: ${patrimonio})</strong> do sistema inteiro.<br><br>Esta ação não tem volta. Tem certeza?`,
        icon: 'warning',
        showCancelButton: true,
        confirmButtonColor: '#d33',
        cancelButtonColor: '#3085d6',
        confirmButtonText: 'Sim, Apagar do Banco!',
        cancelButtonText: 'Cancelar'
    }).then(async (result) => {
        if (result.isConfirmed) {
            const overlay = document.getElementById('global-loading-overlay');
            if (overlay) overlay.classList.remove('hidden');

            try {
                // 1. Apaga na API (Banco de Dados) enviando o cargo original
                await DataService.excluirItemDefinitivo({ patrimonio: patrimonio }, rawRole);
                
                // 2. Dispara um evento global para a página atualizar as tabelas
                window.dispatchEvent(new CustomEvent('itemExcluido', { detail: { patrimonio: patrimonio } }));

                if (overlay) overlay.classList.add('hidden');
                Swal.fire('Excluído!', 'O item foi apagado com sucesso.', 'success');
            } catch (error) {
                if (overlay) overlay.classList.add('hidden');
                Swal.fire('Erro', error.message, 'error');
            }
        }
    });
};
// =======================================================================
// FUNÇÃO PARA EDITAR PATRIMÔNIO/ENDEREÇO DO ESTOQUE
// =======================================================================
window.editarItemEstoque = function(patrimonioAtual) {
    const sessionUserStr = sessionStorage.getItem('currentUser');
    if (!sessionUserStr) return;
    const sessionUser = JSON.parse(sessionUserStr);
    const rawRole = sessionUser.role || sessionUser.funcao || '';
    const userRole = rawRole.trim().toLowerCase();

    // Apenas quem pode excluir, também pode editar
    const cargosPermitidos = ['desenvolvedor', 'administrador', 'estoquista'];
    if (!cargosPermitidos.includes(userRole)) {
        Swal.fire('Acesso Negado', `Seu cargo atual não tem permissão para editar itens.`, 'error');
        return;
    }

    // Pega os dados atuais do item na memória
    const item = mainInventory.find(i => String(i.patrimonio) === String(patrimonioAtual));
    if (!item) return;

    Swal.fire({
        title: 'Editar Item',
        html: `
            <div class="flex flex-col gap-3 text-left px-2 mt-2">
                <label class="text-sm font-medium text-slate-700">Patrimônio / Serial:</label>
                <input id="swal-edit-pat" class="form-input" value="${item.patrimonio || ''}">
                
                <label class="text-sm font-medium text-slate-700 mt-2">Endereço (Opcional):</label>
                <input id="swal-edit-end" class="form-input" value="${item.endereco || ''}" placeholder="Ex: Prateleira A2">
            </div>
        `,
        showCancelButton: true,
        confirmButtonColor: '#4f46e5',
        confirmButtonText: 'Salvar Correção',
        cancelButtonText: 'Cancelar',
        preConfirm: () => {
            const novoPatrimonio = document.getElementById('swal-edit-pat').value.trim();
            const novoEndereco = document.getElementById('swal-edit-end').value.trim();
            if (!novoPatrimonio) {
                Swal.showValidationMessage('O patrimônio não pode ficar vazio!');
            }
            return { novoPatrimonio, novoEndereco };
        }
    }).then(async (result) => {
        if (result.isConfirmed) {
            const overlay = document.getElementById('global-loading-overlay');
            if (overlay) overlay.classList.remove('hidden');

            try {
                const payload = {
                    patrimonio_atual: patrimonioAtual,
                    novo_patrimonio: result.value.novoPatrimonio,
                    novo_endereco: result.value.novoEndereco
                };
                
                await DataService.editarItemEstoque(payload, rawRole);
                
                // Recarrega o estoque e atualiza a tela
                if (typeof loadInventory === 'function') await loadInventory();
                if (typeof renderStockView === 'function') renderStockView(document.getElementById('stock-search-input')?.value || '');
                
                if (overlay) overlay.classList.add('hidden');
                Swal.fire('Atualizado!', 'Os dados foram corrigidos com sucesso.', 'success');
            } catch (error) {
                if (overlay) overlay.classList.add('hidden');
                Swal.fire('Erro', error.message, 'error');
            }
        }
    });
};
// =========================================================
    // EXIBIR LISTA DE CLIENTES RESPONSIVA (MODAL TORRES)
    // =========================================================
    window.mostrarListaClientes = function(torreNome, setorNome, nomesCodificados) {
        // Descriptografa os nomes (evita erros com aspas e acentos no HTML)
        const clientNamesStr = decodeURIComponent(nomesCodificados);
        
        if (!clientNamesStr || clientNamesStr.trim() === '') {
            Swal.fire('Vazio', `Não há clientes registrados no ${setorNome}.`, 'info');
            return;
        }

        // Transforma a string de nomes separados por vírgula em uma lista limpa
        const namesArray = clientNamesStr.split(',').map(nome => nome.trim()).filter(nome => nome !== '');

        // Cria a interface responsiva: max-h-60 limita a altura e overflow-y-auto cria a barra de rolagem
        const listHtml = `
            <div class="max-h-60 overflow-y-auto p-3 bg-slate-50 rounded-lg border border-slate-200 text-left shadow-inner">
                <ul class="divide-y divide-slate-200">
                    ${namesArray.map(name => `
                        <li class="py-2 text-sm text-slate-700 font-medium flex items-center">
                            <i class="fas fa-user-check text-indigo-400 mr-3"></i> ${name}
                        </li>
                    `).join('')}
                </ul>
            </div>
            <div class="mt-3 text-xs text-slate-500 font-bold text-right uppercase tracking-wider">
                Total: ${namesArray.length} cliente(s)
            </div>
        `;

        Swal.fire({
            title: `<span class="text-lg">${torreNome} <br> <span class="text-indigo-600 text-sm">${setorNome}</span></span>`,
            html: listHtml,
            confirmButtonColor: '#4f46e5',
            confirmButtonText: 'Fechar Lista',
            width: '90%', // Deixa largo no celular
            maxWidth: '400px' // Mas não deixa ficar gigante no computador
        });
    };

document.addEventListener('DOMContentLoaded', async () => {

    // --- BANCO DE DADOS (AGORA SERÁ PERSISTENTE VIA API/INDEXEDDB) ---
    let products = [];
    let mainInventory = [];
    let vehicleInventory = { montana: [], uno: [], pajero: [], estoqueAlternativo: [], unonovo: [] };
    let redirectInventory = [];
    let transactionLog = [];
    let userList = [];
    let clientList = [];
    let clientActivities = [];
    let towersData = [];
    let rectificationItems = [];
    
    let currentUser = null;
    let currentVehicle = null;
    let currentVehicleName = '';
    let itemChart = null;
    let rectificationChart = null;
    let clientActivityChart = null; // Variável para guardar a instância do gráfico

    // =======================================================================
    // FUNÇÃO PARA EDITAR PATRIMÔNIO/ENDEREÇO DO ESTOQUE
    // =======================================================================
    window.editarItemEstoque = function(patrimonioAtual) {
        const sessionUserStr = sessionStorage.getItem('currentUser');
        if (!sessionUserStr) return;
        const sessionUser = JSON.parse(sessionUserStr);
        const rawRole = sessionUser.role || sessionUser.funcao || '';
        const userRole = rawRole.trim().toLowerCase();

        // Apenas quem pode excluir, também pode editar
        const cargosPermitidos = ['desenvolvedor', 'administrador', 'estoquista'];
        if (!cargosPermitidos.includes(userRole)) {
            Swal.fire('Acesso Negado', `Seu cargo atual não tem permissão para editar itens.`, 'error');
            return;
        }

        // Pega os dados atuais do item na memória
        const item = mainInventory.find(i => String(i.patrimonio) === String(patrimonioAtual));
        if (!item) return;

        Swal.fire({
            title: 'Editar Item',
            html: `
                <div class="flex flex-col gap-3 text-left px-2 mt-2">
                    <label class="text-sm font-medium text-slate-700">Nome do Produto:</label>
                    <input id="swal-edit-nome" class="form-input" value="${item.produto || ''}">

                    <label class="text-sm font-medium text-slate-700 mt-2">Patrimônio / Serial:</label>
                    <input id="swal-edit-pat" class="form-input" value="${item.patrimonio || ''}">
                    
                    <label class="text-sm font-medium text-slate-700 mt-2">Endereço (Opcional):</label>
                    <input id="swal-edit-end" class="form-input" value="${item.endereco || ''}" placeholder="Ex: Prateleira A2">
                </div>
            `,
            showCancelButton: true,
            confirmButtonColor: '#4f46e5',
            confirmButtonText: 'Salvar Correção',
            cancelButtonText: 'Cancelar',
            preConfirm: () => {
                const novoNome = document.getElementById('swal-edit-nome').value.trim();
                const novoPatrimonio = document.getElementById('swal-edit-pat').value.trim();
                const novoEndereco = document.getElementById('swal-edit-end').value.trim();
                
                if (!novoNome) {
                    Swal.showValidationMessage('O nome do produto não pode ficar vazio!');
                }
                if (!novoPatrimonio) {
                    Swal.showValidationMessage('O patrimônio não pode ficar vazio!');
                }
                return { novoNome, novoPatrimonio, novoEndereco };
            }
        }).then(async (result) => {
            if (result.isConfirmed) {
                const overlay = document.getElementById('global-loading-overlay');
                if (overlay) overlay.classList.remove('hidden');

                try {
                    const payload = {
                        patrimonio_atual: patrimonioAtual,
                        novo_nome: result.value.novoNome,
                        novo_patrimonio: result.value.novoPatrimonio,
                        novo_endereco: result.value.novoEndereco
                    };
                    
                    await DataService.editarItemEstoque(payload, rawRole);
                    
                    // Recarrega o estoque e atualiza a tela
                    if (typeof loadInventory === 'function') await loadInventory();
                    if (typeof renderStockView === 'function') renderStockView(document.getElementById('stock-search-input')?.value || '');
                    
                    if (overlay) overlay.classList.add('hidden');
                    Swal.fire('Atualizado!', 'Os dados foram corrigidos com sucesso.', 'success');
                } catch (error) {
                    if (overlay) overlay.classList.add('hidden');
                    Swal.fire('Erro', error.message, 'error');
                }
            }
        });
    };

    // =========================================================
    // OUVINTE DO EVENTO DE EXCLUSÃO (ATUALIZA A TELA INSTANTANEAMENTE)
    // =========================================================
    window.addEventListener('itemExcluido', async (e) => {
        const patrimonioExcluido = e.detail.patrimonio;
        
        // 1. Remove das memórias locais
        mainInventory = mainInventory.filter(i => String(i.patrimonio) !== String(patrimonioExcluido));
        redirectInventory = redirectInventory.filter(i => String(i.patrimonio) !== String(patrimonioExcluido));
        rectificationItems = rectificationItems.filter(i => String(i.patrimonio) !== String(patrimonioExcluido));

        // 2. Atualiza os caches
        await saveDataToStorage('mainInventory', mainInventory);
        await saveDataToStorage('redirectInventory', redirectInventory);
        await saveDataToStorage('rectificationItems', rectificationItems);

        // 3. Atualiza as telas que estiverem abertas
        if (typeof renderStockView === 'function') renderStockView(document.getElementById('stock-search-input')?.value || '');
        if (typeof renderRedirectView === 'function') renderRedirectView(document.getElementById('redirect-search-input')?.value || '');
        if (typeof renderRectificationView === 'function') renderRectificationView(document.getElementById('rectification-search-input')?.value || '');
        
        // 4. Se o modal de veículos estiver aberto, recarrega ele
        await loadVehicleInventories();
        if (typeof renderVehicleSummaryContent === 'function') {
            renderVehicleSummaryContent(vehicleInventory, document.getElementById('vehicle-summary-search')?.value || '');
        }
    });
    
    // --- SELETORES ---
    const pageEstoque = document.getElementById('page-estoque');
    const pageVeiculos = document.getElementById('page-veiculos');
    const pageMovimentacoes = document.getElementById('page-movimentacoes');
    const pageUsuarios = document.getElementById('page-usuarios');
    const pageStatus = document.getElementById('page-status');
    const navEstoque = document.getElementById('nav-estoque');
    const navVeiculos = document.getElementById('nav-veiculos');
    const navMovimentacoes = document.getElementById('nav-movimentacoes');
    const navUsuarios = document.getElementById('nav-usuarios');
    const navStatus = document.getElementById('nav-status');
    const mobileMenuButton = document.getElementById('mobile-menu-button');
    const mobileMenu = document.getElementById('mobile-menu');
    const mobileNavStatus = document.getElementById('mobile-nav-status');
    const mobileNavEstoque = document.getElementById('mobile-nav-estoque');
    const mobileNavVeiculos = document.getElementById('mobile-nav-veiculos');
    const mobileNavMovimentacoes = document.getElementById('mobile-nav-movimentacoes');
    const mobileNavUsuarios = document.getElementById('mobile-nav-usuarios');
    const openClientModalButton = document.getElementById('open-client-modal-button');
    const clientModal = document.getElementById('client-modal');
    const clientModalCloseButton = document.getElementById('client-modal-close-button');
    const clientTabs = document.querySelectorAll('.client-tab');
    const sectionClientRegistration = document.getElementById('section-client-registration');
    const sectionClientStatus = document.getElementById('section-client-status');
    const clientRegistrationForm = document.getElementById('client-registration-form');
    const clientStatusTableBody = document.getElementById('client-status-table-body');
    const clientStatusNoResults = document.getElementById('client-status-no-results');
    const userTabs = document.querySelectorAll('.user-tab');
    const sectionUserList = document.getElementById('section-user-list');
    const sectionClientActivity = document.getElementById('section-client-activity');
    const sectionRectification = document.getElementById('section-rectification');
    const activityTowerSelect = document.getElementById('activity-tower-select');
    const activitySectorSelect = document.getElementById('activity-sector-select');
    const reasonSelect = document.getElementById('activity-reason');
    const locationTypeGroup = document.getElementById('activity-location-type-group');
    const locationTypeSelect = document.getElementById('activity-location-type');

    reasonSelect.addEventListener('change', () => {
    const selectedReason = reasonSelect.value;
    
    if (selectedReason === 'Instalacao' || selectedReason === 'Troca de endereco') {
        locationTypeGroup.classList.remove('hidden'); // Mostra o campo
        locationTypeSelect.required = true; // Torna obrigatório
        } else {
            locationTypeGroup.classList.add('hidden'); // Esconde o campo
            locationTypeSelect.required = false; // Deixa de ser obrigatório
            locationTypeSelect.value = ''; // Limpa a seleção
        }
    });
    
    // --- DEFINIÇÃO DE TODAS AS FUNÇÕES ---
    // TESTE 1: INSPECIONAR OS DADOS
    // Este listener para o novo botão vai nos mostrar o conteúdo exato da variável 'towersData'.
    document.getElementById('debug-button')?.addEventListener('click', () => {
    if (towersData && towersData.length > 0) {
        // Converte os dados em um texto legível para o alert
        const dataAsString = JSON.stringify(towersData, null, 2);
        alert('Conteúdo ATUAL da variável "towersData":\n\n' + dataAsString);
    } else {
        alert('A variável "towersData" está VAZIA ou não foi definida.');
    }
    
    // ===================================================================
    // ===== INÍCIO DO BLOCO PARA O MODAL "RESUMO DE CONSUMO" =====
    // ===================================================================

    const cardDashboardConsumption = document.getElementById('card-dashboard-consumption');
    const chargeCableCheckbox = document.getElementById('activity-charge-cable');
        if (chargeCableCheckbox.checked) {
        formData.append('cobrar_cabo', '1');
    }
    /**
    * Monta o conteúdo do modal de resumo de consumo, com busca e agrupamento por usuário.
    */
    function renderConsumptionSummaryContent() {
    const contentContainer = document.getElementById('generic-modal-content');

    // Estrutura HTML inicial do modal com busca
    contentContainer.innerHTML = `
        <div class="mb-4">
            <input class="w-full p-2 border border-gray-300 rounded-md" type="text" id="consumption-summary-search" placeholder="Buscar por usuário ou item..." />
        </div>
        <div id="consumption-list-container" class="max-h-[60vh] overflow-y-auto pr-2">
            <div class="text-center py-8"><i class="fas fa-spinner fa-spin text-indigo-600 text-2xl"></i></div>
        </div>
    `;

    const listContainer = document.getElementById('consumption-list-container');
    const searchInput = document.getElementById('consumption-summary-search');
    let allConsumptionData = []; // Armazena os dados para a busca

    // Função interna para desenhar a lista de consumo
    const renderList = (logs) => {
        if (!Array.isArray(logs) || logs.length === 0) {
            listContainer.innerHTML = emptyStateHTML('Nenhum consumo registrado para este mês.', 'fas fa-shopping-cart');
            return;
        }

        const groupedByUser = logs.reduce((acc, log) => {
            const userName = log.usuario_nome || 'Usuário Desconhecido';
            if (!acc[userName]) {
                acc[userName] = [];
            }
            acc[userName].push(log);
            return acc;
        }, {});

        listContainer.innerHTML = Object.entries(groupedByUser).map(([userName, userLogs]) => {
            const totalQuantity = userLogs.reduce((sum, log) => sum + parseInt(log.quantidade_consumida), 0);
            return `
                <div class="bg-slate-50 border rounded-lg p-4 mb-3">
                    <h4 class="font-bold text-indigo-700">${userName} - (Total: ${totalQuantity} und.)</h4>
                    <ul class="mt-2 pl-4 list-disc list-inside text-sm space-y-1">
                        ${userLogs.map(log => `<li><span class="font-semibold">${log.item_nome}</span> - ${log.quantidade_consumida} und. <span class="text-xs text-gray-500">(${log.data_consumo_formatada})</span></li>`).join('')}
                    </ul>
                </div>`;
        }).join('');
    };
    
    // Busca os dados do mês atual para exibir inicialmente
    const today = new Date();
    const payload = { month: today.getMonth() + 1, year: today.getFullYear() };

    DataService.getHistoricoConsumo(payload, currentUser.role)
        .then(result => {
            allConsumptionData = Array.isArray(result.data) ? result.data : [];
            renderList(allConsumptionData); // Renderiza a lista inicial

            // Adiciona o evento de busca
            searchInput.addEventListener('keyup', () => {
                const searchTerm = searchInput.value.toLowerCase().trim();
                const filtered = allConsumptionData.filter(log => 
                    (log.usuario_nome && log.usuario_nome.toLowerCase().includes(searchTerm)) || 
                    (log.item_nome && log.item_nome.toLowerCase().includes(searchTerm))
                );
                renderList(filtered);
            });
        })
        .catch(error => {
            listContainer.innerHTML = emptyStateHTML(`Erro ao carregar dados: ${error.message}`, 'fas fa-exclamation-triangle');
        });
    }

    /**
    * Abre o modal de resumo de consumo.
    */
    function openConsumptionSummaryModal() {
    showInfoModal('Resumo de Consumo (Mês Atual)', 'Carregando...');
    renderConsumptionSummaryContent();
    }

    // Adiciona o novo evento de clique ao card do dashboard
    if (cardDashboardConsumption) {
    cardDashboardConsumption.addEventListener('click', openConsumptionSummaryModal);
    }

    // ===================================================================
    // ===== FIM DO BLOCO PARA O MODAL "RESUMO DE CONSUMO" ===============
    // ===================================================================
    document.body.addEventListener('click', (e) => {
    // Procura por um clique no selo de contagem de clientes
    const clientBadge = e.target.closest('.client-count-badge');
    if (clientBadge) {
        const clientNames = clientBadge.dataset.clientNames;
        // Pega o nome do setor do elemento mais próximo
        const sectorNameElement = clientBadge.closest('li')?.querySelector('span');
        const sectorName = sectorNameElement ? sectorNameElement.textContent : 'Setor';

        if (clientNames) {
            // Transforma a lista de nomes em HTML com quebras de linha
            const namesHtml = `<div class="text-left max-h-64 overflow-y-auto">${clientNames.replace(/, /g, '<br>')}</div>`;

            Swal.fire({
                title: `Clientes no ${sectorName}`,
                html: namesHtml,
                icon: 'info',
                confirmButtonText: 'Fechar'
            });
        }
    }

    window.excluirItemDoSistema = function(patrimonio, nomeProduto) {
        const sessionUserStr = sessionStorage.getItem('currentUser');
        if (!sessionUserStr) {
            Swal.fire('Erro', 'Sessão expirada. Faça login novamente.', 'error');
            return;
        }
        
        const sessionUser = JSON.parse(sessionUserStr);
        
        // Pega o cargo, tira espaços em branco e joga tudo para minúsculo para não ter erro de digitação
        const rawRole = sessionUser.role || sessionUser.funcao || '';
        const userRole = rawRole.trim().toLowerCase();

        // Agora liberamos para desenvolvedor, administrador E estoquista (tudo em minúsculo na verificação)
        const cargosPermitidos = ['desenvolvedor', 'administrador', 'estoquista'];

        if (!cargosPermitidos.includes(userRole)) {
            Swal.fire('Acesso Negado', `Seu cargo atual (${rawRole}) não tem permissão para excluir itens do banco.`, 'error');
            return;
        }

        Swal.fire({
            title: 'Exclusão Definitiva!',
            html: `Você está prestes a apagar <strong>${nomeProduto} (Pat: ${patrimonio})</strong> do sistema inteiro.<br><br>Esta ação não tem volta. Tem certeza?`,
            icon: 'warning',
            showCancelButton: true,
            confirmButtonColor: '#d33',
            cancelButtonColor: '#3085d6',
            confirmButtonText: 'Sim, Apagar do Banco!',
            cancelButtonText: 'Cancelar'
        }).then(async (result) => {
            if (result.isConfirmed) {
                const overlay = document.getElementById('global-loading-overlay');
                if (overlay) overlay.classList.remove('hidden');

                try {
                    // 1. Apaga na API (Banco de Dados) enviando o cargo original
                    await DataService.excluirItemDefinitivo({ patrimonio: patrimonio }, rawRole);
                    
                    // 2. Dispara um evento global para a página atualizar as tabelas
                    window.dispatchEvent(new CustomEvent('itemExcluido', { detail: { patrimonio: patrimonio } }));

                    if (overlay) overlay.classList.add('hidden');
                    Swal.fire('Excluído!', 'O item foi apagado com sucesso.', 'success');
                } catch (error) {
                    if (overlay) overlay.classList.add('hidden');
                    Swal.fire('Erro', error.message, 'error');
                }
            }
        });
    };
});
    

});

// TESTE 2: VERIFICAR O GATILHO
// Este listener vai provar se o evento de "mudança" na torre está funcionando.
activityTowerSelect?.addEventListener('change', () => {
    alert('Torre selecionada, clique em "ok" para confirmar.');
    updateSectorSelect(); // Mantemos a chamada para a função original
});
    // [NOVO] Event listener para o filtro de mês do gráfico
    document.getElementById('activity-month-filter')?.addEventListener('change', (e) => {
    renderClientActivityChart(e.target.value);
});

sectionRectification.addEventListener('click', (e) => {
    // 1. Abrir e fechar o menu dropdown
    const dropdownButton = e.target.closest('.action-dropdown-button');
    if (dropdownButton) {
        e.preventDefault();
        const menu = dropdownButton.nextElementSibling;
        sectionRectification.querySelectorAll('.action-dropdown-menu').forEach(m => {
            if (m !== menu) m.classList.add('hidden');
        });
        menu.classList.toggle('hidden');
        return;
    }

    // 2. Lidar com o clique nas Ações (Mover direto ou Apenas Retirar)
    const option = e.target.closest('.move-from-rect-option, .remove-only-rect-option');
    if (option) {
        e.preventDefault();
        const patrimonio = option.dataset.patrimonioId;
        const destination = option.dataset.destination; 
        const tableRow = option.closest('tr');

        // Se for para o Estoque Principal, pede o endereço
        let address = '';
        if (destination === 'mainInventory') {
            address = prompt("Por favor, digite o novo endereço de armazenagem para este item no Estoque Principal:");
            if (!address || address.trim() === '') return; // Cancela se não digitar nada
        }

        // Esconde menu e esmaece a linha na hora (Instantâneo)
        const menu = option.closest('.action-dropdown-menu');
        if (menu) menu.classList.add('hidden');
        if (tableRow) {
            tableRow.style.opacity = '0.3';
            tableRow.style.pointerEvents = 'none';
        }
        
        showToast('Processando...', 'info');

        // Trabalho pesado em background
        (async () => {
            try {
                // PASSO 1: Tira da Retífica (Isso joga o item pro 'Redirecionamento' no banco)
                await DataService.removeItemFromRectification({ patrimonio }, currentUser.role);

                // PASSO 2: Se o usuário escolheu um destino, puxa do 'Redirecionamento' pra lá automaticamente!
                if (option.classList.contains('move-from-rect-option')) {
                    const redirectPayload = { patrimonio, destination };
                    if (address) redirectPayload.endereco = address.trim();
                    
                    await DataService.redirectItem(redirectPayload, currentUser.role);
                    logTransaction('Recuperado da Retífica', patrimonio, 'Retífica', destination);
                } else {
                    // Se escolheu "Apenas Retirar"
                    logTransaction('Retirado da Retífica', patrimonio, 'Retífica', 'Redirecionamento');
                }

                // Remove a linha da tela permanentemente
                if (tableRow) tableRow.remove();

                // Atualiza a memória local silenciosamente
                rectificationItems = rectificationItems.filter(item => String(item.patrimonio) !== String(patrimonio));
                saveDataToStorage('rectificationItems', rectificationItems);

                showToast('Pronto!', 'success');

            } catch (error) {
                // Se falhar, restaura a linha para tentar de novo
                if (tableRow) {
                    tableRow.style.opacity = '1';
                    tableRow.style.pointerEvents = 'auto';
                }
                showFeedbackModal('Erro', `Falha ao processar item: ${error.message}`, 'error');
            }
        })();
    }
});
document.getElementById('card-dashboard-towers')?.addEventListener('click', () => {
        showInfoModal('Resumo de Torres Cadastradas', 'Carregando...');
        renderTowersSummaryContent(); // Agora esta função usará os 'towersData' já carregados e completos
    });

document.addEventListener('change', function(e) {
    // Verifica se a mudança ocorreu no seletor de torre da aba "Alocar"
    if (e.target && e.target.id === 'torre-alocar-select') {
        populateSetoresSelectAlocar(e.target.value);
    }

    // VERIFICA SE A MUDANÇA OCORREU NO SELETOR DE TORRE DA ABA "RETIRAR"
    if (e.target && e.target.id === 'torre-retirar-selecionar') {
        const torreId = e.target.value;
        // Chama as duas funções necessárias:
        renderItensNaTorre(torreId); 
        populateSetoresSelectRetirar(torreId);
    }
    
    // VERIFICA SE A MUDANÇA OCORREU NO SELETOR DE SETOR DA ABA "RETIRAR"
    if(e.target && e.target.id === 'setor-retirar-selecionar') {
        const torreId = document.getElementById('torre-retirar-selecionar').value;
        const setorId = e.target.value;
        renderItensNaTorre(torreId, setorId);
    }
});

    const clientActivityForm = document.getElementById('client-activity-form');
    const clientActivitySearchInput = document.getElementById('client-activity-search');
    if (clientActivitySearchInput) {
    clientActivitySearchInput.addEventListener('keyup', (e) => {
        renderClientActivityDashboard(e.target.value);
    });
    }
    
    const activityCurrentUserName = document.getElementById('activity-current-user-name');
    const activityCurrentUserId = document.getElementById('activity-current-user-id');
    const activityOtherUsersSelect = document.getElementById('activity-other-users-select');

    const activityVehicleSelect = document.getElementById('activity-vehicle');
    const activityPatrimonioSelect = document.getElementById('activity-patrimonio'); // Select original para desktop

    const openPatrimonioModalButton = document.getElementById('open-patrimonio-modal-button');
    const patrimonioSelectModal = document.getElementById('patrimonio-select-modal');
    const closePatrimonioModalButton = document.getElementById('close-patrimonio-modal-button');
    const patrimonioCheckboxList = document.getElementById('patrimonio-checkbox-list');
    const patrimonioModalNoResults = document.getElementById('patrimonio-modal-no-results');
    const confirmPatrimonioSelectionButton = document.getElementById('confirm-patrimonio-selection-button');
    const activityPatrimonioDisplay = document.getElementById('activity-patrimonio-display');
    const activityPatrimonioValues = document.getElementById('activity-patrimonio-values');


    const activityDateInput = document.getElementById('activity-date');
    const activityClientInput = document.getElementById('activity-client');
    const clientSuggestionsContainer = document.getElementById('client-suggestions');
    const activityTowerInput = document.getElementById('activity-tower');
    const activitySectorInput = document.getElementById('activity-sector');

    const stockTabs = document.querySelectorAll('.stock-tab');
    const sectionCadastro = document.getElementById('section-cadastro');
    const sectionSaldo = document.getElementById('section-saldo');
    const sectionRedirecionamento = document.getElementById('section-redirecionamento');
    const stockForm = document.getElementById('stock-form');
    const stockProdutoIdInput = document.getElementById('stock-produto-id');
    
    const stockProdutoNomeInput = document.getElementById('stock-produto-nome');
    const macAddressGroup = document.getElementById('mac-address-group');
    const macAddressInput = document.getElementById('stock-mac-address');
    stockProdutoNomeInput.addEventListener('keyup', () => {
    if (stockProdutoNomeInput.value.trim().toLowerCase() === 'roteador') {
        macAddressGroup.classList.remove('hidden');
    } else {
        macAddressGroup.classList.add('hidden');
        macAddressInput.value = ''; // Limpa o campo se não for um roteador
    }
});

    const stockProdutoEnderecoInput = document.getElementById('stock-produto-endereco');
    const stockProdutoPatrimonioInput = document.getElementById('stock-produto-patrimonio');
    const stockSearchInput = document.getElementById('stock-search-input');
    const redirectSearchInput = document.getElementById('redirect-search-input');
        if (redirectSearchInput) {
        redirectSearchInput.addEventListener('keyup', (e) => {
        // Chama a função atualizada, passando o que foi digitado
        renderRedirectView(e.target.value);
        });
    }
    const stockTableBody = document.getElementById('stock-table-body');
    const stockNoResults = document.getElementById('stock-no-results');
    const redirectTableBody = document.getElementById('redirect-table-body');
    const redirectNoResults = document.getElementById('redirect-no-results');
    const movimentacoesTableBody = document.getElementById('movimentacoes-table-body');
    const movimentacoesNoResults = document.getElementById('movimentacoes-no-results');
    const userForm = document.getElementById('user-form');
    const userTableBody = document.getElementById('user-table-body');
    const userNoResults = document.getElementById('user-no-results');
    const userSubmitButton = document.getElementById('user-submit-button');
    const userNameInput = document.getElementById('user-name');
    const userEmailInput = document.getElementById('user-email');
    const userPasswordInput = document.getElementById('user-password');
    const userRoleInput = document.getElementById('user-role');

    const vehicleCards = document.querySelectorAll('.vehicle-card');
    const vehicleModal = document.getElementById('vehicle-modal');
    const vehicleModalTitle = document.getElementById('vehicle-modal-title');
    const vehicleModalCloseButton = document.getElementById('vehicle-modal-close-button');
    const vehicleTabs = document.querySelectorAll('.vehicle-tab');
    const vehicleSaldoTableBody = document.getElementById('vehicle-saldo-table-body');
    const vehicleNoResults = document.getElementById('vehicle-no-results');
    const vehicleSearchInput = document.getElementById('vehicle-search-input');
    const vehicleAddForm = document.getElementById('vehicle-add-form');
    const addProdutoIdInput = document.getElementById('add-produto-id');
    const addProdutoNomeInput = document.getElementById('add-produto-nome');
    const addProdutoPatrimonioSelect = document.getElementById('add-produto-patrimonio');
    const addIdNotFoundError = document.getElementById('add-id-not-found-error');
    const vehicleRemoveForm = document.getElementById('vehicle-remove-form');
    const vehicleRectifyForm = document.getElementById('vehicle-rectify-form');
    const rectifyProdutoIdInput = document.getElementById('rectify-produto-id');
    const rectifyProdutoNomeInput = document.getElementById('rectify-produto-nome');
    const rectifyProdutoPatrimonioSelect = document.getElementById('rectify-produto-patrimonio');
    const rectifyIdNotFoundError = document.getElementById('rectify-id-not-found-error');
    const removeProdutoIdInput = document.getElementById('remove-produto-id');
    const removeProdutoNomeInput = document.getElementById('remove-produto-nome');
    const removeProdutoPatrimonioSelect = document.getElementById('remove-produto-patrimonio');
    const removeIdNotFoundError = document.getElementById('remove-id-not-found-error');
    
    // Modais
    const genericModal = document.getElementById('generic-modal');
    const genericModalTitle = document.getElementById('generic-modal-title');
    const genericModalContent = document.getElementById('generic-modal-content');
    const genericModalCloseButton = document.getElementById('generic-modal-close-button');
    const feedbackModal = document.getElementById('feedback-modal');
    const modalIconContainer = document.getElementById('modal-icon-container');
    const modalTitle = document.getElementById('modal-title');
    const modalMessage = document.getElementById('modal-message');
    const modalCloseButton = feedbackModal.querySelector('#modal-close-button');
    const successIcon = `<i class="fas fa-check-circle fa-2x text-green-500"></i>`;
    const errorIcon = `<i class="fas fa-times-circle fa-2x text-red-500"></i>`;
    const infoIcon = `<i class="fas fa-info-circle fa-2x text-blue-500"></i>`;

    // NOVOS SELETORES PARA INDICADORES DE CARREGAMENTO
    const globalLoadingOverlay = document.getElementById('global-loading-overlay');
    const loadingMessage = document.getElementById('loading-message');
    const statusLoadingIndicator = document.getElementById('status-loading-indicator');
    const statusContent = document.getElementById('status-content');
    const stockTableLoadingIndicator = document.getElementById('stock-table-loading-indicator');
    const stockTableContent = document.getElementById('stock-table-content');
    const redirectTableLoadingIndicator = document.getElementById('redirect-table-loading-indicator');
    const redirectTableContent = document.getElementById('redirect-table-content');
    const movimentacoesTableLoadingIndicator = document.getElementById('movimentacoes-table-loading-indicator');
    const movimentacoesTableContent = document.getElementById('movimentacoes-table-content');
    const userTableLoadingIndicator = document.getElementById('user-table-loading-indicator');
    const userTableContent = document.getElementById('user-table-content');
    const rectificationTableLoadingIndicator = document.getElementById('rectification-table-loading-indicator');
    const rectificationTableContent = document.getElementById('rectification-table-content');
    const clientStatusTableLoadingIndicator = document.getElementById('client-status-table-loading-indicator');
    const clientStatusTableContent = document.getElementById('client-status-table-content');
    const rectificationSearchInput = document.getElementById('rectification-search-input');
        if (rectificationSearchInput) {
            rectificationSearchInput.addEventListener('keyup', (e) => {
            renderRectificationView(e.target.value);
        });
    }
    // Adicione esta função auxiliar no topo do script.js
    const emptyStateHTML = (message, iconClass) => `<div class="text-center p-8 text-slate-500"><i class="${iconClass} fa-2x text-slate-300 mb-4"></i><p class="text-sm">${message}</p></div>`;
    // --- DEFINIÇÃO DE TODAS AS FUNÇÕES ---
    let isMobileMenuOpen = false;

    function toggleMobileMenu() {
        if (isMobileMenuOpen) {
            mobileMenu.classList.add('mobile-menu-close');
            mobileMenu.classList.remove('mobile-menu-open');
            mobileMenu.addEventListener('animationend', function handler() {
                mobileMenu.classList.add('hidden');
                mobileMenu.removeEventListener('animationend', handler);
            });
        } else {
            mobileMenu.classList.remove('hidden', 'mobile-menu-close');
            mobileMenu.classList.add('mobile-menu-open');
        }
        isMobileMenuOpen = !isMobileMenuOpen;
    }

    function showGlobalLoading(message = 'Processando...') {
        if (loadingMessage) loadingMessage.textContent = message;
        if (globalLoadingOverlay) globalLoadingOverlay.classList.remove('hidden');
    }

    function hideGlobalLoading() {
        if (globalLoadingOverlay) globalLoadingOverlay.classList.add('hidden');
    }

    function toggleTableLoading(indicatorElement, contentElement, show) {
        if (indicatorElement && contentElement) {
            indicatorElement.classList.toggle('hidden', !show);
            contentElement.classList.toggle('hidden', show);
        }
    }

    function showPage(pageName) {
        if (!hasPageAccess(pageName)) {
            showFeedbackModal('Acesso Negado', 'Você não tem permissão para acessar esta página.', 'error');
            return;
        }
        document.querySelectorAll('main > div').forEach(page => page.classList.add('hidden'));
        document.getElementById(`page-${pageName}`).classList.remove('hidden');
        document.querySelectorAll('header nav a').forEach(link => {
            link.classList.remove('nav-link-active');
            link.classList.add('nav-link-inactive');
        });
        const navLink = document.getElementById(`nav-${pageName}`);
        if(navLink) {
            navLink.classList.add('nav-link-active');
        }
        if (!mobileMenu.classList.contains('hidden')) {
            toggleMobileMenu();
        }
        loadPageData(pageName);
    }

    async function loadPageData(pageName) {
        try {
            switch (pageName) {
                case 'status':
                    toggleTableLoading(statusLoadingIndicator, statusContent, true);
                    await Promise.all([
                        loadProducts(),
                        loadInventory(),
                        loadVehicleInventories(),
                        loadRedirectInventory(),
                        loadUsers(),
                        loadClientActivities(),
                        loadRectificationItems(),
                        loadTowers()
                    ]);
                    renderStatusDashboard();
                    startSubscriptionTimer('2025-07-21T14:30:00', '2026-07-21T14:30:00');
                    toggleTableLoading(statusLoadingIndicator, statusContent, false);
                    break;
                case 'estoque':
                    toggleTableLoading(stockTableLoadingIndicator, stockTableContent, true);
                    toggleTableLoading(redirectTableLoadingIndicator, redirectTableContent, true);
                    await Promise.all([
                        loadProducts(),
                        loadInventory(),
                        loadRedirectInventory()
                    ]);
                    const currentStockTab = document.querySelector('#page-estoque .stock-tab.text-indigo-600');
                    const currentStockTabName = currentStockTab ? currentStockTab.id.replace('tab-', '') : null;
                    if (currentStockTabName && hasStockTabAccess(currentStockTabName)) {
                        switchStockTab(currentStockTabName);
                    } else {
                        switchStockTab(hasStockTabAccess('saldo') ? 'saldo' : 'cadastro');
                    }
                    toggleTableLoading(stockTableLoadingIndicator, stockTableContent, false);
                    toggleTableLoading(redirectTableLoadingIndicator, redirectTableContent, false);
                    break;
                case 'veiculos':
                    await Promise.all([
                        loadProducts(),
                        loadInventory(),
                        loadVehicleInventories(),
                        loadRedirectInventory()
                    ]);
                    break;
                case 'movimentacoes':
                    toggleTableLoading(movimentacoesTableLoadingIndicator, movimentacoesTableContent, true);
                    await loadTransactionLogs();
                    renderLogView();
                    toggleTableLoading(movimentacoesTableLoadingIndicator, movimentacoesTableContent, false);
                    break;
                case 'usuarios':
                    toggleTableLoading(userTableLoadingIndicator, userTableContent, true);
                    toggleTableLoading(rectificationTableLoadingIndicator, rectificationTableContent, true);
                    toggleTableLoading(clientStatusTableLoadingIndicator, clientStatusTableContent, true);
                    await Promise.all([
                        loadUsers(),
                        loadClients(),
                        loadClientActivities(),
                        loadRectificationItems(),
                        loadTowers(),
                        loadVehicleInventories(), // <--- LINHA ADICIONADA: Baixa o estoque dos carros
                        loadProducts()            // <--- LINHA ADICIONADA: Baixa os nomes dos produtos
                    ]);
                    
                    const currentUserTab = document.querySelector('#page-usuarios .user-tab.text-indigo-600');
                    const currentUserTabName = currentUserTab ? currentUserTab.id.replace('tab-', '') : null;
                    
                    if (currentUserTabName && hasUserTabAccess(currentUserTabName)) {
                        switchUserTab(currentUserTabName);
                    } else {
                        switchUserTab(getDefaultUserTab());
                    }
                    
                    toggleTableLoading(userTableLoadingIndicator, userTableContent, false);
                    toggleTableLoading(rectificationTableLoadingIndicator, rectificationTableContent, false);
                    toggleTableLoading(clientStatusTableLoadingIndicator, clientStatusTableContent, false);
                    break;
                }
        } catch (error) {
            console.error(`Erro ao carregar dados da página ${pageName}:`, error);
            showFeedbackModal('Erro de Carregamento', `Não foi possível carregar os dados para esta página: ${error.message}`, 'error');
            toggleTableLoading(statusLoadingIndicator, statusContent, false);
            toggleTableLoading(stockTableLoadingIndicator, stockTableContent, false);
            toggleTableLoading(redirectTableLoadingIndicator, redirectTableContent, false);
            toggleTableLoading(movimentacoesTableLoadingIndicator, movimentacoesTableContent, false);
            toggleTableLoading(userTableLoadingIndicator, userTableContent, false);
            toggleTableLoading(rectificationTableLoadingIndicator, rectificationTableContent, false);
            toggleTableLoading(clientStatusTableLoadingIndicator, clientStatusTableContent, false);
        }
    }
    async function loadTowers() {
        try {
            const result = await DataService.getTowers(currentUser.role);
            towersData = result.data || [];
            await saveDataToStorage('towersData', towersData);
        } catch (error) {
            towersData = await loadDataFromStorage('towersData') || [];
            console.warn('Erro ao carregar torres do servidor, usando cache local:', error);
        }
    }
    
    function showFeedbackModal(title, message, type = 'success', onCloseCallback = null) {
    const feedbackModal = document.getElementById('feedback-modal');
    if (!feedbackModal) return;

    const modalTitleEl = feedbackModal.querySelector('#modal-title');
    const modalMessageEl = feedbackModal.querySelector('#modal-message');
    const modalIconContainerEl = feedbackModal.querySelector('#modal-icon-container');
    const modalCloseButtonEl = feedbackModal.querySelector('#modal-close-button');
    
    // Define o conteúdo do modal
    if(modalTitleEl) modalTitleEl.textContent = title;
    if(modalMessageEl) modalMessageEl.textContent = message;

    let icon = successIcon; // successIcon, errorIcon e infoIcon devem estar definidos no seu escopo
    if (type === 'error') icon = errorIcon;
    if (type === 'info') icon = infoIcon;
    if(modalIconContainerEl) modalIconContainerEl.innerHTML = icon;

    // Mostra o modal
    feedbackModal.classList.remove('hidden');

    // Lógica corrigida para fechar
    if (type === 'success') {
        // 1. Para mensagens de sucesso, sempre esconde o botão "OK".
        modalCloseButtonEl?.classList.add('hidden');
        
        // 2. E sempre define um timer para fechar o modal automaticamente.
        setTimeout(() => {
            feedbackModal.classList.add('hidden');
            // 3. Se uma função de callback foi fornecida, executa ela depois de fechar.
            if (onCloseCallback) {
                onCloseCallback();
            }
        }, 2500); // A mensagem ficará visível por 2.5 segundos.
    } else {
        // Para mensagens de erro ou informação, garante que o botão "OK" esteja visível.
        modalCloseButtonEl?.classList.remove('hidden');
    }
}

    function hideFeedbackModal() {
        if(feedbackModal) feedbackModal.classList.add('hidden');
    }
    
    function showInfoModal(title, content) {
        if(genericModalTitle) genericModalTitle.textContent = title;
        if(genericModalContent) genericModalContent.innerHTML = content;
        if(genericModal) genericModal.classList.remove('hidden');
    }

    function hideInfoModal() {
        if(genericModal) genericModal.classList.add('hidden');
    }
    
    function updateWelcomeMessage() {
        if (currentUser) {
            document.getElementById('user-welcome').textContent = `Olá, ${currentUser.name || 'Usuário'}! (${currentUser.role || 'N/A'})`; 
        } else {
            document.getElementById('user-welcome').textContent = '';
        }
    }

    async function loadAllInitialData() {
    showGlobalLoading('Carregando dados iniciais...');
    try {
        // Agora buscamos TUDO que o dashboard precisa de uma vez
        const results = await Promise.all([
            DataService.getUsers(currentUser.funcao),
            DataService.getTowers(currentUser.funcao), // <-- Carrega os dados completos das torres
            // Adicione outras chamadas de dados essenciais aqui
        ]);

        userList = results[0].data || [];
        towersData = results[1].data || [];
        
        // Agora podemos popular os cards do dashboard com segurança
        const visibleUsers = userList.filter(user => user.funcao && user.funcao.toLowerCase() !== 'desenvolvedor');
        document.getElementById('user-count').textContent = visibleUsers.length;
        document.getElementById('tower-count').textContent = towersData.length;
        // ... preencher os outros cards
        
    } catch (error) {
        console.error("Erro fatal ao carregar dados iniciais:", error);
        alert("Não foi possível carregar os dados essenciais do sistema.");
    } finally {
        hideGlobalLoading();
    }
}

// Versão CORRIGIDA
function checkLoginStatus() {
        const user = sessionStorage.getItem('currentUser');
        if (user) {
            currentUser = JSON.parse(user);
            if (currentUser.role === 'Financeiro') {
                window.location.href = 'financeiro.html';
                return; 
            }
            updateWelcomeMessage();
            applyPermissions();
            showPage(getDefaultPage());
        } else {
            window.location.href = 'login.html';
        }
    }

    function logout() {
        sessionStorage.removeItem('currentUser');
        window.location.href = 'login.html';
    }

    // VERSÃO CORRIGIDA
    // VERSÃO FINAL E SEGURA
function hasPageAccess(pageName) {
    if (!currentUser) return false;
    const userRole = currentUser.role;

    // Mapeamento explícito de quem vê o quê.
    const permissions = {
        'Desenvolvedor': ['status', 'estoque', 'veiculos', 'movimentacoes', 'usuarios', 'financeiro'],
        'Administrador': ['status', 'estoque', 'veiculos', 'movimentacoes', 'usuarios', 'financeiro'],
        'Estoquista':    ['status', 'estoque', 'veiculos', 'movimentacoes', 'usuarios'],
        'Operador':      ['veiculos', 'usuarios'],
        'Suporte':       ['status','veiculos', 'usuarios'],
        'Financeiro':    ['financeiro'] // Apenas a página 'financeiro'
    };

    if (permissions[userRole]) {
        return permissions[userRole].includes(pageName);
    }

    return false;
}

    // VERSÃO CORRIGIDA
function hasUserTabAccess(tabName) {
    if (!currentUser) return false;
    const userRole = currentUser.role;

    // Estoquista e Desenvolvedor têm acesso a todas as abas desta página.
    if (userRole === 'Estoquista' || userRole === 'Desenvolvedor') {
        return true;
    }

    // Regras específicas para os outros cargos.
    switch (userRole) {
        case 'Administrador':
            // O Administrador pode ver tudo, incluindo a lista de usuários e a retífica.
            return ['user-list', 'rectification', 'client-activity'].includes(tabName);
        
        case 'Operador':
        case 'Suporte':
            // --- AQUI ESTÁ A CORREÇÃO ---
            // Removemos 'rectification' da lista. Agora eles só podem ver 'client-activity'.
            return ['client-activity'].includes(tabName);
            
        default:
            // Para qualquer outro cargo (como Financeiro), nega o acesso por segurança.
            return false;
    }
}

    // VERSÃO CORRIGIDA
    function hasStockTabAccess(tabName) {
    if (!currentUser) return false;

    if (['Estoquista', 'Desenvolvedor', 'Administrador'].includes(currentUser.role)) {
        return true;
    }

    // Lógica para os outros...
    if (currentUser.role === 'Operador') {
        return tabName === 'saldo';
    }

    return false;

}

    // VERSÃO CORRIGIDA
// Versão CORRIGIDA
function hasVehicleModalTabAccess(tabName) {
    if (!currentUser) return false;
    const userRole = currentUser.role;

    if (['Estoquista', 'Desenvolvedor', 'Administrador'].includes(userRole)) {
        return true;
    }

    // Lógica para Operador e Suporte (acesso idêntico)
    if (userRole === 'Operador' || userRole === 'Suporte') {
        return tabName === 'saldo'; // Permite que ambos vejam apenas a aba 'saldo'
    }

    return false;
}

function getDefaultPage() {
    if (!currentUser) return 'status';
        
    // Pega o cargo corretamente (garantia extra)
    const userRole = currentUser.role || currentUser.funcao;
        
    switch (userRole) {
        case 'Estoquista':
        case 'Administrador':
        case 'Desenvolvedor': 
            return 'status'; // Admin e cia vão pro Dashboard
        case 'Operador':
            return 'usuarios'; // <--- A MÁGICA AQUI: Operador vai direto pra aba de Atividades!
        case 'Suporte':
            return 'status';
        case 'Financeiro': 
            return 'financeiro';
        default:
            return 'login.html'; // Por segurança, desloga se o cargo for desconhecido
    }
}

function getDefaultUserTab() {
    if (!currentUser) return 'user-list';
        
    const userRole = currentUser.role || currentUser.funcao;
        
    switch (userRole) {
        case 'Estoquista':
        case 'Administrador':
        case 'Desenvolvedor':
            return 'user-list';
        case 'Operador':
        case 'Suporte': 
            return 'client-activity'; // Garante que a aba Atividades seja a principal para eles
        default:
            return 'user-list';
    }
}

// VERSÃO FINAL, COMPLETA E RESPONSIVA
function applyPermissions() {
    if (!currentUser) return;

    // --- 1. LÓGICA DE VISIBILIDADE DE PÁGINAS (MENU) ---
    // Esta parte controla quais links do menu são visíveis
    navStatus.classList.toggle('hidden', !hasPageAccess('status'));
    navEstoque.classList.toggle('hidden', !hasPageAccess('estoque'));
    navVeiculos.classList.toggle('hidden', !hasPageAccess('veiculos'));
    navMovimentacoes.classList.toggle('hidden', !hasPageAccess('movimentacoes'));
    navUsuarios.classList.toggle('hidden', !hasPageAccess('usuarios'));
    document.getElementById('nav-financeiro').classList.toggle('hidden', !hasPageAccess('financeiro')); // ESSA LINHA É CRUCIAL
    // --- [NOVO] LÓGICA DE VISIBILIDADE (MENU MOBILE) ---
    // Adicione este bloco para garantir que o Operador não veja o Dashboard no celular
    if (mobileNavStatus) mobileNavStatus.classList.toggle('hidden', !hasPageAccess('status'));
    if (mobileNavEstoque) mobileNavEstoque.classList.toggle('hidden', !hasPageAccess('estoque'));
    if (mobileNavVeiculos) mobileNavVeiculos.classList.toggle('hidden', !hasPageAccess('veiculos'));
    if (mobileNavMovimentacoes) mobileNavMovimentacoes.classList.toggle('hidden', !hasPageAccess('movimentacoes'));
    if (mobileNavUsuarios) mobileNavUsuarios.classList.toggle('hidden', !hasPageAccess('usuarios'));
    // --- 2. LÓGICA DE HABILITAÇÃO DE AÇÕES ---
    // (Esta parte permanece como definimos anteriormente, mas incluída aqui para garantir)
    const fullActionAccessRoles = ['Estoquista', 'Desenvolvedor'];
    const userManagementRoles = ['Estoquista', 'Desenvolvedor', 'Administrador'];
    const clientManagementRoles = ['Desenvolvedor', 'Estoquista', 'Administrador', 'Suporte'];

    const canPerformAllActions = fullActionAccessRoles.includes(currentUser.role);
    const canManageUsers = userManagementRoles.includes(currentUser.role);
    const canManageClients = clientManagementRoles.includes(currentUser.role);

    if (userForm) {
        userForm.querySelectorAll('input, select, button').forEach(el => {
            el.disabled = !canManageUsers;
        });
    }
    if (stockForm) {
        stockForm.querySelectorAll('input, select, button').forEach(el => {
            el.disabled = !canPerformAllActions;
        });
    }

    const clientModalButton = document.getElementById('open-client-modal-button');
    const clientCard = document.getElementById('card-manage-clients');
    const userPageClientButton = document.getElementById('usuarios-page-manage-clients-button');

    if (clientModalButton) { clientModalButton.classList.toggle('hidden', !canManageClients); }
    if (clientCard) { clientCard.classList.toggle('hidden', !canManageClients); }
    if (userPageClientButton) { userPageClientButton.classList.toggle('hidden', !canManageClients); }

    if (vehicleAddForm) {
        vehicleAddForm.querySelectorAll('input, select, button').forEach(el => {
            el.disabled = !canPerformAllActions;
        });
    }
    if (vehicleRemoveForm) {
        vehicleRemoveForm.querySelectorAll('input, select, button').forEach(el => {
            el.disabled = !canPerformAllActions;
        });
    }


    // --- 3. LÓGICA DE EXIBIÇÃO DE ABAS INTERNAS ---
    // Esta parte depende das funções has...Access que já corrigimos.
    
    userTabs.forEach(tab => {
        tab.classList.toggle('hidden', !hasUserTabAccess(tab.id.replace('tab-','')));
    });
    stockTabs.forEach(tab => {
        tab.classList.toggle('hidden', !hasStockTabAccess(tab.id.replace('tab-','')));
    });
    vehicleTabs.forEach(tab => {
        tab.classList.toggle('hidden', !hasVehicleModalTabAccess(tab.dataset.tab));
    });
    userTabs.forEach(tab => {
        tab.classList.toggle('hidden', !hasUserTabAccess(tab.id.replace('tab-','')));
    });
    stockTabs.forEach(tab => {
        tab.classList.toggle('hidden', !hasStockTabAccess(tab.id.replace('tab-','')));
    });
    vehicleTabs.forEach(tab => {
        tab.classList.toggle('hidden', !hasVehicleModalTabAccess(tab.dataset.tab));
    });
    // Lógica final que garante que a aba correta seja exibida ao carregar a página
    // (Esta parte pode permanecer como estava no seu código original)
    const currentPageElement = document.querySelector('main > div:not(.hidden)');
    if (currentPageElement) {
        const pageId = currentPageElement.id;
        if (pageId === 'page-usuarios' && !document.querySelector('#page-usuarios .user-tab:not(.hidden)')) {
            switchUserTab(getDefaultUserTab());
        }
        // Adicionar lógica similar para outras páginas com abas se necessário
    }

    const navRef = document.getElementById('nav-veiculos'); 
    if (navRef && navRef.parentElement && !document.getElementById('nav-link-ponto-injetado')) {
        const btnPonto = document.createElement('a');
        btnPonto.id = 'nav-link-ponto-injetado';
        btnPonto.href = '#';
        // Copia classes do link vizinho para manter padrão, forçando inativo
        btnPonto.className = navRef.className.replace('nav-link-active', 'nav-link-inactive'); 
        if(!btnPonto.className) btnPonto.className = 'text-gray-600 hover:text-indigo-600 px-3 py-2 font-medium transition-colors cursor-pointer'; // Fallback
        
        btnPonto.innerHTML = '<i class="fas fa-fingerprint mr-1"></i> Ponto';
        btnPonto.onclick = (e) => { e.preventDefault(); window.exibirModalPonto(); };
        navRef.parentElement.appendChild(btnPonto);
    }

    // 2. MOBILE: Injeta no menu hambúrguer [AQUI ESTAVA FALTANDO]
    const mobileNavRef = document.getElementById('mobile-nav-veiculos');
    
    // Verifica se o menu mobile existe e se o botão já não foi criado
    if (mobileNavRef && mobileNavRef.parentElement && !document.getElementById('mobile-nav-link-ponto-injetado')) {
        
        const btnMobile = document.createElement('a');
        btnMobile.id = 'mobile-nav-link-ponto-injetado';
        btnMobile.href = '#';
        
        // Estilo bloco para ficar bonito no celular
        btnMobile.className = 'block px-3 py-2 rounded-md text-base font-medium text-gray-700 hover:text-gray-900 hover:bg-gray-50 cursor-pointer flex items-center gap-2 mt-1';
        
        btnMobile.innerHTML = '<i class="fas fa-fingerprint text-indigo-500"></i> Controle de Ponto';
        
        btnMobile.onclick = (e) => { 
            e.preventDefault(); 
            // 1. Fecha o menu mobile
            if (typeof toggleMobileMenu === 'function') toggleMobileMenu(); 
            // 2. Abre o modal
            window.exibirModalPonto();
        };

        // Adiciona logo após o item de Veículos
        mobileNavRef.parentElement.appendChild(btnMobile);
    }

}

    async function loadDataFromStorage(key) {
        try {
            const data = await localforage.getItem(key);
            return data || [];
        } catch (error) {
            console.error(`Erro ao carregar ${key} do IndexedDB:`, error);
            return [];
        }
    }

    async function saveDataToStorage(key, data) {
        try {
            await localforage.setItem(key, data);
        } catch (error) {
            console.error(`Erro ao salvar ${key} no IndexedDB:`, error);
        }
    }

    async function loadProducts() {
        try {
            const result = await DataService.getProductsInfo(currentUser.role);
            products = result.data;
            await saveDataToStorage('products', products);
        } catch (error) {
            products = await loadDataFromStorage('products');
            if (products.length === 0) showFeedbackModal('Erro', 'Não foi possível carregar definições de produtos. Modo offline ou erro de rede/API.', 'error');
            console.warn('Erro ao carregar produtos do servidor, usando cache local:', error);
        }
    }

    async function loadInventory() {
        try {
            const result = await DataService.getInventory(currentUser.role);
            mainInventory = result.data;
            await saveDataToStorage('mainInventory', mainInventory);
        } catch (error) {
            mainInventory = await loadDataFromStorage('mainInventory');
            if (mainInventory.length === 0) showFeedbackModal('Erro', 'Não foi possível carregar estoque principal. Modo offline ou erro de rede/API.', 'error');
            console.warn('Erro ao carregar inventário principal do servidor, usando cache local:', error);
        }
    }

    // NOVA VERSÃO OTIMIZADA DA FUNÇÃO
    async function loadVehicleInventories() {
        try {
            // Faz uma única chamada para pegar todos os inventários
            const result = await DataService.getAllVehicleInventories(currentUser.role);
            
            // Atualiza a variável local com os dados recebidos
            vehicleInventory = result.data;
    
            // Salva cada inventário no cache local individualmente
            for (const name in vehicleInventory) {
                if (Object.hasOwnProperty.call(vehicleInventory, name)) {
                    await saveDataToStorage(`vehicleInventory_${name}`, vehicleInventory[name]);
                }
            }
        } catch (error) {
            console.error('Falha ao carregar inventários de veículos do servidor, usando cache local.', error);
            // Se a chamada principal falhar, tenta carregar do cache como antes
            const vehicleNames = ['montana', 'uno', 'pajero', 'estoqueAlternativo', 'unonovo'];
            for (const name of vehicleNames) {
                vehicleInventory[name] = await loadDataFromStorage(`vehicleInventory_${name}`);
            }
        }
    }

    async function loadRedirectInventory() {
        try {
            const result = await DataService.getRedirectInventory(currentUser.role);
            redirectInventory = result.data;
            await saveDataToStorage('redirectInventory', redirectInventory);
        } catch (error) {
            redirectInventory = await loadDataFromStorage('redirectInventory');
            console.warn('Erro ao carregar inventário de redirecionamento do servidor, usando cache local:', error);
        }
    }

    async function loadTransactionLogs() {
        try {
            const result = await DataService.getTransactionLogs(currentUser.role);
            transactionLog = result.data;
            await saveDataToStorage('transactionLog', transactionLog);
        } catch (error) {
            transactionLog = await loadDataFromStorage('transactionLog');
            console.warn('Erro ao carregar logs de transação do servidor, usando cache local:', error);
        }
    }

    async function loadUsers() {
        try {
            const result = await DataService.getUsers(currentUser.role);
            userList = result.data || [];
            await saveDataToStorage('userList', userList);
        } catch (error) {
            userList = await loadDataFromStorage('userList') || [];
            console.warn('Erro ao carregar usuários do servidor, usando cache local:', error);
        }
    }

    async function loadClients() {
        try {
            const result = await DataService.getClients(currentUser.role);
            clientList = result.data;
            await saveDataToStorage('clientList', clientList);
        } catch (error) {
            clientList = await loadDataFromStorage('clientList');
            if (clientList.length === 0) showFeedbackModal('Erro', 'Não foi possível carregar a lista de clientes. Modo offline ou erro de rede/API.', 'error');
            console.warn('Erro ao carregar clientes do servidor, usando cache local:', error);
        }
    }

    async function loadClientActivities() {
        try {
            const result = await DataService.getClientActivities(currentUser.role);
            clientActivities = result.data;
            await saveDataToStorage('clientActivities', clientActivities);
        } catch (error)
        {
            clientActivities = await loadDataFromStorage('clientActivities');
            console.warn('Erro ao carregar atividades de cliente do servidor, usando cache local:', error);
        }
    }

    async function loadRectificationItems() {
        try {
            const result = await DataService.getRectificationItems(currentUser.role);
            rectificationItems = result.data;
            await saveDataToStorage('rectificationItems', rectificationItems);
        } catch (error) {
            rectificationItems = await loadDataFromStorage('rectificationItems');
            console.warn('Erro ao carregar itens de retífica do servidor, usando cache local:', error);
        }
    }

    async function logTransaction(action, patrimonio, source, destination) {
        if (!currentUser) return;
        const logData = {
        timestamp: new Date().toISOString(),
        user: currentUser.name,
        action_log: action, // <---- CORREÇÃO: mude 'action' para 'action_log: action'
        patrimonio,
        source,
        destination
    };
        try {
            await DataService.logTransaction(logData, currentUser.role);
            transactionLog.unshift(logData);
            await saveDataToStorage('transactionLog', transactionLog);
        } catch (error) {
            console.error('Erro ao registrar transação online, adicionando à fila de sincronização:', error);
            await enqueuePendingOperation({ type: 'LOG_TRANSACTION', payload: logData });
            transactionLog.unshift(logData);
            showFeedbackModal('Offline', `Transação de ${action} será registrada quando a conexão for reestabelecida.`, 'info');
        }
    }

    function renderLogView() {
        movimentacoesNoResults.classList.toggle('hidden', transactionLog && transactionLog.length > 0);
        
        if (!transactionLog || transactionLog.length === 0) {
            movimentacoesTableBody.innerHTML = '';
            return;
        }

        // Limita a exibição aos 300 mais recentes para não travar a tela
        const logsToDisplay = transactionLog.slice(0, 300);

        // Constrói o HTML inteiro de uma vez só na memória (MUITO mais rápido)
        const htmlString = logsToDisplay.map(log => {
            const formattedTimestamp = log.timestamp 
                ? new Date(log.timestamp).toLocaleString('pt-BR', { 
                    year: 'numeric', month: 'numeric', day: 'numeric',
                    hour: '2-digit', minute: '2-digit', second: '2-digit',
                    timeZone: 'America/Sao_Paulo' 
                  })
                : 'N/A';
            
            return `
                <tr class="hover:bg-slate-50">
                    <td class="td-style">${formattedTimestamp}</td>
                    <td class="td-style">${log.user || 'N/A'}</td>
                    <td class="td-style font-medium text-indigo-700">${log.action || 'N/A'}</td>
                    <td class="td-style font-bold text-gray-800">${log.patrimonio || 'N/A'}</td>
                    <td class="td-style">${log.source || 'N/A'}</td>
                    <td class="td-style">${log.destination || 'N/A'}</td>
                </tr>
            `;
        }).join(''); // O .join('') é a mágica que evita o travamento

        // Aplica na tela em uma única operação
        movimentacoesTableBody.innerHTML = htmlString;
    }
    
    function getTotalStockById(productId) {
        let total = 0;
        total += mainInventory.filter(item => String(item.id) === String(productId)).length;
        for (const vehicle in vehicleInventory) {
            total += vehicleInventory[vehicle].filter(item => String(item.id) === String(productId)).length;
        }
        return total;
    }
    
    async function renderStatusDashboard() {
    try {
        // Busca o resumo de produtos E consumíveis PRIMEIRO para ter a lista de compras unificada
        const [summaryResult, consumiveisResult] = await Promise.all([
            DataService.getProductsSummary(currentUser.role),
            DataService.getItensConsumiveis(currentUser.role)
        ]);
        
        const allProducts = summaryResult.data || [];
        const allConsumiveis = consumiveisResult.data || [];

        // Filtra os que estão abaixo ou iguais ao limite de segurança
        const productsToBuy = allProducts.filter(p => parseInt(p.quantidadeTotal) <= parseInt(p.safetyStock));
        const consumiveisToBuy = allConsumiveis.filter(c => parseInt(c.quantidadeEstoque) <= parseInt(c.estoque_minimo));
        
        // Soma o total de itens (equipamentos + consumíveis) que precisam ser comprados
        const totalItemsToBuy = productsToBuy.length + consumiveisToBuy.length;

        // Agora, atualiza todos os cards do dashboard com os dados corretos
        document.getElementById('status-total-products').textContent = products.length;
        document.getElementById('status-total-vehicles').textContent = Object.values(vehicleInventory).filter(v => v.length > 0).length;
        document.getElementById('status-total-users').textContent = userList.length;
        document.getElementById('status-total-rectification').textContent = rectificationItems.length;
        
        // ATUALIZA O CARD DE COMPRAS COM O DADO UNIFICADO
        document.getElementById('status-total-buy').textContent = totalItemsToBuy;

        // O resto da sua lógica de renderização dos gráficos permanece a mesma
        const ctx = document.getElementById('item-distribution-chart').getContext('2d');
        // Mapa para traduzir os códigos do banco para nomes bonitos na tela
        const displayNames = {
            'montana': 'Montana',
            'uno': 'Uno',
            'pajero': 'Pajero',
            'unonovo': 'Uno Novo',
            'estoqueAlternativo': 'Materiais Irreparáveis', // <--- A MÁGICA ESTÁ AQUI
            'Estoquealternativo': 'Materiais Irreparáveis'  // Prevenção para minúsculas
        };
        const labels = ['Estoque Principal', ...Object.keys(vehicleInventory).map(name => name.charAt(0).toUpperCase() + name.slice(1))];
        const data = [mainInventory.length, ...Object.values(vehicleInventory).map(vehicle => vehicle.length)];
        
        if(itemChart) {
            itemChart.destroy();
        }
        itemChart = new Chart(ctx, {
            type: 'doughnut',
            data: {
                labels: labels,
                datasets: [{
                    label: 'Distribuição de Itens',
                    data: data,
                    backgroundColor: [
                        'rgba(59, 130, 246, 0.7)',
                        'rgba(16, 185, 129, 0.7)',
                        'rgba(107, 114, 128, 0.7)',
                        'rgba(245, 158, 11, 0.7)',
                        'rgba(239, 68, 68, 0.7)'
                    ],
                    borderColor: '#fff',
                    borderWidth: 2
                }]
            },
            options: {
                responsive: true,
                plugins: {
                    legend: { position: 'top' },
                }
            }
        });

        // Chamadas para renderizar os outros gráficos
        renderClientActivityDashboard();
        renderRectificationChart();

        // Atualiza os outros cards que dependem de chamadas de API
        DataService.getClients(currentUser.role).then(result => {
            document.getElementById('status-total-clients').textContent = result.data.length;
        });
        DataService.getHistoricoCombustivel({}, currentUser.role).then(result => {
            document.getElementById('status-total-fillups').textContent = result.data.length;
        });
        DataService.getConsumptionLogCount(currentUser.role).then(result => {
             document.getElementById('status-total-consumption').textContent = result.data.total;
        });
        document.getElementById('status-total-towers').textContent = towersData.length;

    } catch (error) {
        console.error("Erro ao renderizar o dashboard de status:", error);
        // Em caso de erro, mostra '?' para indicar que os dados não puderam ser carregados
        document.getElementById('status-total-buy').textContent = "?";
    }
}

    function renderRectificationChart() {
        const ctx = document.getElementById('rectification-chart').getContext('2d');
        const rectificationCounts = rectificationItems.reduce((acc, item) => {
            const productName = getProductName(item.id);
            acc[productName] = (acc[productName] || 0) + 1;
            return acc;
        }, {});
        const labels = Object.keys(rectificationCounts);
        const data = Object.values(rectificationCounts);
        if (rectificationChart) {
            rectificationChart.destroy();
        }
        rectificationChart = new Chart(ctx, {
            type: 'bar',
            data: {
                labels: labels,
                datasets: [{
                    label: 'Itens em Retífica por Produto',
                    data: data,
                    backgroundColor: 'rgba(245, 158, 11, 0.8)',
                    borderColor: 'rgba(245, 158, 11, 1)',
                    borderWidth: 1
                }]
            },
            options: {
                responsive: true,
                scales: { y: { beginAtZero: true, title: { display: true, text: 'Quantidade de Itens' } } },
                plugins: { legend: { display: false } }
            }
        });
    }
    
    function renderClientActivityDashboard(searchTerm = '') {
        const dashboard = document.getElementById('client-activity-dashboard');
        dashboard.innerHTML = '';
        const term = searchTerm.toLowerCase().trim();
        let activitiesToDisplay = clientActivities;
        if (term) {
            activitiesToDisplay = activitiesToDisplay.filter(act => String(act.clientName).toLowerCase().includes(term));
        }
        if (activitiesToDisplay.length === 0) {
            dashboard.innerHTML = '<p class="text-center text-gray-500">Nenhuma atividade encontrada.</p>';
            return;
        }
        activitiesToDisplay.forEach(act => {
            const formattedDate = act.date 
        ? new Date(act.date).toLocaleString('pt-BR', { 
        year: 'numeric', month: '2-digit', day: '2-digit',
        hour: '2-digit', minute: '2-digit', second: '2-digit',
        timeZone: 'America/Sao_Paulo' 
        })
        : 'N/A';
            const card = `
                <div class="activity-card">
                    <div class="activity-card-header">
                        <span class="font-bold">${act.clientName || 'N/A'}</span>
                        <span class="text-sm text-gray-500">${formattedDate}</span>
                    </div>
                    <div class="activity-card-body">
                        <p><strong>Motivo:</strong> ${act.reason || 'N/A'}</p>
                        <p><strong>Patrimônio:</strong> ${act.patrimonio || 'N/A'}</p>
                        <p><strong>Executado por:</strong> ${act.userName || 'N/A'}</p>
                        ${act.tower ? `<p><strong>Torre:</strong> ${act.tower || 'N/A'}</p>` : ''}
                        ${act.sector ? `<p><strong>Setor:</strong> ${act.sector || 'N/A'}</p>` : ''}
                    </div>
                </div>
            `;
            dashboard.innerHTML += card;
        });
    }

    function renderRectificationSummaryModal() {
        let content = '<ul class="space-y-2">';
        if (rectificationItems.length > 0) {
            const groupedRectification = rectificationItems.reduce((acc, item) => {
                const productName = getProductName(item.id);
                acc[productName] = (acc[productName] || 0) + 1;
                return acc;
            }, {});
            Object.entries(groupedRectification).forEach(([productName, count]) => {
                content += `<li class="p-2 bg-orange-100 rounded-md">${productName} - <span class="font-bold">${count} itens</span></li>`;
            });
        } else {
            content += '<li>Nenhum item em retífica.</li>';
        }
        content += '</ul>';
        showInfoModal('Itens em Retífica', content);
    }

    function switchStockTab(activeTabName) {
        if (!hasStockTabAccess(activeTabName)) {
            const fallbackTab = hasStockTabAccess('saldo') ? 'saldo' : 'cadastro';
            if (activeTabName !== fallbackTab) {
                showFeedbackModal('Acesso Negado', 'Você não tem permissão para acessar esta seção.', 'error');
                switchStockTab(fallbackTab); 
            }
            return;
        }
        stockTabs.forEach(tab => {
            const isTabActive = tab.id === `tab-${activeTabName}`;
            tab.className = `stock-tab whitespace-nowrap py-4 px-1 border-b-2 font-medium text-sm ${isTabActive ? 'text-indigo-600 border-indigo-500' : 'text-gray-500 border-transparent hover:text-gray-700 hover:border-gray-300'}`;
        });
        sectionCadastro.classList.toggle('hidden', activeTabName !== 'cadastro');
        sectionSaldo.classList.toggle('hidden', activeTabName !== 'saldo');
        sectionRedirecionamento.classList.toggle('hidden', activeTabName !== 'redirecionamento');
        if (activeTabName === 'saldo') {
            toggleTableLoading(stockTableLoadingIndicator, stockTableContent, true);
            renderStockView(stockSearchInput.value.trim());
            toggleTableLoading(stockTableLoadingIndicator, stockTableContent, false);
        }
        if (activeTabName === 'redirecionamento') {
            toggleTableLoading(redirectTableLoadingIndicator, redirectTableContent, true);
            renderRedirectView();
            toggleTableLoading(redirectTableLoadingIndicator, redirectTableContent, false);
        }
    }

    function getProductName(id) {
        const product = products.find(p => String(p.id) === String(id));
        return product ? product.nome || 'Produto Desconhecido' : 'Produto Desconhecido';
    }

    function renderStockView(searchTerm = '') {
        const term = searchTerm.toLowerCase().trim();
        let inventoryToDisplay = mainInventory;
        
        if (term) {
            inventoryToDisplay = inventoryToDisplay.filter(item =>
                String(item.id).toLowerCase().includes(term) ||
                (item.produto && String(item.produto).toLowerCase().includes(term)) ||
                (item.patrimonio && String(item.patrimonio).toLowerCase().includes(term))
            );
        }
        
        stockNoResults.classList.toggle('hidden', inventoryToDisplay.length > 0);

        if (inventoryToDisplay.length === 0) {
            stockTableBody.innerHTML = '';
            return;
        }

        const grouped = inventoryToDisplay.reduce((acc, item) => {
            const productId = String(item.id);
            acc[productId] = acc[productId] || [];
            acc[productId].push(item);
            return acc;
        }, {});

        // Constrói tudo na memória de uma vez (Modo Turbo)
        const htmlString = Object.values(grouped).map(group => {
            const firstItem = group[0];
            let patrimonioCellContent;
            
            if (group.length > 1) {
                // SE TIVER MAIS DE 1: Cria a lista clicável com os botões
                const patrimoniosList = group.map(item => `
                    <div class="flex items-center justify-between p-1.5 border-b border-gray-200 last:border-0 hover:bg-gray-100 transition">
                        <span class="font-mono text-sm text-gray-700">${item.patrimonio}</span>
                        <div class="flex gap-2">
                            <button onclick="window.editarItemEstoque('${item.patrimonio}')" class="text-blue-400 hover:text-blue-600 p-1 rounded hover:bg-blue-50" title="Editar Digitação">
                                <i class="fas fa-edit"></i>
                            </button>
                            <button onclick="window.excluirItemDoSistema('${item.patrimonio}', '${item.produto}')" class="text-red-400 hover:text-red-600 p-1 rounded hover:bg-red-50" title="Excluir Definitivamente">
                                <i class="fas fa-trash-alt"></i>
                            </button>
                        </div>
                    </div>
                `).join('');
                
                patrimonioCellContent = `
                    <details>
                        <summary class="font-medium text-indigo-600 hover:text-indigo-800 cursor-pointer outline-none">Ver (${group.length})</summary>
                        <div class="mt-2 text-left bg-white p-2 rounded-md shadow border border-gray-200 max-h-40 overflow-y-auto">${patrimoniosList}</div>
                    </details>`;
            } else {
                // SE TIVER SÓ 1: Coloca o patrimônio e os botões direto na célula
                const singlePatrimonio = firstItem?.patrimonio || 'N/A';
                if (singlePatrimonio !== 'N/A') {
                    patrimonioCellContent = `
                        <div class="flex items-center justify-between gap-2">
                            <span class="font-mono text-gray-700">${singlePatrimonio}</span>
                            <div class="flex gap-2">
                                <button onclick="window.editarItemEstoque('${singlePatrimonio}')" class="text-blue-400 hover:text-blue-600 p-1 rounded hover:bg-blue-50" title="Editar Digitação">
                                    <i class="fas fa-edit"></i>
                                </button>
                                <button onclick="window.excluirItemDoSistema('${singlePatrimonio}', '${firstItem.produto}')" class="text-red-400 hover:text-red-600 p-1 rounded hover:bg-red-50" title="Excluir Definitivamente">
                                    <i class="fas fa-trash-alt"></i>
                                </button>
                            </div>
                        </div>`;
                } else {
                    patrimonioCellContent = 'N/A';
                }
            }

            return `
                <tr class="hover:bg-slate-50 border-b border-gray-100">
                    <td class="td-style">${firstItem.id || 'N/A'}</td>
                    <td class="td-style font-medium text-gray-800">${firstItem.produto || 'N/A'}</td>
                    <td class="td-style">${firstItem.endereco || 'N/A'}</td>
                    <td class="td-style">${patrimonioCellContent}</td>
                    <td class="td-style font-bold">${group.length}</td>
                </tr>`;
        }).join('');

        // Aplica na tela instantaneamente
        stockTableBody.innerHTML = htmlString;
    }

    function renderProductSummary() {
    const container = document.getElementById('product-summary-content');
    if (!container) return;

    // 1. Desenha a "casca" do modal, incluindo a barra de busca, APENAS UMA VEZ.
    container.innerHTML = `
        <div class="mb-4">
            <div class="flex items-center relative w-full h-12 rounded-full focus-within:shadow-lg bg-white border-2 border-slate-200 overflow-hidden transition">
                <div class="grid place-items-center h-full w-12 text-slate-400"><i class="fas fa-search"></i></div>
                <input class="peer h-full w-full outline-none text-sm text-slate-700 pr-2" type="text" id="product-summary-search" placeholder="Buscar por ID ou nome do produto...">
            </div>
        </div>
        <div id="product-summary-list-container"></div>
    `;

    // 2. Adiciona o "ouvinte" que, a cada letra digitada, chama a função que ATUALIZA APENAS A LISTA.
    const searchInput = document.getElementById('product-summary-search');
    searchInput.addEventListener('keyup', (e) => {
        updateProductSummaryList(e.target.value);
    });

    // 3. Renderiza a lista inicial (completa)
    updateProductSummaryList();
}

function updateProductSummaryList(searchTerm = '') {
    const listContainer = document.getElementById('product-summary-list-container');
    if (!listContainer) return;

    const term = searchTerm.toLowerCase().trim();
    let productsToDisplay = Array.isArray(products) ? [...products] : [];

    if (term) {
        productsToDisplay = productsToDisplay.filter(product =>
            (product.nome && product.nome.toLowerCase().includes(term)) ||
            (product.id && String(product.id).toLowerCase().includes(term))
        );
    }

    if (productsToDisplay.length === 0) {
        listContainer.innerHTML = `<p class="text-center p-4">Nenhum produto encontrado.</p>`;
        return;
    }

    const sortedProducts = productsToDisplay.sort((a, b) => parseInt(a.id) - parseInt(b.id));

    const tableBodyHtml = sortedProducts.map(product => {
        const qtyInMain = mainInventory.filter(item => String(item.id) === String(product.id)).length;
        return `
            <tr>
                <td class="td-style font-mono">${product.id}</td>
                <td class="td-style text-left font-medium text-gray-800">${product.nome || 'Nome não definido'}</td>
                <td class="td-style font-bold text-lg text-indigo-700">${qtyInMain}</td>
            </tr>
        `;
    }).join('');

    listContainer.innerHTML = `
        <table class="min-w-full divide-y divide-gray-200">
            <thead class="bg-gray-50">
                <tr>
                    <th class="th-style">ID</th>
                    <th class="th-style text-left">Nome do Produto</th>
                    <th class="th-style">Qtd. em Estoque</th>
                </tr>
            </thead>
            <tbody class="bg-white divide-y divide-gray-200">
                ${tableBodyHtml}
            </tbody>
        </table>
    `;
}

    // VERSÃO CORRIGIDA
    function renderRedirectView(searchTerm = '') {
        const term = searchTerm.toLowerCase().trim();
        let inventoryToDisplay = redirectInventory;

        if (term) {
            inventoryToDisplay = redirectInventory.filter(item =>
                (item.produto && String(item.produto).toLowerCase().includes(term)) ||
                (item.patrimonio && String(item.patrimonio).toLowerCase().includes(term)) ||
                (item.removedFrom && String(item.removedFrom).toLowerCase().includes(term))
            );
        }
        
        redirectNoResults.classList.toggle('hidden', inventoryToDisplay.length > 0);

        if (inventoryToDisplay.length === 0) {
            redirectTableBody.innerHTML = '';
            return;
        }

        const allowedRoles = ['Estoquista', 'Desenvolvedor'];
        const canPerformAction = allowedRoles.includes(currentUser.role);

        // Constrói o HTML na memória de uma vez só
        const htmlString = inventoryToDisplay.map(item => {
            const actionCellContent = `
                <div class="relative inline-block text-left">
                    <button type="button" class="inline-flex justify-center w-full rounded-md border border-gray-300 shadow-sm px-4 py-2 bg-white text-sm font-medium text-gray-700 hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 action-dropdown-button"
                            id="options-menu-${item.patrimonio}" aria-haspopup="true" aria-expanded="true" ${!canPerformAction ? 'disabled' : ''}>
                        Ações <i class="fas fa-ellipsis-v ml-2 -mr-1 text-gray-500"></i>
                    </button>
                    <div class="origin-top-right absolute right-0 mt-2 w-56 rounded-md shadow-lg bg-white ring-1 ring-black ring-opacity-5 hidden z-10 action-dropdown-menu" role="menu" aria-labelledby="options-menu-${item.patrimonio}">
                        <div class="py-1" role="none">
                            <span class="block px-4 py-2 text-sm text-gray-700 font-bold">Redirecionar para:</span>
                            <a href="#" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 redirect-option" data-patrimonio-id="${item.patrimonio}" data-destination="mainInventory">Estoque Principal</a>
                            <a href="#" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 redirect-option" data-patrimonio-id="${item.patrimonio}" data-destination="montana">Montana</a>
                            <a href="#" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 redirect-option" data-patrimonio-id="${item.patrimonio}" data-destination="uno">Uno</a>
                            <a href="#" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 redirect-option" data-patrimonio-id="${item.patrimonio}" data-destination="pajero">Pajero</a>
                            <a href="#" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 redirect-option" data-patrimonio-id="${item.patrimonio}" data-destination="estoqueAlternativo">Materiais Irreparáveis</a>
                            <a href="#" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 redirect-option" data-patrimonio-id="${item.patrimonio}" data-destination="unonovo">Uno Novo</a>
                            <div class="border-t border-gray-100"></div>
                            <a href="#" class="block px-4 py-2 text-sm text-orange-700 hover:bg-orange-100 send-to-rectification-option" data-patrimonio-id="${item.patrimonio}">Enviar p/ Retífica</a>
                            
                            <div class="border-t border-gray-200 my-1"></div>
                            <a href="#" class="block px-4 py-2 text-sm text-red-600 hover:bg-red-50 font-bold" onclick="window.excluirItemDoSistema('${item.patrimonio}', '${item.produto}')">
                                <i class="fas fa-trash-alt mr-2"></i>Excluir Definitivamente
                            </a>
                        </div>
                    </div>
                </div>
            `;
            return `
                <tr class="hover:bg-slate-50">
                    <td class="td-style">${item.id || 'N/A'}</td>
                    <td class="td-style font-medium text-gray-800">${item.produto || 'N/A'}</td>
                    <td class="td-style font-bold text-indigo-700">${item.patrimonio || 'N/A'}</td>
                    <td class="td-style">${item.removedFrom || 'N/A'}</td>
                    <td class="td-style">${actionCellContent}</td>
                </tr>
            `;
        }).join('');

        // Aplica na tela de uma vez
        redirectTableBody.innerHTML = htmlString;
    }

        
// Esta função atualiza o dropdown de Setores com base na Torre selecionada

    function renderUserView() {
        userTableBody.innerHTML = '';
        userNoResults.classList.toggle('hidden', userList.length > 0);
        
        // Apenas Administrador e Desenvolvedor podem ver os botões
        const canManageUsers = ['Desenvolvedor', 'Administrador'].includes(currentUser.role);

        const htmlString = userList.map(user => {
            let actionButtons = '-';
            
            // Desenha os botões só se for Admin, e NÃO deixa alterar/excluir o próprio perfil
            if (canManageUsers && String(user.id) !== String(currentUser.id)) {
                actionButtons = `
                    <button onclick="window.editarCargoUsuario('${user.id}', '${user.name}', '${user.role}')" class="text-indigo-500 hover:text-indigo-700 hover:bg-indigo-50 p-2 rounded transition" title="Alterar Função">
                        <i class="fas fa-user-edit"></i>
                    </button>
                    <button onclick="window.excluirUsuarioSistema('${user.id}', '${user.name}')" class="text-red-500 hover:text-red-700 hover:bg-red-50 p-2 rounded transition ml-1" title="Excluir Usuário">
                        <i class="fas fa-trash-alt"></i>
                    </button>
                `;
            }

            return `
                <tr class="hover:bg-slate-50 border-b border-gray-100">
                    <td class="td-style font-mono text-xs">${user.id || 'N/A'}</td>
                    <td class="td-style font-medium text-gray-800">${user.name || 'N/A'}</td>
                    <td class="td-style">
                        <span class="px-2 py-1 bg-slate-100 rounded-full text-xs font-semibold text-slate-600">${user.role || 'N/A'}</span>
                    </td>
                    <td class="td-style text-center">${actionButtons}</td>
                </tr>
            `;
        }).join('');

        userTableBody.innerHTML = htmlString;
    }

    // =========================================================
    // FUNÇÕES DE USUÁRIOS (ALTERAR E EXCLUIR) - AGORA NO LUGAR CERTO!
    // =========================================================
    window.editarCargoUsuario = function(id, nome, cargoAtual) {
        Swal.fire({
            title: `Alterar função de ${nome}`,
            input: 'select',
            inputOptions: {
                'Administrador': 'Administrador',
                'Estoquista': 'Estoquista',
                'Operador': 'Operador',
                'Suporte': 'Suporte',
                'Financeiro': 'Financeiro'
            },
            inputValue: cargoAtual,
            showCancelButton: true,
            confirmButtonColor: '#4f46e5',
            confirmButtonText: 'Salvar Alteração',
            cancelButtonText: 'Cancelar'
        }).then(async (result) => {
            if (result.isConfirmed && result.value !== cargoAtual) {
                showGlobalLoading('Atualizando usuário...');
                try {
                    const sessionUser = JSON.parse(sessionStorage.getItem('currentUser'));
                    await DataService.updateUserRole({ userId: id, newRole: result.value }, sessionUser.role);
                    
                    await loadUsers(); // Agora ele vai enxergar essa função!
                    renderUserView();  // E essa também!
                    
                    hideGlobalLoading();
                    Swal.fire('Sucesso!', 'A função do usuário foi atualizada.', 'success');
                } catch (error) {
                    hideGlobalLoading();
                    Swal.fire('Erro', error.message, 'error');
                }
            }
        });
    };

    window.excluirUsuarioSistema = function(id, nome) {
        Swal.fire({
            title: 'Excluir Usuário?',
            text: `Tem certeza que deseja apagar o acesso de ${nome}? Esta ação não tem volta.`,
            icon: 'warning',
            showCancelButton: true,
            confirmButtonColor: '#d33',
            cancelButtonColor: '#3085d6',
            confirmButtonText: 'Sim, excluir!',
            cancelButtonText: 'Cancelar'
        }).then(async (result) => {
            if (result.isConfirmed) {
                showGlobalLoading('Apagando usuário...');
                try {
                    const sessionUser = JSON.parse(sessionStorage.getItem('currentUser'));
                    await DataService.excluirUsuario(id, sessionUser.role);
                    
                    await loadUsers(); // Agora ele enxerga!
                    renderUserView();  // E desenha a tela de novo!
                    
                    hideGlobalLoading();
                    Swal.fire('Excluído!', 'Usuário removido do sistema.', 'success');
                } catch (error) {
                    hideGlobalLoading();
                    Swal.fire('Erro', error.message, 'error');
                }
            }
        });
    };

    // VERSÃO CORRIGIDA - Com verificação de permissão no momento da criação
// VERSÃO FINAL E SEGURA - Com a permissão corrigida na raiz
function renderRectificationView(searchTerm = '') {
    if (!['Administrador', 'Desenvolvedor', 'Estoquista'].includes(currentUser?.role)) {
        return;
    }
    const rectificationTableBody = document.getElementById('rectification-table-body');
    const rectificationNoResults = document.getElementById('rectification-no-results');
    
    const term = searchTerm.toLowerCase().trim();
    let itemsToDisplay = rectificationItems;

    if (term) {
        itemsToDisplay = rectificationItems.filter(item =>
            (item.produto && String(item.produto).toLowerCase().includes(term)) ||
            (item.patrimonio && String(item.patrimonio).toLowerCase().includes(term)) || 
            (item.id && String(item.id).toLowerCase().includes(term))
        );
    }

    rectificationNoResults.classList.toggle('hidden', itemsToDisplay.length > 0);

    if (!itemsToDisplay || itemsToDisplay.length === 0) {
        rectificationTableBody.innerHTML = '';
        return;
    }

    const allowedRoles = ['Estoquista', 'Desenvolvedor', 'Administrador'];
    const canPerformAction = allowedRoles.includes(currentUser.role);

    // Constrói HTML na memória (Turbo) com o Dropdown igual ao Redirecionamento
    const htmlString = itemsToDisplay.map(item => {
        const actionCellContent = canPerformAction 
            ? `
            <div class="relative inline-block text-left">
                <button type="button" class="inline-flex justify-center w-full rounded-md border border-gray-300 shadow-sm px-4 py-2 bg-white text-sm font-medium text-gray-700 hover:bg-gray-50 action-dropdown-button" id="rect-menu-${item.patrimonio}">
                    Ações <i class="fas fa-ellipsis-v ml-2 -mr-1 text-gray-500"></i>
                </button>
                <div class="origin-top-right absolute right-0 mt-2 w-56 rounded-md shadow-lg bg-white ring-1 ring-black ring-opacity-5 hidden z-10 action-dropdown-menu">
                    <div class="py-1">
                        <span class="block px-4 py-2 text-sm text-gray-700 font-bold">Enviar direto para:</span>
                        <a href="#" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 move-from-rect-option" data-patrimonio-id="${item.patrimonio}" data-destination="mainInventory">Estoque Principal</a>
                        <a href="#" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 move-from-rect-option" data-patrimonio-id="${item.patrimonio}" data-destination="montana">Montana</a>
                        <a href="#" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 move-from-rect-option" data-patrimonio-id="${item.patrimonio}" data-destination="uno">Uno</a>
                        <a href="#" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 move-from-rect-option" data-patrimonio-id="${item.patrimonio}" data-destination="pajero">Pajero</a>
                        <a href="#" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 move-from-rect-option" data-patrimonio-id="${item.patrimonio}" data-destination="estoqueAlternativo">Materiais Irreparáveis</a>
                        <a href="#" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 move-from-rect-option" data-patrimonio-id="${item.patrimonio}" data-destination="unonovo">Uno Novo</a>
                        <div class="border-t border-gray-100"></div>
                        <a href="#" class="block px-4 py-2 text-sm text-orange-600 hover:bg-orange-50 remove-only-rect-option" data-patrimonio-id="${item.patrimonio}">Apenas Retirar (Limbo)</a>
                        
                        <div class="border-t border-gray-200 my-1"></div>
                        <a href="#" class="block px-4 py-2 text-sm text-red-600 hover:bg-red-50 font-bold" onclick="window.excluirItemDoSistema('${item.patrimonio}', '${item.produto}')">
                            <i class="fas fa-trash-alt mr-2"></i>Excluir Definitivamente
                        </a>
                    </div>
                </div>
            </div>
            `
            : `<span class="text-xs text-gray-400">Acesso Negado</span>`;

        return `
            <tr class="hover:bg-slate-50">
                <td class="td-style">${item.id || 'N/A'}</td>
                <td class="td-style font-medium text-gray-800">${item.produto || 'N/A'}</td>
                <td class="td-style font-bold text-orange-700">${item.patrimonio || 'N/A'}</td>
                <td class="td-style">${item.removedFrom || 'N/A'}</td>
                <td class="td-style text-center">${actionCellContent}</td>
            </tr>
        `;
    }).join('');

    rectificationTableBody.innerHTML = htmlString;
}

    function switchClientTab(activeTabName) {
    clientTabs.forEach(tab => {
        const isTabActive = tab.id === `tab-${activeTabName}`;
        tab.className = `client-tab whitespace-nowrap py-4 px-1 border-b-2 font-medium text-sm ${isTabActive ? 'text-indigo-600 border-indigo-500' : 'text-gray-500 border-transparent hover:text-gray-700 hover:border-gray-300'}`;
    });
    document.getElementById('section-client-registration').classList.toggle('hidden', activeTabName !== 'client-registration');
    document.getElementById('section-client-status').classList.toggle('hidden', activeTabName !== 'client-status');
    if (activeTabName === 'client-status') {
        toggleTableLoading(clientStatusTableLoadingIndicator, clientStatusTableContent, true);
        renderClientStatus();
        toggleTableLoading(clientStatusTableLoadingIndicator, clientStatusTableContent, false);
    }
}

    function renderClientStatus() {
        clientStatusTableBody.innerHTML = '';
        clientStatusNoResults.classList.toggle('hidden', clientList.length > 0);
        clientList.forEach(client => {
            const clientLatestActivities = clientActivities.filter(act => String(act.clientId) === String(client.id));
            const lastActivity = clientLatestActivities.length > 0 
                ? clientLatestActivities.reduce((latest, current) => new Date(current.date) > new Date(latest.date) ? current : latest, clientLatestActivities[0])
                : {};
            clientStatusTableBody.innerHTML += `
                <tr>
                    <td class="td-style">${client.id || 'N/A'}</td>
                    <td class="td-style">${client.name || 'N/A'}</td>
                    <td class="td-style">${client.tower || 'N/A'}</td>
                    <td class="td-style">${client.sector || 'N/A'}</td>
                    <td class="td-style">${lastActivity.userName || 'N/A'}</td>
                    <td class="td-style">${lastActivity.patrimonio || 'N/A'}</td>
                    <td class="td-style">${lastActivity.reason || 'N/A'}</td>
                    <td class="td-style">${lastActivity.date ? new Date(lastActivity.date).toLocaleString('pt-BR', { year: 'numeric', month: 'numeric', day: 'numeric', hour: '2-digit', minute: '2-digit' }) : 'N/A'}</td>
                </tr>
            `;
        });
    }

    function openVehicleModal(vehicleId, vehicleNameParam) {
        currentVehicle = vehicleId;
        currentVehicleName = vehicleNameParam;
        vehicleModalTitle.textContent = `Gerenciar Carga: ${vehicleNameParam}`;
        const currentVehicleModalTab = document.querySelector('.vehicle-tab.text-indigo-600');
        const currentVehicleModalTabName = currentVehicleModalTab ? currentVehicleModalTab.dataset.tab : null;
        if (currentVehicleModalTabName && hasVehicleModalTabAccess(currentVehicleModalTabName)) {
            switchVehicleModalTab(currentVehicleModalTabName);
        } else {
            if (currentUser.role === 'Administrador' || currentUser.role === 'Operador' || currentUser.role === 'Suporte') {
                switchVehicleModalTab('saldo');
            } else {
                 switchVehicleModalTab('adicionar');
            }
        }
        vehicleModal.classList.remove('hidden');
    }

    // Esta função fecha o modal do veículo e limpa os formulários internos
    function closeVehicleModal() {
        vehicleModal.classList.add('hidden');
        currentVehicle = null;
        currentVehicleName = '';
        vehicleAddForm.reset();
        vehicleRemoveForm.reset();
        vehicleRectifyForm.reset(); // <--- ADICIONE ISSO
        addIdNotFoundError.classList.add('hidden');
        removeIdNotFoundError.classList.add('hidden');
        rectifyIdNotFoundError.classList.add('hidden'); // <--- ADICIONE ISSO
    }

    function switchVehicleModalTab(activeTabName) {
        if (!hasVehicleModalTabAccess(activeTabName)) {
            const fallbackTab = (currentUser.role === 'Administrador' || currentUser.role === 'Operador') ? 'saldo' : 'adicionar';
            if (activeTabName !== fallbackTab) {
                showFeedbackModal('Acesso Negado', 'Você não tem permissão para acessar esta seção do veículo.', 'error');
                switchVehicleModalTab(fallbackTab);
            }
            return;
        }
        vehicleTabs.forEach(tab => {
            const isTabActive = tab.dataset.tab === activeTabName;
            tab.classList.toggle('hidden', !hasVehicleModalTabAccess(tab.dataset.tab));
            
            // Lógica de estilo (mantida a mesma)
            tab.className = `vehicle-tab whitespace-nowrap py-4 px-1 border-b-2 font-medium text-sm ${isTabActive ? 'text-indigo-600 border-indigo-500' : 'text-gray-500 border-transparent hover:text-gray-700 hover:border-gray-300'}`;
            
            // Esconde todas as seções e mostra a ativa
            const section = document.getElementById(`vehicle-section-${tab.dataset.tab}`);
            if(section) section.classList.toggle('hidden', !isTabActive);
        });
        if (activeTabName === 'saldo') {
            loadVehicleInventories().then(() => {
                renderVehicleSaldo(vehicleSearchInput.value.trim());
            });
        }
    }

    // Adicione esta nova função ao seu script.js
    async function populateConsumablesSelect() {
        const select = document.getElementById('activity-consumables-select');
        if (!select) return;
        select.innerHTML = ''; // Limpa opções antigas

        // --- INÍCIO DA ALTERAÇÃO ---
        // Adiciona a opção de serviço que não tem quantidade e não debita estoque
        const serviceOption = new Option("Visita Técnica / Manutenção (sem uso de material)", "virtual:manutencao");
        select.add(serviceOption);
        // --- FIM DA ALTERAÇÃO ---

        try {
        const result = await DataService.getItensConsumiveis(currentUser.role);
        
        if (result.data && result.data.length > 0) {
            result.data.forEach(item => {
                const displayText = `${item.nome} (Estoque: ${item.quantidadeEstoque})`;
                const consumableValue = `consumable:${item.id}:${item.quantidadeEstoque}`;
                const option = new Option(displayText, consumableValue);
                select.add(option);
            });
        }
        } catch (error) {
        console.error("Erro ao carregar itens de consumo:", error);
        }
    }

    function renderVehicleSaldo(searchTerm = '') {
        vehicleSaldoTableBody.innerHTML = '';
        const term = searchTerm.toLowerCase().trim();
        
        // --- CORREÇÃO DO BUG: RESOLUÇÃO DE MAIÚSCULAS/MINÚSCULAS ---
        // Tenta pegar pelo ID exato do HTML (ex: estoqueAlternativo)
        let items = vehicleInventory[currentVehicle];

        // Se não encontrar, tenta buscar pela versão tudo minúsculo (ex: estoquealternativo)
        // Isso resolve o conflito com o retorno do Banco de Dados
        if (!items && currentVehicle) {
            items = vehicleInventory[currentVehicle.toLowerCase()];
        }
        
        // Se ainda assim não achar, garante um array vazio para não travar a tela
        items = items || [];
        // -----------------------------------------------------------

        if (term) {
            items = items.filter(item =>
                String(item.id).toLowerCase().includes(term) ||
                (item.produto && String(item.produto).toLowerCase().includes(term)) ||
                (item.patrimonio && String(item.patrimonio).toLowerCase().includes(term))
            );
        }
    
        vehicleNoResults.classList.toggle('hidden', items.length > 0);

        // Agrupa itens com patrimônio
        const groupedAssets = items.filter(item => item.patrimonio).reduce((acc, item) => {
            const productId = String(item.id);
            acc[productId] = acc[productId] || { info: item, patrimonios: [] };
            acc[productId].patrimonios.push(item.patrimonio);
            return acc;
        }, {});
    
        // Separa itens consumíveis
        const consumables = items.filter(item => !item.patrimonio);

        // Renderiza os itens com patrimônio
        Object.values(groupedAssets).forEach(group => {
            let patrimonioCellContent = group.patrimonios.join(', ');
            if (group.patrimonios.length > 1) {
                const patrimoniosList = group.patrimonios.map(p => `<div class="p-1">${p}</div>`).join('');
                patrimonioCellContent = `<details><summary class="font-medium text-indigo-600 hover:text-indigo-800">Ver (${group.patrimonios.length})</summary><div class="mt-2 text-left bg-gray-50 p-2 rounded-md shadow-inner">${patrimoniosList}</div></details>`;
            }
            vehicleSaldoTableBody.innerHTML += `<tr>
                <td class="td-style">${group.info.id || 'N/A'}</td>
                <td class="td-style">${group.info.produto || 'N/A'}</td>
                <td class="td-style">${patrimonioCellContent}</td>
                <td class="td-style font-semibold">${group.patrimonios.length}</td>
            </tr>`;
        });

        // Renderiza os itens consumíveis
        consumables.forEach(item => {
            vehicleSaldoTableBody.innerHTML += `<tr class="bg-teal-50">
                <td class="td-style">${item.id || 'N/A'}</td>
                <td class="td-style font-medium">${item.produto || 'N/A'}</td>
                <td class="td-style text-xs italic text-gray-500">Consumível</td>
                <td class="td-style font-semibold">${item.quantidade || '0'}</td>
            </tr>`;
        });
    }

    async function enqueuePendingOperation(operation) {
        const pendingOperations = await localforage.getItem('pendingOperations') || [];
        pendingOperations.push(operation);
        await localforage.setItem('pendingOperations', pendingOperations);
        if ('sync' in navigator) {
            try {
                await navigator.serviceWorker.ready;
                await navigator.serviceWorker.sync.register('sync-pending-operations');
            } catch (error) {
                console.error('Falha ao registrar sync event:', error);
            }
        }
    }

    window.syncPendingOperations = async () => {
        const pendingOperations = await localforage.getItem('pendingOperations') || [];
        if (pendingOperations.length === 0) {
            console.log('Nenhuma operação pendente para sincronizar.');
            return;
        }
        showGlobalLoading('Sincronizando operações pendentes...');
        let successfulOperations = [];
        for (let i = 0; i < pendingOperations.length; i++) {
            const op = pendingOperations[i];
            try {
                const userRoleToSend = currentUser ? currentUser.role : 'OfflineUser';
                await DataService.callApi(op.type, op.payload, userRoleToSend);
                successfulOperations.push(i);
            } catch (error) {
                console.error(`Falha na sincronização da operação ${op.type}:`, error);
                showFeedbackModal('Erro Sincronização', `Falha ao sincronizar uma operação: ${error.message}. Tentaremos novamente mais tarde.`, 'error');
            }
        }
        const newPendingOperations = pendingOperations.filter((_, idx) => !successfulOperations.includes(idx));
        await localforage.setItem('pendingOperations', newPendingOperations);
        hideGlobalLoading();
        if (newPendingOperations.length === 0) {
            showFeedbackModal('Sincronização Completa', 'Todas as operações offline foram sincronizadas com sucesso!', 'success');
        } else {
            showFeedbackModal('Sincronização Parcial', `${successfulOperations.length} operações sincronizadas. ${newPendingOperations.length} falharam.`, 'info');
        }
        const currentPageElement = document.querySelector('main > div:not(.hidden)');
        if (currentPageElement) {
            loadPageData(currentPageElement.id.replace('page-', ''));
        }
    };

    window.addEventListener('online', () => {
        console.log('Online! Tentando sincronizar operações pendentes...');
        window.syncPendingOperations();
    });
    window.addEventListener('offline', () => {
        showFeedbackModal('Modo Offline', 'Você está offline. As operações serão salvas e sincronizadas quando a conexão for reestabelecida.', 'info');
    });

    async function populatePatrimonioSelects() {
        const selectedVehicle = activityVehicleSelect.value;
        const patrimonioSelect = document.getElementById('activity-patrimonio');
        const consumablesSelect = document.getElementById('activity-consumables-select');
        const mobileCheckboxList = patrimonioCheckboxList;

        patrimonioSelect.innerHTML = '';
        mobileCheckboxList.innerHTML = '';

        await populateConsumablesSelect();

        // --- INÍCIO DA ALTERAÇÃO PARA O MOBILE ---
        // Adiciona a opção de serviço também na lista de checkboxes do modal mobile
        if (mobileCheckboxList) {
        const checkboxId = `virtual-service-checkbox-manutencao`;
        mobileCheckboxList.insertAdjacentHTML('afterbegin', `
            <div class="patrimonio-checkbox-item bg-gray-100 border-b border-dashed">
                <input type="checkbox" id="${checkboxId}" value="virtual:manutencao" data-product-name="Visita Técnica / Manutenção">
                <label for="${checkboxId}" class="w-full cursor-pointer font-semibold text-indigo-700">Visita Técnica / Manutenção</label>
            </div>`);
        }
        // --- FIM DA ALTERAÇÃO PARA O MOBILE ---

        if (!selectedVehicle) return;

        const vehicleItems = vehicleInventory[selectedVehicle] || [];
        if (vehicleItems.length === 0 && mobileCheckboxList.children.length <= 1) { // Verifica se só tem o item virtual
        if(patrimonioModalNoResults) patrimonioModalNoResults.classList.remove('hidden');
        return;
        }
        if(patrimonioModalNoResults) patrimonioModalNoResults.classList.add('hidden');

        vehicleItems.forEach(item => {
        const productName = item.produto || 'Produto sem nome';

        if (item.patrimonio) {
            const displayText = `${item.patrimonio} - ${productName}`;
            if (patrimonioSelect) {
                patrimonioSelect.add(new Option(displayText, item.patrimonio));
            }
            if (mobileCheckboxList) {
                const checkboxId = `patrimonio-checkbox-${item.patrimonio}`;
                mobileCheckboxList.insertAdjacentHTML('beforeend', `
                    <div class="patrimonio-checkbox-item">
                        <input type="checkbox" id="${checkboxId}" value="${item.patrimonio}" data-product-name="${productName}">
                        <label for="${checkboxId}" class="w-full cursor-pointer">${displayText}</label>
                    </div>`);
            }
            } else {
            const displayText = `${productName} (Veículo: ${item.quantidade})`;
            const consumableValue = `consumable:${item.id}:${item.quantidade}`;
            if (consumablesSelect) {
                consumablesSelect.add(new Option(displayText, consumableValue));
            }
            if (mobileCheckboxList) {
                const checkboxId = `consumable-checkbox-${item.id}`;
                mobileCheckboxList.insertAdjacentHTML('beforeend', `
                    <div class="patrimonio-checkbox-item bg-teal-50">
                        <input type="checkbox" id="${checkboxId}" value="${consumableValue}" data-product-name="${productName}">
                        <label for="${checkboxId}" class="w-full cursor-pointer">${displayText}</label>
                    </div>`);
            }
            }
        });
    }

    
    function applyStyles() {
        document.querySelectorAll('.th-style').forEach(el => el.className = 'px-6 py-3 text-center text-xs font-medium text-gray-500 uppercase tracking-wider');
        document.querySelectorAll('.td-style').forEach(el => el.className = 'px-6 py-4 whitespace-nowrap text-sm text-gray-500 text-center align-middle');
        document.querySelectorAll('.form-input').forEach(el => el.className = 'mt-1 block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm');
        document.querySelectorAll('.btn-primary').forEach(el => el.className += ' flex justify-center py-2 px-4 border border-transparent rounded-md shadow-sm text-sm font-medium text-white bg-indigo-600 hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500');
        document.querySelectorAll('.btn-primary-small').forEach(el => el.className += ' flex justify-center py-1 px-3 border border-transparent rounded-md shadow-sm text-xs font-medium text-white bg-indigo-600 hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500');
        document.querySelectorAll('.btn-secondary-small').forEach(el => el.className += ' flex justify-center py-1 px-3 border border-gray-300 rounded-md shadow-sm text-xs font-medium text-gray-700 hover:bg-gray-100 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-gray-500');
        document.querySelectorAll('.btn-danger').forEach(el => el.className += ' flex justify-center py-2 px-4 border border-transparent rounded-md shadow-sm text-sm font-medium text-white bg-red-600 hover:bg-red-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-red-500');
        document.querySelectorAll('.btn-secondary').forEach(el => el.className += ' mt-3 w-full inline-flex justify-center rounded-md border border-gray-300 shadow-sm px-4 py-2 bg-white text-base font-medium text-gray-700 hover:bg-gray-50 focus:outline-none sm:mt-0 sm:ml-3 sm:w-auto sm:text-sm');
        document.querySelectorAll('.table-no-results').forEach(el => el.className = 'text-center py-8 text-gray-500');
        document.querySelectorAll('.form-label').forEach(el => el.className = 'block text-sm font-medium text-gray-600');
        document.querySelectorAll('.error-text').forEach(el => el.className = 'text-red-500 text-xs mt-1');
        document.querySelectorAll('.vehicle-card').forEach(el => el.className += ' bg-white p-6 rounded-lg shadow-md text-center cursor-pointer');
        document.querySelectorAll('.activity-card').forEach(el => el.className += ' bg-white p-4 rounded-lg shadow-sm border-l-4 border-indigo-500');
    }

    // --- EVENT LISTENERS ---
    navEstoque.addEventListener('click', (e) => { e.preventDefault(); showPage('estoque'); });
    navVeiculos.addEventListener('click', (e) => { e.preventDefault(); showPage('veiculos'); });
    navMovimentacoes.addEventListener('click', (e) => { e.preventDefault(); showPage('movimentacoes'); });
    navUsuarios.addEventListener('click', (e) => { e.preventDefault(); showPage('usuarios'); });
    navStatus.addEventListener('click', (e) => { e.preventDefault(); showPage('status'); });
    mobileMenuButton.addEventListener('click', toggleMobileMenu);
    mobileNavStatus.addEventListener('click', (e) => { e.preventDefault(); showPage('status'); });
    mobileNavEstoque.addEventListener('click', (e) => { e.preventDefault(); showPage('estoque'); });
    mobileNavVeiculos.addEventListener('click', (e) => { e.preventDefault(); showPage('veiculos'); });
    mobileNavMovimentacoes.addEventListener('click', (e) => { e.preventDefault(); showPage('movimentacoes'); });
    mobileNavUsuarios.addEventListener('click', (e) => { e.preventDefault(); showPage('usuarios'); });
    document.getElementById('logout-button').addEventListener('click', logout);
    document.getElementById('card-buy-items').addEventListener('click', async () => { /* ... */ });
    document.getElementById('card-total-products').addEventListener('click', () => {
    renderProductSummary(); // Chama a nova função para montar o conteúdo
    document.getElementById('product-summary-modal').classList.remove('hidden'); // Mostra o modal
    activityTowerSelect?.addEventListener('change', updateSectorSelect);
    activityVehicleSelect?.addEventListener('change', populatePatrimonioSelects);
    openPatrimonioModalButton?.addEventListener('click', () => {
    const patrimonioSelectModal = document.getElementById('patrimonio-select-modal');
    if (patrimonioSelectModal) {
        patrimonioSelectModal.classList.remove('hidden');
    }
});

});

    document.getElementById('product-summary-close-button').addEventListener('click', () => {
    document.getElementById('product-summary-modal').classList.add('hidden');
});
    document.getElementById('card-vehicle-items').addEventListener('click', async () => { /* ... */ });
    document.getElementById('card-active-users').addEventListener('click', async () => { /* ... */ });
    document.getElementById('card-rectification-items').addEventListener('click', async () => { /* ... */ });

    
    genericModalCloseButton.addEventListener('click', hideInfoModal);
    stockTabs.forEach(tab => tab.addEventListener('click', () => switchStockTab(tab.id.replace('tab-',''))));
    userTabs.forEach(tab => tab.addEventListener('click', function() { switchUserTab(this.id.replace('tab-','')); }));
    stockSearchInput.addEventListener('keyup', (e) => renderStockView(e.target.value));
    modalCloseButton.addEventListener('click', hideFeedbackModal);
    // ADICIONE ESTE NOVO LISTENER NO FINAL DO SEU SCRIPT.JS
// Adicione este listener para o formulário de cadastro de clientes
    clientRegistrationForm?.addEventListener('submit', async (e) => {
    e.preventDefault(); // Impede o recarregamento da página

    // Pega os dados dos campos do formulário
    const payload = {
        name: document.getElementById('client-name').value.trim(),
        tower: document.getElementById('client-tower').value.trim(),
        sector: document.getElementById('client-sector').value.trim()
    };

    // Validação simples para garantir que o nome foi preenchido
    if (!payload.name) {
        showFeedbackModal('Erro', 'O nome do cliente é obrigatório.', 'error');
        return;
    }

    showGlobalLoading('Cadastrando cliente...');

    try {
        // Usa a função do DataService que já existe para chamar a API
        const result = await DataService.addClient(payload, currentUser.role);
        
        hideGlobalLoading();
        showFeedbackModal('Sucesso!', result.message, 'success');
        
        // Limpa o formulário e atualiza a lista de clientes em segundo plano
        clientRegistrationForm.reset();
        await loadClients(); 

    } catch (error) {
        hideGlobalLoading();
        showFeedbackModal('Erro no Cadastro', error.message, 'error');
    }
});
// --- LÓGICA COMPLETA E CORRIGIDA PARA O MODAL DE CLIENTES (COM CARREGAMENTO DE DADOS) ---

// Função central que CARREGA OS DADOS e depois abre o modal
async function openClientManagementModal() {
    showGlobalLoading('Carregando dados dos clientes...');
    try {
        // Garante que os dados mais recentes sejam buscados do servidor
        await Promise.all([loadClients(), loadClientActivities()]);
        
        // =================================================================
        // ===== LÓGICA DE PERMISSÃO DA ABA (APLICADA NA ABERTURA) =====
        // =================================================================
        const tabStatusCliente = document.getElementById('tab-client-status');
        if (tabStatusCliente) {
            if (currentUser.role !== 'Desenvolvedor') {
                // Este método é mais forte e não é sobrescrito pela mudança de classes
                tabStatusCliente.style.display = 'none';
            } else {
                // Garante que o estilo seja revertido para o padrão se for Desenvolvedor
                tabStatusCliente.style.display = ''; // ou 'inline-block' se necessário
            }
        }
        // =================================================================
        
        // Define a aba de cadastro como padrão, que sempre é visível
        switchClientTab('client-registration');
        
        // Exibe o modal, agora com a permissão já aplicada
        const clientModal = document.getElementById('client-modal');
        if (clientModal) {
            clientModal.classList.remove('hidden');
        }
    } catch (error) {
        showFeedbackModal('Erro', `Não foi possível carregar os dados dos clientes: ${error.message}`, 'error');
    } finally {
        hideGlobalLoading();
    }
}

// 1. Listener para o CARD "Gerenciar Clientes" na página inicial
document.getElementById('card-manage-clients')?.addEventListener('click', openClientManagementModal);

// 2. Listener para o BOTÃO "Gerenciar Clientes" que fica na página de estoque
document.getElementById('open-client-modal-button')?.addEventListener('click', openClientManagementModal);

// 3. Listener para o NOVO botão na página de Usuários (ADICIONE ESTA LINHA)
document.getElementById('usuarios-page-manage-clients-button')?.addEventListener('click', openClientManagementModal);
// 4. Listener para o BOTÃO DE FECHAR (X) do modal de clientes
document.getElementById('client-modal-close-button')?.addEventListener('click', () => {
    const clientModal = document.getElementById('client-modal');
    if (clientModal) {
        clientModal.classList.add('hidden');
    }
});

// 5. Listener para as ABAS 'Cadastro' e 'Status'
document.querySelectorAll('.client-tab').forEach(tab => {
    tab.addEventListener('click', function() {
        const tabName = this.id.replace('tab-', '');
        switchClientTab(tabName);
    });
});

// --- FIM DO BLOCO DE CÓDIGO ---
    
    // VERSÃO DE DEPURAÇÃO: Listener para preencher automaticamente os dados do produto
    stockProdutoIdInput.addEventListener('blur', () => { 
    const productId = stockProdutoIdInput.value.trim();

    // Se o campo de ID estiver vazio, reseta tudo para o estado inicial
    if (!productId) {
        stockProdutoNomeInput.value = '';
        stockProdutoEnderecoInput.value = '';
        stockProdutoNomeInput.readOnly = false;
        macAddressGroup.classList.add('hidden');
        macAddressInput.value = '';
        return;
    }

    // Procura na lista MESTRA de produtos ('products')
    const productDefinition = products.find(p => String(p.id).trim() === String(productId));

    if (productDefinition) {
        // Se a DEFINIÇÃO do produto existe, preenche e trava o nome
        stockProdutoNomeInput.value = productDefinition.nome;
        stockProdutoNomeInput.readOnly = true;

        // =========================================================
        // MUDANÇA 2: Lógica condicional para o endereço
        // =========================================================
        // Agora, busca por um item FÍSICO no estoque principal para pegar o endereço
        const existingItemInStock = mainInventory.find(item => String(item.id).trim() === String(productId));

        if (existingItemInStock) {
            // Se há estoque, preenche o endereço do primeiro item encontrado
            stockProdutoEnderecoInput.value = existingItemInStock.endereco;
        } else {
            // Se não há estoque (zerado), deixa o campo de endereço vazio para ser preenchido
            stockProdutoEnderecoInput.value = '';
        }
        // =========================================================

        // Lógica do MAC Address que já existia
        if (productDefinition.nome.trim().toLowerCase() === 'roteador') {
            macAddressGroup.classList.remove('hidden');
        } else {
            macAddressGroup.classList.add('hidden');
            macAddressInput.value = '';
        }
        
        // Move o foco para o próximo campo importante
        stockProdutoPatrimonioInput.focus();

    } else {
        // Se é um produto realmente novo, limpa tudo e permite a digitação
        stockProdutoNomeInput.value = '';
        stockProdutoNomeInput.readOnly = false;
        stockProdutoEnderecoInput.value = '';
        stockProdutoNomeInput.focus();
    }
});

    stockForm.addEventListener('submit', async (e) => {
    e.preventDefault(); // Impede o recarregamento da página

    const produtoId = stockProdutoIdInput.value.trim();
    const produtoNome = stockProdutoNomeInput.value.trim();
    const endereco = stockProdutoEnderecoInput.value.trim();
    const patrimonio = stockProdutoPatrimonioInput.value.trim();

    if (!produtoId || !produtoNome || !endereco || !patrimonio) {
        showFeedbackModal('Erro de Validação', 'Todos os campos são obrigatórios para o cadastro.', 'error');
        return;
    }

    // Payload para a ação de adicionar o item
    const payload = {
    id: produtoId,
    produto_nome: produtoNome,
    endereco: endereco,
    patrimonio: patrimonio,
    vehicleName: currentVehicle,
    mac_address: document.getElementById('stock-mac-address').value.trim() // <-- LINHA ADICIONADA
};

    showGlobalLoading('Cadastrando item...');

    try {
        // Verifica se a definição do produto (ex: ID 1 = "Antena") já existe
        const productExists = products.some(p => p.id === produtoId);

        // Se não existir na lista local, cria a definição do produto primeiro no banco
        if (!productExists) {
            await DataService.addProductDefinition({ id: produtoId, name: produtoNome, safetyStock: 0 }, currentUser.role);
            // Atualiza a lista local de produtos após adicionar
            await loadProducts(); 
        }

        // Em seguida, adiciona o item ao inventário
        const result = await DataService.addInventoryItem(payload, currentUser.role);

        hideGlobalLoading();
        // LINHA NOVA
showFeedbackModal('Sucesso!', result.message, 'success', () => {
    stockProdutoIdInput.focus();
});

        // Limpa o formulário e recarrega a visão do estoque para mostrar o novo item
        stockForm.reset();
        stockProdutoNomeInput.readOnly = false;
        stockProdutoEnderecoInput.readOnly = false;
        await loadInventory();
        renderStockView(); // Atualiza a tabela na aba "Saldo"

    } catch (error) {
        hideGlobalLoading();
        showFeedbackModal('Erro no Cadastro', error.message, 'error');
    }
});
    vehicleCards.forEach(card => card.addEventListener('click', () => openVehicleModal(card.dataset.vehicle, card.dataset.vehicleName)));
    vehicleModalCloseButton.addEventListener('click', closeVehicleModal);
    vehicleTabs.forEach(tab => tab.addEventListener('click', () => switchVehicleModalTab(tab.dataset.tab)));
    vehicleSearchInput.addEventListener('keyup', (e) => renderVehicleSaldo(e.target.value));
    // Listener para preencher automaticamente os dados no modal de adicionar item ao veículo
    addProdutoIdInput.addEventListener('input', async () => {
    const productId = addProdutoIdInput.value.trim();

    // Limpa os campos de resultado anteriores
    addProdutoNomeInput.value = '';
    addProdutoPatrimonioSelect.innerHTML = '';
    addIdNotFoundError.classList.add('hidden');

    if (!productId) {
        return; // Se o campo estiver vazio, não faz nada
    }

    // Filtra o inventário principal para encontrar todos os itens com o ID digitado
    // A busca é feita no 'mainInventory', que é o seu "Saldo do Estoque"
    const availableItems = mainInventory.filter(item => String(item.id) === String(productId));

    if (availableItems.length > 0) {
        // Se encontrou itens...
        // Esconde a mensagem de erro
        addIdNotFoundError.classList.add('hidden');

        // Preenche o nome do produto (pegando do primeiro item encontrado)
        addProdutoNomeInput.value = availableItems[0].produto;

        // Preenche a lista de seleção de Patrimônio com todos os itens disponíveis
        availableItems.forEach(item => {
            const option = document.createElement('option');
            option.value = item.patrimonio;
            option.textContent = item.patrimonio;
            addProdutoPatrimonioSelect.appendChild(option);
        });

    } else {
        // Se não encontrou nenhum item com aquele ID no estoque principal...
        // Mostra a mensagem de erro
        addIdNotFoundError.classList.remove('hidden');
    }
});
    vehicleAddForm.addEventListener('submit', async (e) => {
        e.preventDefault(); // Impede o recarregamento da página
        console.clear();
        console.log("--- DEBUG: Início do Envio do Formulário ---");

        const patrimonio = addProdutoPatrimonioSelect.value;
        console.log("1. Patrimônio selecionado:", patrimonio);

        if (!patrimonio) {
            showFeedbackModal('Erro', 'Por favor, selecione um patrimônio para adicionar.', 'error');
            return;
        }

        // VAMOS INSPECIONAR AS VARIÁVEIS IMPORTANTES
        console.log("2. Chave do veículo que estamos usando (currentVehicle):", currentVehicle);
        console.log("3. Objeto completo do inventário de veículos (vehicleInventory):", JSON.parse(JSON.stringify(vehicleInventory)));

        // Bloco Novo e à Prova de Falhas
let targetInventoryArray = vehicleInventory[currentVehicle];
console.log("4. Tentativa 1 - Array de destino (Case-Sensitive):", targetInventoryArray);

// Verificação de segurança para ser resiliente a erros de case
if (typeof targetInventoryArray === 'undefined' && currentVehicle.toLowerCase() in vehicleInventory) {
    console.warn("AVISO: Fallback de case-insensitivity ativado. A chave no backend pode estar com a capitalização errada.");
    targetInventoryArray = vehicleInventory[currentVehicle.toLowerCase()];
}

console.log("5. Array de destino final encontrado:", targetInventoryArray);

// Verificação de segurança final
if (typeof targetInventoryArray === 'undefined') {
    console.error(`ERRO GRAVE: O array para o veículo '${currentVehicle}' continua 'undefined' mesmo após o fallback.`);
    showFeedbackModal('Erro Crítico', `O inventário para o veículo '${currentVehicle}' não foi encontrado.`, 'error');
    return;
}
        
        const payload = {
            patrimonio: patrimonio,
            vehicleName: currentVehicle
        };

        showGlobalLoading('Movendo item...');

        try {
            const result = await DataService.addItemToVehicle(payload, currentUser.role);
            await logTransaction('Adicionado ao Veículo', patrimonio, 'Estoque Principal', currentVehicleName);
            
            hideGlobalLoading();
            showFeedbackModal('Sucesso!', result.message, 'success');

            const itemIndex = mainInventory.findIndex(item => item.patrimonio === patrimonio);
            if (itemIndex > -1) {
                const [movedItem] = mainInventory.splice(itemIndex, 1);
                // A linha corrigida:
                targetInventoryArray.push(movedItem);
                
                await saveDataToStorage('mainInventory', mainInventory);
                await saveDataToStorage(`vehicleInventory_${currentVehicle}`, targetInventoryArray);
            }

            vehicleAddForm.reset();
            addProdutoNomeInput.value = '';
            addProdutoPatrimonioSelect.innerHTML = '';
            renderStockView();
            renderVehicleSaldo(); // Re-renderiza o saldo do veículo

        } catch (error) {
            hideGlobalLoading();
            showFeedbackModal('Erro na Operação', error.message, 'error');
        }
    });
    // Listener para o autocomplete do formulário de RETIRADA
if (removeProdutoIdInput) {
    removeProdutoIdInput.addEventListener('input', async () => {
        const productId = removeProdutoIdInput.value.trim();
        removeProdutoNomeInput.value = '';
        removeProdutoPatrimonioSelect.innerHTML = '';
        removeIdNotFoundError.classList.add('hidden');

        if (!productId) return;

        // --- SEGURANÇA: Tenta o nome original, se falhar, tenta minúsculo ---
        let sourceInventory = vehicleInventory[currentVehicle]; 
        if (!sourceInventory && currentVehicle) {
            sourceInventory = vehicleInventory[currentVehicle.toLowerCase()];
        }
        sourceInventory = sourceInventory || []; 
        // -------------------------------------------------------------------

        // A busca agora é feita na lista corrigida
        const availableItems = sourceInventory.filter(item => String(item.id) === String(productId));

        if (availableItems.length > 0) {
            removeProdutoNomeInput.value = availableItems[0].produto;
            availableItems.forEach(item => {
                const option = new Option(item.patrimonio, item.patrimonio);
                removeProdutoPatrimonioSelect.add(option);
            });
        } else {
            removeIdNotFoundError.classList.remove('hidden');
        }
    });
}

// Listener para o envio do formulário de RETIRADA
vehicleRemoveForm.addEventListener('submit', async (e) => {
    e.preventDefault();
    const patrimonio = removeProdutoPatrimonioSelect.value;
    if (!patrimonio) {
        showFeedbackModal('Erro', 'Por favor, selecione um patrimônio para retirar.', 'error');
        return;
    }

    const payload = { patrimonio, vehicleName: currentVehicle };
    showGlobalLoading('Retirando item do veículo...');

    try {
        const result = await DataService.removeItemFromVehicle(payload, currentUser.role);
        
        await logTransaction('Retirado do Veículo', patrimonio, currentVehicleName, 'Redirecionamento');

        hideGlobalLoading();
        showFeedbackModal('Sucesso!', result.message, 'success');

        // Atualiza o estado local
        const vehicleInv = vehicleInventory[currentVehicle];
        const itemIndex = vehicleInv.findIndex(item => item.patrimonio === patrimonio);
        if (itemIndex > -1) {
            const [movedItem] = vehicleInv.splice(itemIndex, 1);
            movedItem.removedFrom = currentVehicleName; // Adiciona a origem
            redirectInventory.push(movedItem);
            await saveDataToStorage(`vehicleInventory_${currentVehicle}`, vehicleInv);
            await saveDataToStorage('redirectInventory', redirectInventory);
        }

        vehicleRemoveForm.reset();
        removeProdutoNomeInput.value = '';
        removeProdutoPatrimonioSelect.innerHTML = '';
        renderVehicleSaldo(); // Atualiza a tabela de saldo do veículo
        renderRedirectView(); // Atualiza a tabela de redirecionamento

    } catch (error) {
        hideGlobalLoading();
        showFeedbackModal('Erro na Operação', error.message, 'error');
    }
});

// =======================================================================
// ===== LÓGICA DA ABA RETÍFICA (Cole aqui) =====
// =======================================================================

// Listener para o autocomplete do formulário de RETÍFICA (NOVO)
if (typeof rectifyProdutoIdInput !== 'undefined' && rectifyProdutoIdInput) {
    rectifyProdutoIdInput.addEventListener('input', async () => {
        const productId = rectifyProdutoIdInput.value.trim();
        if(rectifyProdutoNomeInput) rectifyProdutoNomeInput.value = '';
        if(rectifyProdutoPatrimonioSelect) rectifyProdutoPatrimonioSelect.innerHTML = '';
        if(rectifyIdNotFoundError) rectifyIdNotFoundError.classList.add('hidden');

        if (!productId) return;

        // --- SEGURANÇA: Tenta o nome original, se falhar, tenta minúsculo ---
        let sourceInventory = vehicleInventory[currentVehicle];
        if (!sourceInventory && currentVehicle) {
            sourceInventory = vehicleInventory[currentVehicle.toLowerCase()];
        }
        sourceInventory = sourceInventory || []; 
        // -------------------------------------------------------------------

        const availableItems = sourceInventory.filter(item => String(item.id) === String(productId));

        if (availableItems.length > 0) {
            if(rectifyProdutoNomeInput) rectifyProdutoNomeInput.value = availableItems[0].produto;
            
            if(rectifyProdutoPatrimonioSelect) {
                availableItems.forEach(item => {
                    if (item.patrimonio) { 
                        const option = new Option(item.patrimonio, item.patrimonio);
                        rectifyProdutoPatrimonioSelect.add(option);
                    }
                });
                
                // Aviso se só tiver consumíveis (opcional)
                if (rectifyProdutoPatrimonioSelect.options.length === 0 && rectifyProdutoNomeInput) {
                     rectifyProdutoNomeInput.value = "Apenas itens consumíveis encontrados (não retificáveis)";
                }
            }

        } else {
            if(rectifyIdNotFoundError) rectifyIdNotFoundError.classList.remove('hidden');
        }
    });
}

// Listener para o envio do formulário de RETÍFICA DIRETA
if (typeof vehicleRectifyForm !== 'undefined' && vehicleRectifyForm) {
    vehicleRectifyForm.addEventListener('submit', async (e) => {
        e.preventDefault();
        const patrimonio = rectifyProdutoPatrimonioSelect.value;
        
        if (!patrimonio) {
            showFeedbackModal('Erro', 'Selecione um patrimônio para enviar à retífica.', 'error');
            return;
        }

        // Payload para remover do carro
        const removePayload = { patrimonio, vehicleName: currentVehicle };
        
        // Payload para adicionar na retífica
        const rectifyPayload = { patrimonio }; 

        showGlobalLoading('Processando envio para retífica...');

        try {
            // PASSO 1: Retira do Veículo
            await DataService.removeItemFromVehicle(removePayload, currentUser.role);
            
            // PASSO 2: Envia para Retífica
            const result = await DataService.addItemToRectification(rectifyPayload, currentUser.role);

            await logTransaction('Direto p/ Retífica', patrimonio, currentVehicleName, 'Retífica');

            hideGlobalLoading();
            showFeedbackModal('Sucesso!', 'Item enviado para retífica com sucesso!', 'success');

            // ATUALIZAÇÃO LOCAL
            const vehicleInv = vehicleInventory[currentVehicle];
            const itemIndex = vehicleInv.findIndex(item => item.patrimonio === patrimonio);
            
            if (itemIndex > -1) {
                const [movedItem] = vehicleInv.splice(itemIndex, 1);
                movedItem.removedFrom = currentVehicleName; 
                
                // Adiciona na lista local de retífica
                rectificationItems.push(movedItem);
                
                // Salva nos caches
                await saveDataToStorage(`vehicleInventory_${currentVehicle}`, vehicleInv);
                await saveDataToStorage('rectificationItems', rectificationItems);
            }

            // Limpa o formulário
            vehicleRectifyForm.reset();
            rectifyProdutoPatrimonioSelect.innerHTML = '';
            
            // Se tiver aba de retífica aberta em outro lugar, atualiza
            renderRectificationView();

        } catch (error) {
            hideGlobalLoading();
            console.error(error);
            showFeedbackModal('Erro', 'Falha ao processar. O item pode ter sido removido mas não chegou na retífica.', 'error');
        }
    });
}

    vehicleRemoveForm.addEventListener('submit', async (e) => { /* ... */ });
    redirectTableBody.addEventListener('click', async (e) => { /* ... */ });
    document.addEventListener('click', (e) => { /* ... */ });
    sectionRectification.addEventListener('click', async (e) => { /* ... */ });
    userForm.addEventListener('submit', async (e) => {
    e.preventDefault();
    const payload = {
        name: userNameInput.value.trim(),
        email: userEmailInput.value.trim(),
        password: userPasswordInput.value.trim(),
        role: userRoleInput.value
    };

    if (!payload.name || !payload.email || !payload.password) {
        showFeedbackModal('Erro', 'Nome, e-mail e senha são obrigatórios.', 'error');
        return;
    }

    showGlobalLoading('Cadastrando usuário...');
    try {
        const result = await DataService.addUser(payload, currentUser.role);
        hideGlobalLoading();
        showFeedbackModal('Sucesso!', result.message, 'success');
        userForm.reset();
        await loadUsers(); // Recarrega a lista de usuários
        renderUserView(); // Re-renderiza a tabela
    } catch (error) {
        hideGlobalLoading();
        showFeedbackModal('Erro no Cadastro', error.message, 'error');
    }
});

    // Versão CORRIGIDA
redirectTableBody.addEventListener('click', async (e) => {
    // Parte 1: Abrir e fechar o menu dropdown (não muda)
    const dropdownButton = e.target.closest('.action-dropdown-button');
    if (dropdownButton) {
        e.preventDefault();
        const menu = dropdownButton.nextElementSibling;
        document.querySelectorAll('.action-dropdown-menu').forEach(m => {
            if (m !== menu) m.classList.add('hidden');
        });
        menu.classList.toggle('hidden');
        return;
    }

    // Parte 2: Lidar com o clique em uma das opções do menu
    const option = e.target.closest('.redirect-option, .send-to-rectification-option');
    if (option) {
        e.preventDefault();
        const patrimonio = option.dataset.patrimonioId;
        let payload = { patrimonio };

        // --- LÓGICA DE INTERCEPTAÇÃO ADICIONADA AQUI ---
        if (option.classList.contains('redirect-option')) {
            const destination = option.dataset.destination;
            payload.destination = destination;

            // SE o destino for o estoque principal, PEÇA O ENDEREÇO
            if (destination === 'mainInventory') {
                const newAddress = prompt("Por favor, digite o novo endereço de armazenagem para este item:");
                if (!newAddress || newAddress.trim() === '') {
                    alert('Operação cancelada. O endereço é obrigatório.');
                    return; // Para a execução se o usuário cancelar ou não digitar nada
                }
                payload.endereco = newAddress.trim(); // Adiciona o endereço ao payload
            }
        }
        // --- FIM DA LÓGICA DE INTERCEPTAÇÃO ---

        showGlobalLoading('Processando redirecionamento...');

        try {
            let successMessage = '';
            if (option.classList.contains('redirect-option')) {
                const result = await DataService.redirectItem(payload, currentUser.role);
                successMessage = result.message;
                await logTransaction('Redirecionado', patrimonio, 'Redirecionamento', payload.destination);
            } else if (option.classList.contains('send-to-rectification-option')) {
                const result = await DataService.addItemToRectification(payload, currentUser.role);
                successMessage = result.message;
                await logTransaction('Enviado p/ Retífica', patrimonio, 'Redirecionamento', 'Retífica');
            }

            hideGlobalLoading();
            showFeedbackModal('Sucesso!', successMessage, 'success');

            // --- A MÁGICA DA VELOCIDADE AQUI ---
            // Removemos o item da lista local instantaneamente em vez de baixar TUDO do banco de novo
            redirectInventory = redirectInventory.filter(item => String(item.patrimonio) !== String(patrimonio));
            await saveDataToStorage('redirectInventory', redirectInventory);
            
            // Re-renderiza APENAS a tabela que estamos vendo. Ela atualizará em 1 milissegundo.
            renderRedirectView(document.getElementById('redirect-search-input')?.value || '');

        } catch (error) {
            hideGlobalLoading();
            showFeedbackModal('Erro na Operação', error.message, 'error');
        }
    }
});

    // Adiciona um listener para fechar o menu se clicar fora
    document.addEventListener('click', (e) => {
        if (!e.target.closest('.action-dropdown-button')) {
            document.querySelectorAll('.action-dropdown-menu').forEach(m => m.classList.add('hidden'));
        }
    });
    activityVehicleSelect.addEventListener('change', populatePatrimonioSelects);
    openPatrimonioModalButton.addEventListener('click', () => {
    const patrimonioSelectModal = document.getElementById('patrimonio-select-modal');
    if (patrimonioSelectModal) {
        patrimonioSelectModal.classList.remove('hidden');
    }
});
    openPatrimonioModalButton.addEventListener('click', () => {
    // A lista já foi populada quando você selecionou o veículo.
    // A única tarefa deste botão é MOSTRAR o modal.
    const patrimonioSelectModal = document.getElementById('patrimonio-select-modal');
    if (patrimonioSelectModal) {
        patrimonioSelectModal.classList.remove('hidden');
    }
});
    closePatrimonioModalButton.addEventListener('click', () => { /* ... */ });
    confirmPatrimonioSelectionButton.addEventListener('click', () => {
    const selectedCheckboxes = patrimonioCheckboxList.querySelectorAll('input[type="checkbox"]:checked');
    
    let displayNames = [];
    let values = [];

    selectedCheckboxes.forEach(checkbox => {
        // Usa o atributo 'data-product-name' que definimos para todos os itens
        const productName = checkbox.dataset.productName; 
        
        // Adiciona o nome do produto à lista de exibição
        displayNames.push(productName);
        
        // Adiciona o valor (seja patrimônio ou o ID do consumível) à lista de valores
        values.push(checkbox.value);
    });

    if (displayNames.length > 0) {
        activityPatrimonioDisplay.value = displayNames.join(', ');
        activityPatrimonioValues.value = values.join(',');
    } else {
        activityPatrimonioDisplay.value = 'Nenhum item selecionado';
        activityPatrimonioValues.value = '';
    }

    patrimonioSelectModal.classList.add('hidden');
});
    // Listener para a busca de clientes no formulário de atividade
activityClientInput.addEventListener('keyup', () => {
    const searchTerm = activityClientInput.value.toLowerCase().trim();
    clientSuggestionsContainer.innerHTML = ''; // Limpa sugestões anteriores

    if (searchTerm.length < 2) { // Só busca a partir de 2 caracteres
        clientSuggestionsContainer.classList.add('hidden');
        return;
    }

    // Filtra a lista de clientes com base no que foi digitado
    const filteredClients = clientList.filter(client => 
        client.name.toLowerCase().includes(searchTerm)
    );

    if (filteredClients.length > 0) {
        // Se encontrou clientes, mostra a caixa de sugestões
        clientSuggestionsContainer.classList.remove('hidden');

        // Cria um item de lista para cada cliente encontrado
        filteredClients.forEach(client => {
            const suggestionItem = document.createElement('div');
            suggestionItem.className = 'p-2 hover:bg-indigo-100 cursor-pointer';
            suggestionItem.textContent = client.name;

            // Adiciona um evento de clique para preencher o campo ao selecionar
            suggestionItem.addEventListener('click', () => {
                activityClientInput.value = client.name;
                // Se a tabela de clientes tiver as colunas 'tower' e 'sector', podemos preenchê-las também
                // Exemplo:
                // activityTowerInput.value = client.tower || '';
                // activitySectorInput.value = client.sector || '';
                clientSuggestionsContainer.classList.add('hidden');
            });

            clientSuggestionsContainer.appendChild(suggestionItem);
        });
    } else {
        // Se não encontrou, esconde a caixa
        clientSuggestionsContainer.classList.add('hidden');
    }
});
    // ACHE ESTE EVENT LISTENER NO SEU SCRIPT.JS E SUBSTITUA-O INTEIRAMENTE POR ESTE BLOCO:
clientActivityForm.addEventListener('submit', async (e) => {
    e.preventDefault();

    const clientNameInput = document.getElementById('activity-client').value.trim();
    if (!clientNameInput) {
        showFeedbackModal('Erro', 'O campo "Cliente" é obrigatório.', 'error');
        return;
    }
    const foundClient = clientList.find(c => c.name === clientNameInput);
    if (!foundClient) {
        showFeedbackModal('Erro', 'Cliente inválido. Selecione um cliente da lista de sugestões.', 'error');
        return;
    }

    // ================================================================
    // ===== INÍCIO DA CORREÇÃO FINAL =====
    // ================================================================

    // 1. Pega as opções selecionadas dos DOIS selects de desktop (Patrimônio e Consumíveis)
    const patrimonioSelectedOptions = Array.from(document.getElementById('activity-patrimonio').selectedOptions);
    
    // AQUI ESTAVA O ERRO CRÍTICO, AGORA CORRIGIDO PARA OLHAR PARA O CAMPO CERTO
    const consumablesSelectedOptions = Array.from(document.getElementById('activity-consumables-select').selectedOptions);
    
    // Pega os checkboxes selecionados da visão mobile
    const mobileSelectedCheckboxes = Array.from(patrimonioCheckboxList.querySelectorAll('input:checked'));

    // Junta TUDO em uma única lista de elementos para processar de uma só vez
    const allSelectedElements = [...new Map(
        [...patrimonioSelectedOptions, ...consumablesSelectedOptions, ...mobileSelectedCheckboxes].map(el => [el.value, el])
    ).values()];


    if (allSelectedElements.length === 0) {
        showFeedbackModal('Erro', 'Pelo menos um item (com patrimônio ou consumível) deve ser selecionado.', 'error');
        return;
    }
    
    // 2. Filtra os itens com patrimônio
    const patrimoniosUsados = allSelectedElements
        .filter(el => !el.value.startsWith('consumable:'))
        .map(el => el.value);

    // 3. Filtra apenas os consumíveis QUE NÃO SÃO CABO
    const consumiveisNormais = allSelectedElements.filter(el => {
        const isConsumable = el.value.startsWith('consumable:');
        const isCable = (el.textContent || el.dataset.productName || '').toLowerCase().includes('cabo');
        return isConsumable && !isCable;
    });

    // 4. Pede a quantidade APENAS para os consumíveis normais
    const consumiveisUsados = consumiveisNormais.map(el => {
        const [_, id, total] = el.value.split(':');
        const productName = (el.textContent || el.dataset.productName).split(' (Estoque:')[0];
        const quantidadeStr = prompt(`Quantas unidades de "${productName}" foram usadas? (Disponível no veículo: ${total})`);
        if (quantidadeStr === null) return null;
        const quantidadeUsada = parseInt(quantidadeStr, 10);
        if (isNaN(quantidadeUsada) || quantidadeUsada <= 0 || quantidadeUsada > parseInt(total, 10)) {
            showToast(`Quantidade inválida para "${productName}". Item não debitado.`, 'error');
            return null;
        }
        return { id: id, quantidade: quantidadeUsada };
    }).filter(Boolean);

    // ================================================================
    // ===== FIM DA CORREÇÃO FINAL ====================================
    // ================================================================

    const otherSelectedUsers = Array.from(activityOtherUsersSelect.selectedOptions).map(opt => opt.textContent);
    const allExecutors = [currentUser.name, ...otherSelectedUsers].join(', ');

    const payload = {
    clientId: foundClient.id,
    clientName: clientNameInput,
    userName: allExecutors,
    patrimonio: patrimoniosUsados.join(', '),
    reason: document.getElementById('activity-reason').value,
    tower: activityTowerSelect.value,
    sector: activitySectorSelect.value,
    consumables: JSON.stringify(consumiveisUsados),
    vehicleName: activityVehicleSelect.value,
    metragem_cabo: document.getElementById('activity-cable-length').value || 0,
    tipo_local: document.getElementById('activity-location-type').value
};

// Adiciona a flag de cobrança ao payload APENAS SE a caixa estiver marcada
if (document.getElementById('activity-charge-cable').checked) {
    payload.cobrar_cabo = '1';
}
    
    // Adicionei o console.log aqui para que você possa verificar o resultado final antes do envio
    console.log("DEBUG FINAL: Payload que será enviado:", payload);

    if (patrimoniosUsados.length === 0 && consumiveisUsados.length === 0 && payload.metragem_cabo <= 0) {
        showFeedbackModal('Erro', 'Nenhum item, consumível ou metragem de cabo foi efetivamente registrado. A atividade não foi salva.', 'error');
        return;
    }


    if (locationTypeSelect.required && !locationTypeSelect.value) {
        showFeedbackModal('Erro de Validação', 'Por favor, selecione o tipo de local (Urbana ou Rural).', 'error');
        return; // Impede o envio do formulário
    }

    showGlobalLoading('Registrando atividade...');

    try {
        const result = await DataService.addClientActivity(payload, currentUser.role);
        hideGlobalLoading();
        showFeedbackModal('Sucesso!', result.message, 'success');

        clientActivityForm.reset();
        activityPatrimonioDisplay.value = 'Nenhum item selecionado';
        activityPatrimonioValues.value = '';
        activitySectorSelect.disabled = true;

        await Promise.all([
            loadClientActivities(),
            loadVehicleInventories(),
        ]);
        
        populatePatrimonioSelects();

    } catch (error) {
        hideGlobalLoading();
        showFeedbackModal('Erro no Registro', error.message, 'error');
    }
});

// COLE ESTE BLOCO DE CÓDIGO INTEIRO DENTRO DO SEU SCRIPT.JS

// Esta função popula o dropdown de Torres
    function populateTowerSelect() {
        if (!activityTowerSelect) return;
        const selectedValue = activityTowerSelect.value;
        activityTowerSelect.innerHTML = ''; 
        activityTowerSelect.add(new Option('Selecione uma Torre', ''));
        if (towersData && towersData.length > 0) {
            towersData.forEach(torre => {
                activityTowerSelect.add(new Option(torre.nome, torre.nome));
            });
        }
        activityTowerSelect.value = selectedValue;
        updateSectorSelect();
    }

    function updateSectorSelect() {
        if (!activityTowerSelect || !activitySectorSelect) return;
        const selectedTowerName = activityTowerSelect.value;
        activitySectorSelect.innerHTML = '';
        activitySectorSelect.disabled = true;

        if (selectedTowerName) {
            const selectedTower = towersData.find(t => t.nome === selectedTowerName);
            if (selectedTower && selectedTower.setores && Array.isArray(selectedTower.setores) && selectedTower.setores.length > 0) {
                activitySectorSelect.add(new Option('Selecione um Setor', ''));
                selectedTower.setores.forEach(setor => {
                    activitySectorSelect.add(new Option(setor.nome, setor.nome));
                });
                activitySectorSelect.disabled = false;
            } else {
                activitySectorSelect.add(new Option('Nenhum setor nesta torre', ''));
            }
        } else {
            activitySectorSelect.add(new Option('Selecione uma torre primeiro', ''));
        }
    }

    function switchUserTab(activeTabName) {
        if (!hasUserTabAccess(activeTabName)) {
            activeTabName = getDefaultUserTab();
        }

        userTabs.forEach(tab => {
            const isTabActive = tab.id === `tab-${activeTabName}`;
            tab.className = `user-tab whitespace-nowrap py-4 px-1 border-b-2 font-medium text-sm ${isTabActive ? 'text-indigo-600 border-indigo-500' : 'text-gray-500 border-transparent hover:text-gray-700 hover:border-gray-300'}`;
        });

        document.getElementById('section-user-list').classList.toggle('hidden', activeTabName !== 'user-list');
        document.getElementById('section-client-activity').classList.toggle('hidden', activeTabName !== 'client-activity');
        document.getElementById('section-rectification').classList.toggle('hidden', activeTabName !== 'rectification');

        if (activeTabName === 'client-activity') {
            activityDateInput.value = new Date().toLocaleDateString('pt-BR');
            if (currentUser) {
                activityCurrentUserName.value = currentUser.name;
                activityCurrentUserId.value = currentUser.id;
            }

            activityOtherUsersSelect.innerHTML = ''; 
            const otherUsers = userList.filter(user => 
                String(user.id) !== String(currentUser.id) && 
                user.role !== 'Desenvolvedor'
            );
            otherUsers.forEach(user => {
                activityOtherUsersSelect.add(new Option(user.name, user.id));
            });
            
            populatePatrimonioSelects();
            populateConsumablesSelect();
            populateTowerSelect();
        } else if (activeTabName === 'user-list') {
            renderUserView();
        } else if (activeTabName === 'rectification') {
            renderRectificationView();
        }
    }
    // --- INICIALIZAÇÃO DA APLICAÇÃO ---
    // ===================================================================
// ===== NOVO BLOCO PARA O MODAL DE RESUMO DE VEÍCULOS (ADICIONAR) =====
// ===================================================================

const cardVehicleItems = document.getElementById('card-vehicle-items');

/**
 * Monta o conteúdo HTML do resumo de veículos de forma organizada e estilizada.
 * @param {object} vehicleData - Os dados de inventário dos veículos.
*/

function renderVehicleSummaryContent(vehicleData, searchTerm = '') {
    const contentContainer = document.getElementById('generic-modal-content');
    
    // Adiciona a barra de busca ao HTML do modal
    contentContainer.innerHTML = `
        <div class="mb-4">
            <div class="flex items-center relative w-full h-12 rounded-full focus-within:shadow-lg bg-white border-2 border-slate-200 overflow-hidden transition">
                <div class="grid place-items-center h-full w-12 text-slate-400"><i class="fas fa-search"></i></div>
                <input class="peer h-full w-full outline-none text-sm text-slate-700 pr-2" type="text" id="vehicle-summary-search" placeholder="Buscar por produto, patrimônio ou ID..." value="${searchTerm}">
            </div>
        </div>
        <div id="vehicle-summary-list-container"></div>
    `;

    const listContainer = document.getElementById('vehicle-summary-list-container');
    const searchInput = document.getElementById('vehicle-summary-search');

    searchInput.addEventListener('keyup', (e) => {
        renderVehicleSummaryContent(vehicleData, e.target.value);
    });

    const term = searchTerm.toLowerCase().trim();
    let finalHtml = '';

    // --- MAPA DE NOMES PARA TRADUÇÃO ---
    const vehicleDisplayNames = {
        'montana': 'Montana',
        'uno': 'Uno',
        'pajero': 'Pajero',
        'unonovo': 'Uno Novo',
        'estoqueAlternativo': 'Materiais Irreparáveis',
        'estoquealternativo': 'Materiais Irreparáveis' 
    };
    
    // Filtra os veículos e seus itens
    Object.entries(vehicleData).forEach(([vehicleName, allItems]) => {
        let items = Array.isArray(allItems) ? allItems : [];

        if (term) {
            items = items.filter(item =>
                (item.produto && item.produto.toLowerCase().includes(term)) ||
                (item.patrimonio && String(item.patrimonio).toLowerCase().includes(term)) ||
                (item.id && String(item.id).toLowerCase().includes(term))
            );
        }

        if (items.length > 0) {
            const totalCount = items.reduce((sum, item) => sum + parseInt(item.quantidade || 1, 10), 0);
            const assets = items.filter(item => item.patrimonio);
            const consumables = items.filter(item => !item.patrimonio);

            const displayName = vehicleDisplayNames[vehicleName] || vehicleName.charAt(0).toUpperCase() + vehicleName.slice(1);

            // --- BOTÃO DE EXCLUIR INSERIDO AQUI ---
            const assetsHtml = assets.length > 0
                ? `<div class="mt-2">
                    <p class="text-sm font-semibold text-slate-600">Itens com Patrimônio:</p>
                    <ul class="mt-1 text-sm">
                        ${assets.map(item => `
                            <li class="flex items-center justify-between border-b border-slate-200 py-1.5 hover:bg-white px-2 rounded transition">
                                <span>${item.produto} - <span class="font-mono font-semibold text-indigo-600">${item.patrimonio}</span></span>
                                <button onclick="window.excluirItemDoSistema('${item.patrimonio}', '${item.produto}')" class="text-red-400 hover:text-red-600 hover:bg-red-50 p-1.5 rounded ml-2 transition" title="Excluir item definitivamente">
                                    <i class="fas fa-trash"></i>
                                </button>
                            </li>
                        `).join('')}
                    </ul>
                   </div>`
                : '';
            
            const consumablesHtml = consumables.length > 0
                ? `<div class="mt-3"><p class="text-sm font-semibold text-slate-600">Itens Consumíveis:</p><ul class="list-disc list-inside pl-2 text-sm">${consumables.map(item => `<li>${item.produto} - ${item.quantidade} und.</li>`).join('')}</ul></div>`
                : '';

            finalHtml += `
                <div class="bg-slate-50 border border-slate-200 rounded-lg p-4 mb-4 shadow-sm">
                    <h4 class="text-lg font-bold text-indigo-700 mb-2 border-b pb-2">
                        ${displayName} - ${totalCount} item(s) encontrado(s)
                    </h4>
                    ${assetsHtml}
                    ${consumablesHtml}
                </div>
            `;
        }
    });

    if (finalHtml === '') {
        listContainer.innerHTML = '<p class="text-center text-gray-500 py-8">Nenhum item encontrado para sua busca.</p>';
    } else {
        listContainer.innerHTML = finalHtml;
    }
}

/**
 * Abre o modal e inicia o carregamento dos dados do resumo de veículos.
 */
async function openVehicleSummaryModal() {
    showInfoModal('Resumo de Itens nos Veículos', '<p class="text-center py-8">Carregando...</p>');
    const contentContainer = document.getElementById('generic-modal-content');

    try {
        const result = await DataService.getAllVehicleInventories(currentUser.role);
        const vehicleData = result.data;

        // 1. Desenha a "casca" do modal, incluindo a barra de busca, APENAS UMA VEZ.
        contentContainer.innerHTML = `
            <div class="mb-4">
                <div class="flex items-center relative w-full h-12 rounded-full focus-within:shadow-lg bg-white border-2 border-slate-200 overflow-hidden transition">
                    <div class="grid place-items-center h-full w-12 text-slate-400"><i class="fas fa-search"></i></div>
                    <input class="peer h-full w-full outline-none text-sm text-slate-700 pr-2" type="text" id="vehicle-summary-search" placeholder="Buscar por produto, patrimônio ou ID...">
                </div>
            </div>
            <div id="vehicle-summary-list-container"></div>
        `;
        
        // 2. Adiciona o "ouvinte" que chama a função de ATUALIZAR A LISTA
        const searchInput = document.getElementById('vehicle-summary-search');
        searchInput.addEventListener('keyup', (e) => {
            updateVehicleSummaryList(vehicleData, e.target.value);
        });

        // 3. Renderiza a lista inicial (completa)
        updateVehicleSummaryList(vehicleData);

    } catch (error) {
        contentContainer.innerHTML = `<p class="text-center text-red-500 py-8">Erro ao carregar dados: ${error.message}</p>`;
        console.error("Erro ao buscar resumo de veículos:", error);
    }
}

function updateVehicleSummaryList(vehicleData, searchTerm = '') {
    const listContainer = document.getElementById('vehicle-summary-list-container');
    if (!listContainer) return;

    const term = searchTerm.toLowerCase().trim();
    let finalHtml = '';
    
    // --- MAPA DE NOMES PARA TRADUÇÃO ---
    const vehicleDisplayNames = {
        'montana': 'Montana',
        'uno': 'Uno',
        'pajero': 'Pajero',
        'unonovo': 'Uno Novo',
        'estoqueAlternativo': 'Materiais Irreparáveis',
        'estoquealternativo': 'Materiais Irreparáveis' 
    };

    Object.entries(vehicleData).forEach(([vehicleName, allItems]) => {
        let items = Array.isArray(allItems) ? allItems : [];

        if (term) {
            items = items.filter(item =>
                (item.produto && item.produto.toLowerCase().includes(term)) ||
                (item.patrimonio && String(item.patrimonio).toLowerCase().includes(term)) ||
                (item.id && String(item.id).toLowerCase().includes(term))
            );
        }

        if (items.length > 0) {
            const totalCount = items.reduce((sum, item) => sum + parseInt(item.quantidade || 1, 10), 0);
            const assets = items.filter(item => item.patrimonio);
            const consumables = items.filter(item => !item.patrimonio);

            const displayName = vehicleDisplayNames[vehicleName] || vehicleName.charAt(0).toUpperCase() + vehicleName.slice(1);

            // --- BOTÃO DE EXCLUIR INSERIDO AQUI ---
            const assetsHtml = assets.length > 0
                ? `<div class="mt-2">
                    <p class="text-sm font-semibold text-slate-600">Itens com Patrimônio:</p>
                    <ul class="mt-1 text-sm">
                        ${assets.map(item => `
                            <li class="flex items-center justify-between border-b border-slate-200 py-1.5 hover:bg-white px-2 rounded transition">
                                <span>${item.produto} - <span class="font-mono font-semibold text-indigo-600">${item.patrimonio}</span></span>
                                <button onclick="window.excluirItemDoSistema('${item.patrimonio}', '${item.produto}')" class="text-red-400 hover:text-red-600 hover:bg-red-50 p-1.5 rounded ml-2 transition" title="Excluir item definitivamente">
                                    <i class="fas fa-trash"></i>
                                </button>
                            </li>
                        `).join('')}
                    </ul>
                   </div>`
                : '';
            
            const consumablesHtml = consumables.length > 0
                ? `<div class="mt-3"><p class="text-sm font-semibold text-slate-600">Itens Consumíveis:</p><ul class="list-disc list-inside pl-2 text-sm">${consumables.map(item => `<li>${item.produto} - ${item.quantidade} und.</li>`).join('')}</ul></div>`
                : '';

            finalHtml += `
                <div class="bg-slate-50 border border-slate-200 rounded-lg p-4 mb-4 shadow-sm">
                    <h4 class="text-lg font-bold text-indigo-700 mb-2 border-b pb-2">
                        ${displayName} - ${totalCount} item(s) encontrado(s)
                    </h4>
                    ${assetsHtml}
                    ${consumablesHtml}
                </div>
            `;
        }
    });

    if (finalHtml === '') {
        listContainer.innerHTML = '<p class="text-center text-gray-500 py-8">Nenhum item encontrado para sua busca.</p>';
    } else {
        listContainer.innerHTML = finalHtml;
    }
}

// Adiciona o novo evento de clique ao card
if (cardVehicleItems) {
    cardVehicleItems.addEventListener('click', openVehicleSummaryModal);
}

// ===================================================================
// ======================= FIM DO NOVO BLOCO =========================
// ===================================================================

    // =====================================================================
// ===== NOVO BLOCO PARA O MODAL "ITENS PARA COMPRAR" (ADICIONAR) =====
// =====================================================================

const cardBuyItems = document.getElementById('card-buy-items');

/**
 * Monta o conteúdo HTML da lista de compras dentro do modal genérico.
 */
/**
 * Monta o conteúdo HTML da lista de compras dentro do modal genérico.
 * (VERSÃO CORRIGIDA)
 */
function renderItemsToBuyContent() {
    const contentContainer = document.getElementById('generic-modal-content');

    contentContainer.innerHTML = `
        <div class="mb-4">
            <div class="flex items-center relative w-full h-12 rounded-full focus-within:shadow-lg bg-white border-2 border-slate-200 overflow-hidden transition">
                <div class="grid place-items-center h-full w-12 text-slate-400"><i class="fas fa-search"></i></div>
                <input class="peer h-full w-full outline-none text-sm text-slate-700 pr-2" type="text" id="items-to-buy-search" placeholder="Pesquisar por nome ou ID..." />
            </div>
        </div>
        <div id="items-to-buy-list-container" class="max-h-[60vh] overflow-y-auto pr-2">
            <div class="text-center py-8"><i class="fas fa-spinner fa-spin text-indigo-600 text-2xl"></i></div>
        </div>
    `;

    const listContainer = document.getElementById('items-to-buy-list-container');
    const searchInput = document.getElementById('items-to-buy-search');

    // Busca as DUAS listas da API ao mesmo tempo
    Promise.all([
        DataService.getProductsSummary(currentUser.role),
        DataService.getItensConsumiveis(currentUser.role)
    ])
    .then(([productsResult, consumiveisResult]) => {
        const allProducts = productsResult.data || [];
        const allConsumiveis = consumiveisResult.data || [];

        // 1. Padroniza a lista de Equipamentos
        const formattedProducts = allProducts.map(p => ({
            id: p.id,
            nome: p.nome,
            quantidade: parseInt(p.quantidadeTotal || 0),
            minimo: parseInt(p.safetyStock || 0),
            tipo: 'Equipamento',
            icone: 'fa-box',
            unidade: 'und'
        }));

        // 2. Padroniza a lista de Consumíveis
        const formattedConsumables = allConsumiveis.map(c => ({
            id: c.id,
            nome: c.nome,
            quantidade: parseInt(c.quantidadeEstoque || 0),
            minimo: parseInt(c.estoque_minimo || 0),
            tipo: 'Consumível',
            icone: 'fa-cogs',
            unidade: c.unidade || 'und'
        }));

        // 3. Junta as duas e filtra quem está precisando de compra
        const combinedList = [...formattedProducts, ...formattedConsumables];
        const itemsToBuy = combinedList.filter(item => item.quantidade <= item.minimo);

        // 4. Função interna para desenhar a lista com etiquetas visuais
        const renderList = (items) => {
            if (items.length === 0) {
                listContainer.innerHTML = '<p class="text-center text-gray-500 py-8">Nenhum item atingiu o estoque de segurança. Tudo certo!</p>';
                return;
            }
            
            listContainer.innerHTML = items.map(item => `
                <div class="grid grid-cols-4 items-center gap-4 p-3 bg-red-50 border border-red-200 rounded-lg mb-3 relative overflow-hidden shadow-sm">
                    <div class="absolute top-0 right-0 bg-red-200 text-red-800 text-[10px] font-bold px-2 py-0.5 rounded-bl-lg uppercase tracking-wider">
                        <i class="fas ${item.icone} mr-1"></i> ${item.tipo}
                    </div>
                    
                    <div class="col-span-2 pt-2">
                        <p class="font-bold text-slate-800">${item.nome}</p>
                        <p class="text-xs text-slate-500 font-mono">ID: ${item.id}</p>
                    </div>
                    <div class="text-center pt-2 border-l border-red-200">
                        <p class="text-lg font-bold text-red-600">${item.quantidade} <span class="text-[10px] font-normal text-red-500 uppercase">${item.unidade}</span></p>
                        <p class="text-[10px] uppercase tracking-wider text-slate-500 font-semibold">Em Estoque</p>
                    </div>
                    <div class="text-center pt-2 border-l border-red-200">
                        <p class="text-lg font-semibold text-slate-600">${item.minimo}</p>
                        <p class="text-[10px] uppercase tracking-wider text-slate-500 font-semibold">Mínimo</p>
                    </div>
                </div>
            `).join('');
        };

        renderList(itemsToBuy);

        searchInput.addEventListener('keyup', () => {
            const searchTerm = searchInput.value.toLowerCase().trim();
            const filteredItems = itemsToBuy.filter(item =>
                item.nome.toLowerCase().includes(searchTerm) ||
                String(item.id).toLowerCase().includes(searchTerm)
            );
            renderList(filteredItems);
        });
    })
    .catch(error => {
        listContainer.innerHTML = `<p class="text-center text-red-500 py-8">Erro ao carregar lista de compras: ${error.message}</p>`;
    });
}


/**
 * Abre o modal de "Itens para Comprar".
 */
function openItemsToBuyModal() {
    // A função showInfoModal já existe no seu script.js e abre o modal genérico
    showInfoModal('Lista de Compras (Estoque Baixo)', 'Carregando...');
    // Chama a função para montar o conteúdo
    renderItemsToBuyContent();
}

// Adiciona o novo evento de clique para o card
if (cardBuyItems) {
    cardBuyItems.addEventListener('click', openItemsToBuyModal);
}
// =======================================================================
// ===== NOVO BLOCO PARA O MODAL "ITENS EM RETÍFICA" (ADICIONAR) =====
// =======================================================================

const cardRectificationItems = document.getElementById('card-rectification-items');

/**
 * Monta o conteúdo do modal de retífica, agrupando itens e com busca.
 */
function renderRectificationSummaryContent() {
    const contentContainer = document.getElementById('generic-modal-content');

    // Adiciona o HTML da busca e uma área para a lista
    contentContainer.innerHTML = `
        <div class="mb-4">
            <div class="flex items-center relative w-full h-12 rounded-full focus-within:shadow-lg bg-white border-2 border-slate-200 overflow-hidden transition">
                <div class="grid place-items-center h-full w-12 text-slate-400"><i class="fas fa-search"></i></div>
                <input class="peer h-full w-full outline-none text-sm text-slate-700 pr-2" type="text" id="rectification-summary-search" placeholder="Pesquisar por nome ou ID..." />
            </div>
        </div>
        <div id="rectification-list-container">
            <div class="text-center py-8"><i class="fas fa-spinner fa-spin text-indigo-600 text-2xl"></i></div>
        </div>
    `;

    const listContainer = document.getElementById('rectification-list-container');
    const searchInput = document.getElementById('rectification-summary-search');

    // Busca os dados da retífica usando o DataService
    DataService.getRectificationItems(currentUser.role)
        .then(result => {
            const allItems = result.data;

            // Função interna para desenhar a lista de cards
            const renderList = (items) => {
                if (items.length === 0) {
                    listContainer.innerHTML = '<p class="text-center text-gray-500 py-8">Não há itens em retífica no momento.</p>';
                    return;
                }

                // Agrupa os itens por ID do produto para o layout que você pediu
                const groupedItems = items.reduce((acc, item) => {
                    const id = item.id;
                    if (!acc[id]) {
                        acc[id] = {
                            name: item.produto,
                            patrimonios: []
                        };
                    }
                    acc[id].patrimonios.push(item.patrimonio);
                    return acc;
                }, {});
                
                let sequentialNumber = 0;
                listContainer.innerHTML = Object.entries(groupedItems).map(([productId, productData]) => {
                    sequentialNumber++;
                    return `
                        <div class="bg-slate-50 border border-slate-200 rounded-lg p-4 mb-3">
                            <h5 class="text-md font-bold text-orange-700">
                                Item ${productId} - ${productData.patrimonios.length} unidade(s)
                            </h5>
                            <div class="mt-2 pl-2 text-sm">
                                <span class="font-semibold text-slate-800">${sequentialNumber} - ${productData.name}:</span>
                                <span class="font-mono text-slate-600">${productData.patrimonios.join(', ')}.</span>
                            </div>
                        </div>
                    `;
                }).join('');
            };

            // Renderiza a lista inicial
            renderList(allItems);

            // Adiciona a funcionalidade de busca
            searchInput.addEventListener('keyup', () => {
                const searchTerm = searchInput.value.toLowerCase().trim();
                const filteredItems = allItems.filter(item =>
                    (item.produto && item.produto.toLowerCase().includes(searchTerm)) ||
                    (item.patrimonio && String(item.patrimonio).toLowerCase().includes(searchTerm)) || // <-- BUSCA NO PATRIMÔNIO
                    (item.id && String(item.id).toLowerCase().includes(searchTerm))
                );
                renderList(filteredItems);
            });

        })
        .catch(error => {
            listContainer.innerHTML = `<p class="text-center text-red-500 py-8">Erro ao carregar itens da retífica: ${error.message}</p>`;
        });
}

/**
 * Abre o modal de resumo da retífica.
 */
function openRectificationModal() {
    // Reutiliza a função showInfoModal que já abre o modal genérico
    showInfoModal('Resumo de Itens em Retífica', 'Carregando...');
    renderRectificationSummaryContent();
}

// Adiciona o novo evento de clique ao card
if (cardRectificationItems) {
    cardRectificationItems.addEventListener('click', openRectificationModal);
}

// ===================================================================
// =====   NOVO BLOCO PARA O MODAL "USUÁRIOS CADASTRADOS"   =====
// ===================================================================

const cardActiveUsers = document.getElementById('card-active-users');

/**
 * Monta o conteúdo do modal de usuários com uma lista simples e busca.
 */
function renderUsersSummaryContent() {
    const contentContainer = document.getElementById('generic-modal-content');

    // Adiciona o HTML da busca e a área para a lista
    contentContainer.innerHTML = `
        <div class="mb-4">
            <div class="flex items-center relative w-full h-12 rounded-full focus-within:shadow-lg bg-white border-2 border-slate-200 overflow-hidden transition">
                <div class="grid place-items-center h-full w-12 text-slate-400"><i class="fas fa-search"></i></div>
                <input class="peer h-full w-full outline-none text-sm text-slate-700 pr-2" type="text" id="users-summary-search" placeholder="Pesquisar por nome ou ID..." />
            </div>
        </div>
        <div id="users-list-container">
            <div class="text-center py-8"><i class="fas fa-spinner fa-spin text-indigo-600 text-2xl"></i></div>
        </div>
    `;

    const listContainer = document.getElementById('users-list-container');
    const searchInput = document.getElementById('users-summary-search');

    // Busca os dados dos usuários usando o DataService
    DataService.getUsers(currentUser.role)
        .then(result => {
            const allUsers = result.data;

            // Função interna para desenhar a lista simples
            const renderList = (users) => {
                if (users.length === 0) {
                    listContainer.innerHTML = '<p class="text-center text-gray-500 py-8">Nenhum usuário encontrado.</p>';
                    return;
                }
                
                // Cria uma lista simples, como solicitado
                listContainer.innerHTML = `
                    <div class="divide-y divide-slate-200">
                        ${users.map(user => `
                            <div class="flex items-center p-3">
                                <span class="font-mono text-sm text-slate-500 w-12">ID: ${user.id}</span>
                                <span class="font-medium text-slate-800">${user.name}</span>
                            </div>
                        `).join('')}
                    </div>
                `;
            };

            // Renderiza a lista inicial
            renderList(allUsers);

            // Adiciona a funcionalidade de busca
            searchInput.addEventListener('keyup', () => {
                const searchTerm = searchInput.value.toLowerCase().trim();
                const filteredUsers = allUsers.filter(user =>
                    user.name.toLowerCase().includes(searchTerm) ||
                    String(user.id).toLowerCase().includes(searchTerm)
                );
                renderList(filteredUsers);
            });
        })
        .catch(error => {
            listContainer.innerHTML = `<p class="text-center text-red-500 py-8">Erro ao carregar usuários: ${error.message}</p>`;
        });
}

/**
 * Abre o modal de resumo de usuários.
 */
function openUsersSummaryModal() {
    // Reutiliza a função showInfoModal que abre o modal genérico
    showInfoModal('Usuários Cadastrados', 'Carregando...');
    renderUsersSummaryContent();
}

// Adiciona o novo evento de clique ao card
if (cardActiveUsers) {
    cardActiveUsers.addEventListener('click', openUsersSummaryModal);
}
// ===================================================================
// =====   NOVO BLOCO PARA O MODAL "RESUMO DE TORRES"       =====
// ===================================================================

const cardDashboardTowers = document.getElementById('card-dashboard-towers');

/**
 * Monta o conteúdo do modal de resumo de torres, replicando o visual da página "Gerenciar".
 * (VERSÃO CORRIGIDA COM SETORES)
 */
function renderTowersSummaryContent() {
    const contentContainer = document.getElementById('generic-modal-content');
    if (!contentContainer) return;

    contentContainer.innerHTML = `
        <div class="mb-4"><input class="w-full p-2 border border-gray-300 rounded-md" type="text" id="towers-summary-search" placeholder="Pesquisar por nome da torre..." /></div>
        <div id="towers-list-container" class="max-h-[60vh] overflow-y-auto pr-2"></div>`;

    const listContainer = document.getElementById('towers-list-container');
    const searchInput = document.getElementById('towers-summary-search');

    const renderList = (searchTerm = '') => {
        const term = searchTerm.trim().toLowerCase();
        const filteredTowers = towersData.filter(torre => torre.nome.toLowerCase().includes(term));

        if (filteredTowers.length === 0) {
            listContainer.innerHTML = emptyStateHTML('Nenhuma torre encontrada.', 'fas fa-broadcast-tower');
            return;
        }
        
        listContainer.innerHTML = filteredTowers.map(torre => {
            const totalSetores = torre.setores ? torre.setores.length : 0;
            const totalItens = torre.itens ? torre.itens.length : 0;

            // =================================================================
            // INÍCIO DO BLOCO ATUALIZADO: SETORES COM BOTÃO DE CLIENTES
            // =================================================================
            const setoresHtml = (torre.setores && totalSetores > 0)
            ? `<ul class="space-y-2">${(torre.setores || []).map(setor => {
                const clientCount = parseInt(setor.clientes || 0, 10);
                const clientLimit = parseInt(setor.limite || 150, 10); // Puxa o limite real
                const clientNames = setor.client_names || '';
                
                const nomesCodificados = encodeURIComponent(clientNames);
                
                // VERIFICA SE PASSOU DO LIMITE
                const isOverLimit = clientCount >= clientLimit;
                
                // Se passou do limite, aplica vermelho e a classe pulsate-red. Senão, fica azul.
                const btnColorsClass = isOverLimit 
                    ? 'bg-red-100 text-red-700 hover:bg-red-200 pulsate-red shadow border border-red-300' 
                    : 'bg-indigo-100 text-indigo-700 hover:bg-indigo-200';
                
                const badgeClientes = clientCount > 0 
                    ? `<button onclick="window.mostrarListaClientes('${torre.nome}', '${setor.nome}', '${nomesCodificados}')" class="text-xs ${btnColorsClass} hover:shadow transition-all px-3 py-1 rounded-full font-bold cursor-pointer focus:outline-none whitespace-nowrap"><i class="fas fa-users mr-1"></i> ${clientCount} / ${clientLimit}</button>`
                    : `<span class="text-xs bg-slate-100 text-slate-500 px-3 py-1 rounded-full whitespace-nowrap"><i class="fas fa-user-slash mr-1"></i> 0 / ${clientLimit}</span>`;
                
                return `<li class="text-sm flex justify-between items-center py-1 border-b border-gray-50 last:border-0 hover:bg-gray-50 transition px-1 rounded">
                            <span class="font-medium text-slate-700 ${isOverLimit ? 'text-red-600 font-bold' : ''}">${setor.nome}</span>
                            ${badgeClientes}
                        </li>`;
            }).join('')}</ul>`
            : '<p class="text-sm text-slate-500 italic pl-4">Nenhum setor cadastrado.</p>';
            // =================================================================
            
            // --- INÍCIO DO CÓDIGO COMPLETO PARA ITENS ---
            let itensHtml = `<p class="text-sm text-slate-500 italic">Nenhum item alocado.</p>`;
            if (totalItens > 0) {
                const groupedBySector = (torre.itens || []).reduce((acc, item) => {
                    const sectorId = (item.setor_id == null || item.setor_id == 0) ? 'geral' : item.setor_id;
                    if (!acc[sectorId]) { acc[sectorId] = []; }
                    acc[sectorId].push(item);
                    return acc;
                }, {});

                let htmlContent = Object.entries(groupedBySector).map(([sectorId, itemsInGroup]) => {
                    let sectorName = 'Na Torre (Geral)';
                    if (sectorId !== 'geral') {
                        const setorInfo = (torre.setores || []).find(s => String(s.id) === String(sectorId));
                        sectorName = `Setor ${setorInfo ? setorInfo.nome : `Inválido`}`;
                    }
                    const itemsList = itemsInGroup.map(item => `<li>${item.nomeProduto} - Pat: ${item.patrimonio}</li>`).join('');
                    return `<ul class="list-disc list-inside text-sm mb-2"><strong>${sectorName}:</strong>${itemsList}</ul>`;
                }).join('');

                if (htmlContent) {
                    itensHtml = htmlContent;
                }
            }
            // --- FIM DO CÓDIGO COMPLETO PARA ITENS ---

            return `
                <div class="bg-white border border-slate-200 rounded-lg shadow-md p-6 mb-4">
                    <h3 class="text-xl font-bold text-slate-800 border-b pb-3 mb-3">${torre.nome}</h3>
                    <div class="grid grid-cols-1 md:grid-cols-2 gap-6">
                        <div><h4 class="font-semibold text-slate-700 mb-2">Setores (${totalSetores}):</h4>${setoresHtml}</div>
                        <div><h4 class="font-semibold text-slate-700 mb-2">Itens Alocados (${totalItens}):</h4>${itensHtml}</div>
                    </div>
                </div>`;
        }).join('');
    };

    searchInput.addEventListener('keyup', () => renderList(searchInput.value));
    renderList(); 
}
/**
 * Abre o modal de resumo de torres.
 */
async function openTowersSummaryModal() {
    // 1. Mostra o modal com uma mensagem de "carregando"
    showInfoModal('Resumo de Torres Cadastradas', '<div class="text-center py-8"><i class="fas fa-spinner fa-spin text-indigo-600 text-2xl"></i><p class="mt-2">Buscando dados atualizados...</p></div>');

    try {
        // 2. FORÇA A BUSCA DOS DADOS MAIS RECENTES DO SERVIDOR
        await loadTowers(); 
        
        // 3. AGORA, RENDERIZA o conteúdo do modal com os dados completos e atualizados
        renderTowersSummaryContent(); 

    } catch (error) {
        console.error('Erro ao carregar dados para o modal de torres:', error);
        const contentContainer = document.getElementById('generic-modal-content');
        if (contentContainer) {
            contentContainer.innerHTML = `<p class="text-center text-red-500">Falha ao carregar os dados das torres.</p>`;
        }
    }
}

// Adiciona o novo evento de clique ao card
if (cardDashboardTowers) {
    cardDashboardTowers.addEventListener('click', openTowersSummaryModal);
}
// =======================================================================
// ===== NOVO BLOCO PARA O MODAL "RESUMO DE CONSUMO" (ADICIONAR) =====
// =======================================================================

const cardDashboardConsumption = document.getElementById('card-dashboard-consumption');

// SUBSTITUA A SUA FUNÇÃO renderConsumptionSummaryContent POR ESTA VERSÃO FINAL:

/**
 * Monta o conteúdo completo do modal de consumo, com abas, rankings e filtro de data.
 * (VERSÃO FINAL E CORRIGIDA)
 */
function renderConsumptionSummaryContent() {
    const contentContainer = document.getElementById('generic-modal-content');

    // Estrutura HTML inicial do modal com abas. A div wrapper corrige o fundo.
    contentContainer.innerHTML = `
        <div class="p-0"> 
            <div class="border-b border-gray-200 mb-4 px-6">
                <nav class="-mb-px flex space-x-6" aria-label="Tabs">
                    <button id="tab-consumo-resumo" class="consumo-summary-tab whitespace-nowrap py-3 px-1 border-b-2 font-medium text-sm text-indigo-600 border-indigo-500">Resumo por Usuário</button>
                    <button id="tab-consumo-ranking" class="consumo-summary-tab whitespace-nowrap py-3 px-1 border-b-2 font-medium text-sm text-gray-500 border-transparent hover:text-gray-700">Rankings Mensais</button>
                </nav>
            </div>
            <div id="consumo-tab-content" class="px-6 pb-6">
                <div class="text-center py-8"><i class="fas fa-spinner fa-spin text-indigo-600 text-2xl"></i></div>
            </div>
        </div>
    `;

    const tabContent = document.getElementById('consumo-tab-content');
    let allConsumptionData = []; // Armazena os dados do mês atual para a primeira aba

    // Função para desenhar a aba de RANKING
    const renderRankingView = (dateString) => {
        const [year, month] = dateString.split('-');
        
        tabContent.innerHTML = `
            <div class="mb-4">
                <label for="ranking-month-picker" class="block text-sm font-medium text-gray-700">Selecione o Mês para o Ranking:</label>
                <input type="month" id="ranking-month-picker" value="${dateString}" class="mt-1 block w-full md:w-1/2 p-2 border border-gray-300 rounded-md">
            </div>
            <div id="ranking-results" class="text-center py-8"><i class="fas fa-spinner fa-spin text-indigo-600 text-2xl"></i></div>
        `;
        
        document.getElementById('ranking-month-picker').addEventListener('change', (e) => renderRankingView(e.target.value));

        const rankingResultsContainer = document.getElementById('ranking-results');

        DataService.getHistoricoConsumo({ month, year }, currentUser.role)
            .then(result => {
                const logs = result.data;
                const userRanking = logs.reduce((acc, log) => { acc[log.usuario_nome] = (acc[log.usuario_nome] || 0) + parseInt(log.quantidade_consumida); return acc; }, {});
                const sortedUsers = Object.entries(userRanking).sort(([, a], [, b]) => b - a);
                const materialRanking = logs.reduce((acc, log) => { acc[log.item_nome] = (acc[log.item_nome] || 0) + parseInt(log.quantidade_consumida); return acc; }, {});
                const sortedMaterials = Object.entries(materialRanking).sort(([, a], [, b]) => b - a);

                rankingResultsContainer.innerHTML = `
                    <div class="grid grid-cols-1 md:grid-cols-2 gap-6">
                        <div>
                            <h4 class="font-bold text-lg mb-2 text-slate-700">Top 5 Usuários</h4>
                            <ol class="list-decimal list-inside bg-white p-4 rounded-lg border space-y-2 h-48 overflow-y-auto">${sortedUsers.length > 0 ? sortedUsers.slice(0, 5).map(([name, qty]) => `<li><span class="font-semibold">${name}</span> - ${qty} unid.</li>`).join('') : '<li class="list-none">Nenhum dado para este mês.</li>'}</ol>
                        </div>
                        <div>
                            <h4 class="font-bold text-lg mb-2 text-slate-700">Top 5 Materiais</h4>
                            <ol class="list-decimal list-inside bg-white p-4 rounded-lg border space-y-2 h-48 overflow-y-auto">${sortedMaterials.length > 0 ? sortedMaterials.slice(0, 5).map(([name, qty]) => `<li><span class="font-semibold">${name}</span> - ${qty} unid.</li>`).join('') : '<li class="list-none">Nenhum dado para este mês.</li>'}</ol>
                        </div>
                    </div>`;
            }).catch(err => {
                rankingResultsContainer.innerHTML = `<p class="text-center text-red-500 py-8">Erro: ${err.message}</p>`;
            });
    };

    // Função para desenhar a aba de RESUMO POR USUÁRIO (com a busca)
    const renderUserSummaryView = (logs) => {
        tabContent.innerHTML = `
            <div class="mb-4">
                <input class="w-full p-2 border border-gray-300 rounded-md" type="text" id="consumption-search" placeholder="Buscar no histórico do mês atual..." />
            </div>
            <div id="consumption-list-container" class="max-h-[50vh] overflow-y-auto pr-2"></div>`;
        
        const listContainer = document.getElementById('consumption-list-container');
        const searchInput = document.getElementById('consumption-search');
        
        const renderList = (filteredLogs) => {
            if (filteredLogs.length === 0) {
                listContainer.innerHTML = '<p class="text-center text-gray-500 py-8">Nenhum registro encontrado.</p>';
                return;
            }
            const groupedByUser = filteredLogs.reduce((acc, log) => {
                const userName = log.usuario_nome;
                if (!acc[userName]) acc[userName] = [];
                acc[userName].push(log);
                return acc;
            }, {});
            listContainer.innerHTML = Object.entries(groupedByUser).map(([userName, userLogs]) => {
                const itemsGrouped = userLogs.reduce((acc, log) => {
                    const itemName = log.item_nome;
                    if (!acc[itemName]) acc[itemName] = 0;
                    acc[itemName] += parseInt(log.quantidade_consumida);
                    return acc;
                }, {});
                const distinctItemsCount = Object.keys(itemsGrouped).length;
                const totalQuantity = userLogs.reduce((sum, log) => sum + parseInt(log.quantidade_consumida), 0);
                return `
                    <div class="bg-slate-50 border rounded-lg p-4 mb-3">
                        <h4 class="font-bold text-indigo-700">${userName} - ${distinctItemsCount} itens, totalizando ${totalQuantity} quantidades</h4>
                        <ul class="mt-2 pl-4 list-disc list-inside text-sm">
                        ${Object.entries(itemsGrouped).map(([itemName, quantity]) => `<li><span class="font-semibold">${itemName}</span> - ${quantity} unidade(s)</li>`).join('')}
                        </ul>
                    </div>`;
            }).join('');
        };
        
        renderList(logs);
        searchInput.addEventListener('keyup', () => {
            const searchTerm = searchInput.value.toLowerCase().trim();
            const filtered = logs.filter(log => log.usuario_nome.toLowerCase().includes(searchTerm) || log.item_nome.toLowerCase().includes(searchTerm));
            renderList(filtered);
        });
    };
    
    // Função para controlar a troca de abas
    const switchTab = (activeTabId) => {
        document.querySelectorAll('.consumo-summary-tab').forEach(tab => {
            tab.className = `consumo-summary-tab whitespace-nowrap py-3 px-1 border-b-2 font-medium text-sm ${tab.id === activeTabId ? 'text-indigo-600 border-indigo-500' : 'text-gray-500 border-transparent hover:text-gray-700'}`;
        });
        if (activeTabId === 'tab-consumo-resumo') {
            renderUserSummaryView(allConsumptionData);
        } else {
            const today = new Date();
            const year = today.getFullYear();
            const month = String(today.getMonth() + 1).padStart(2, '0');
            renderRankingView(`${year}-${month}`);
        }
    };
    
    // Carrega os dados do mês atual e inicializa a primeira aba
    const today = new Date();
    DataService.getHistoricoConsumo({ month: today.getMonth() + 1, year: today.getFullYear() }, currentUser.role)
        .then(result => {
            allConsumptionData = result.data;
            renderUserSummaryView(allConsumptionData);
            document.getElementById('tab-consumo-resumo').addEventListener('click', () => switchTab('tab-consumo-resumo'));
            document.getElementById('tab-consumo-ranking').addEventListener('click', () => switchTab('tab-consumo-ranking'));
        }).catch(err => {
            tabContent.innerHTML = `<p class="text-center text-red-500 py-8">Erro ao carregar dados: ${err.message}</p>`;
        });
}

function startSubscriptionTimer(startDateString, expirationDateString) {
    const container = document.getElementById('subscription-timer-container');
    if (!container) return;

    const startDate = new Date(startDateString).getTime();
    const expirationDate = new Date(expirationDateString).getTime();

    // Limpa qualquer timer anterior para evitar múltiplos contadores
    if (container.dataset.timerId) {
        clearInterval(parseInt(container.dataset.timerId));
    }

    const updateTimer = () => {
        const now = new Date().getTime();
        const distance = expirationDate - now;
        const usageTime = now - startDate;
        const daysOfUse = Math.max(0, Math.floor(usageTime / (1000 * 60 * 60 * 24)));

        if (distance < 0) {
            container.innerHTML = `
                <div class="bg-white rounded-lg shadow-md p-4 text-center">
                    <div class="flex items-center justify-center text-red-500">
                        <i class="fas fa-times-circle fa-lg mr-2"></i>
                        <h3 class="text-lg font-bold">Assinatura Expirada</h3>
                    </div>
                    <p class="text-sm text-gray-600 mt-2">Por favor, contate o suporte para renovar o seu acesso.</p>
                </div>
            `;
            clearInterval(timerInterval);
            return;
        }

        const days = Math.floor(distance / (1000 * 60 * 60 * 24));
        const hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
        const minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));
        const seconds = Math.floor((distance % (1000 * 60)) / 1000);

        container.innerHTML = `
            <div class="bg-white rounded-xl shadow-lg p-5">
                <div class="flex items-center border-b pb-3 mb-4">
                    <div class="bg-indigo-100 text-indigo-600 p-3 rounded-full mr-4">
                        <i class="fas fa-shield-alt fa-lg"></i>
                    </div>
                    <div>
                        <h3 class="text-lg font-bold text-gray-800">Status da Assinatura</h3>
                        <p class="text-sm text-gray-500">Válida</p>
                    </div>
                </div>
                <div class="grid grid-cols-2 gap-4 text-center">
                    <div>
                        <p class="text-sm font-semibold text-gray-500 uppercase tracking-wider">Tempo Restante</p>
                        <p class="text-2xl md:text-3xl font-mono text-gray-800 mt-1 tracking-tight">
                            ${days}d ${String(hours).padStart(2, '0')}h ${String(minutes).padStart(2, '0')}m ${String(seconds).padStart(2, '0')}s
                        </p>
                    </div>
                    <div class="border-l">
                        <p class="text-sm font-semibold text-gray-500 uppercase tracking-wider">Dias de Uso</p>
                        <p class="text-2xl md:text-3xl font-bold text-gray-800 mt-1">
                            <span>${daysOfUse}</span><span class="text-base font-medium text-gray-500"> dias</span>
                        </p>
                    </div>
                </div>
            </div>
        `;
    };

    const timerInterval = setInterval(updateTimer, 1000);
    container.dataset.timerId = timerInterval; // Armazena o ID do timer
    updateTimer();
}

/**
 * Abre o modal de resumo de consumo.
 */
function openConsumptionSummaryModal() {
    showInfoModal('Resumo de Consumo', 'Carregando...');
    renderConsumptionSummaryContent();
}

// Adiciona o novo evento de clique ao card
if (cardDashboardConsumption) {
    cardDashboardConsumption.addEventListener('click', openConsumptionSummaryModal);
}
    // ===================================================================
// =====   NOVO BLOCO PARA O MODAL "RESUMO DE COMBUSTÍVEL"    =====
// ===================================================================

const cardDashboardFuel = document.getElementById('card-dashboard-fuel');

/**
 * Processa os dados brutos de abastecimento e agrupa por veículo.
 * @param {Array} logs - A lista de todos os registros de abastecimento.
 * @returns {object} - Um objeto com os dados calculados para cada veículo.
 */
function processFuelData(logs) {
    const dataByVehicle = logs.reduce((acc, log) => {
        const vehicleName = log.veiculo_nome;
        if (!acc[vehicleName]) {
            acc[vehicleName] = { logs: [], minHodo: Infinity, maxHodo: 0, totalLiters: 0, totalValue: 0 };
        }
        const hodo = parseInt(log.hodometro);
        acc[vehicleName].logs.push(log);
        acc[vehicleName].totalLiters += parseFloat(log.litros);
        acc[vehicleName].totalValue += parseFloat(log.valor_total);
        if (hodo < acc[vehicleName].minHodo) acc[vehicleName].minHodo = hodo;
        if (hodo > acc[vehicleName].maxHodo) acc[vehicleName].maxHodo = hodo;
        
        return acc;
    }, {});

    // Calcula os totais finais para cada veículo
    for (const vehicle in dataByVehicle) {
        const vData = dataByVehicle[vehicle];
        vData.fillupCount = vData.logs.length;
        vData.totalKm = (vData.fillupCount > 1) ? (vData.maxHodo - vData.minHodo) : 0;
    }
    return dataByVehicle;
}

// SUBSTITUA A SUA FUNÇÃO renderFuelSummaryContent POR ESTA VERSÃO FINAL:

/**
 * Monta o conteúdo completo do modal de combustível, com abas para visão geral e relatório mensal.
 * (VERSÃO FINAL COM SEPARAÇÃO DE DADOS)
 */
function renderFuelSummaryContent() {
    const contentContainer = document.getElementById('generic-modal-content');

    // Estrutura HTML inicial do modal com abas
    contentContainer.innerHTML = `
        <div class="border-b border-gray-200 mb-4 px-6">
            <nav class="-mb-px flex space-x-6" aria-label="Tabs">
                <button id="tab-fuel-overview" class="fuel-summary-tab whitespace-nowrap py-3 px-1 border-b-2 font-medium text-sm text-indigo-600 border-indigo-500">Visão Geral</button>
                <button id="tab-fuel-report" class="fuel-summary-tab whitespace-nowrap py-3 px-1 border-b-2 font-medium text-sm text-gray-500 border-transparent hover:text-gray-700">Relatório Mensal</button>
            </nav>
        </div>
        <div id="fuel-tab-content" class="px-6 pb-6">
            <div class="text-center py-8"><i class="fas fa-spinner fa-spin text-indigo-600 text-2xl"></i></div>
        </div>
    `;

    let allFuelLogs = []; // Armazena os dados GERAIS para a primeira aba

    // ---- Lógica da Aba 1: VISÃO GERAL (Usa a busca de TODOS os dados) ----
    const renderOverviewTab = (logs) => {
        // ... (Esta sub-função permanece exatamente igual à da resposta anterior, não precisa mudar nada nela)
    };

    // ---- Lógica da Aba 2: RELATÓRIO MENSAL (Usa a NOVA busca de dados mensais) ----
    const renderMonthlyReportTab = (dateString) => {
        const [year, month] = dateString.split('-');
        const tabContent = document.getElementById('fuel-tab-content');
        
        tabContent.innerHTML = `...`; // Código da interface da aba de relatório
        
        // CORREÇÃO PRINCIPAL: Usa a nova função da API
        DataService.getMonthlyFuelReport({ month, year }, currentUser.role)
            .then(result => {
                // ... (O resto da lógica para calcular e exibir a tabela do relatório permanece o mesmo)
            }).catch(err => { /*...*/ });
    };

    // Para evitar colar um bloco gigante de código de novo, a única mudança real está na linha acima.
    // Para garantir 100%, aqui está a função completa para substituir:
    const fullRenderFunction = () => {
        const tabContent = document.getElementById('fuel-tab-content');
        const overviewTabButton = document.getElementById('tab-fuel-overview');
        const reportTabButton = document.getElementById('tab-fuel-report');

        const renderOverviewView = (logs) => {
            const processedData = processFuelData(logs);
            const vehicles = Object.keys(processedData);
            if (vehicles.length === 0) { tabContent.innerHTML = '<p class="text-center text-gray-500 py-8">Nenhum registro de abastecimento encontrado.</p>'; return; }
            const ranking = vehicles.sort((a, b) => processedData[b].fillupCount - processedData[a].fillupCount);
            const grandTotalValue = Object.values(processedData).reduce((sum, v) => sum + v.totalValue, 0);
            tabContent.innerHTML = `
                <div id="fuel-accordion" class="space-y-2 max-h-[40vh] overflow-y-auto pr-2"><h4 class="text-lg font-bold text-slate-700 mb-2">Estatísticas por Veículo (Geral)</h4>${vehicles.map(vehicleName => { const data = processedData[vehicleName]; return `<div class="border border-slate-200 rounded-lg"><button class="accordion-header flex justify-between items-center w-full p-4 text-left font-semibold text-indigo-800"><span>${vehicleName}</span><i class="fas fa-chevron-down transition-transform"></i></button><div class="accordion-content hidden p-4 border-t border-slate-200 bg-slate-50"><ul class="space-y-2 text-sm"><li class="flex justify-between"><span>Abastecimentos:</span> <strong class="font-mono">${data.fillupCount}</strong></li><li class="flex justify-between"><span>KM Rodados:</span> <strong class="font-mono">${data.totalKm.toLocaleString('pt-BR')} km</strong></li><li class="flex justify-between"><span>Total de Litros:</span> <strong class="font-mono">${data.totalLiters.toFixed(2)} L</strong></li></ul></div></div>`; }).join('')}</div>
                <div class="mt-4 pt-4 border-t"><h4 class="text-lg font-bold text-slate-700 mb-2">Resumo Geral</h4><div class="bg-white p-4 rounded-lg border"><p class="font-semibold">Ranking (nº de abastecimentos):</p><ol class="list-decimal list-inside text-sm">${ranking.map(v => `<li>${v}: ${processedData[v].fillupCount} vezes</li>`).join('')}</ol><div class="flex justify-between items-center mt-4 pt-2 border-t"><span class="font-semibold">Valor Total Gasto (Geral):</span><strong class="text-xl text-green-700">R$ ${grandTotalValue.toFixed(2).replace('.', ',')}</strong></div></div></div>`;
            tabContent.querySelector('#fuel-accordion').addEventListener('click', e => { const header = e.target.closest('.accordion-header'); if (header) { header.nextElementSibling.classList.toggle('hidden'); header.querySelector('i').classList.toggle('rotate-180'); } });
        };

        const renderReportView = (dateString) => {
            const [year, month] = dateString.split('-');
            tabContent.innerHTML = `<div class="mb-4"><label for="report-month-picker" class="block text-sm font-medium text-gray-700">Selecione o Mês:</label><input type="month" id="report-month-picker" value="${dateString}" class="mt-1 block w-full md:w-1/2 p-2 border border-gray-300 rounded-md"></div><div id="report-results" class="text-center py-8"><i class="fas fa-spinner fa-spin text-indigo-600 text-2xl"></i></div>`;
            document.getElementById('report-month-picker').addEventListener('change', e => renderReportView(e.target.value));
            DataService.getMonthlyFuelReport({ month, year }, currentUser.role).then(result => {
                const monthlyData = processFuelData(result.data);
                const resultsContainer = document.getElementById('report-results');
                if (Object.keys(monthlyData).length === 0) { resultsContainer.innerHTML = '<p class="text-center text-gray-500 py-8">Nenhum abastecimento para este mês.</p>'; return; }
                let grandTotalFillups = 0, grandTotalLiters = 0, grandTotalKm = 0, grandTotalValue = 0;
                Object.values(monthlyData).forEach(d => { grandTotalFillups += d.fillupCount; grandTotalLiters += d.totalLiters; grandTotalKm += d.totalKm; grandTotalValue += d.totalValue; });
                resultsContainer.innerHTML = `<div class="overflow-x-auto"><table class="min-w-full divide-y divide-gray-200"><thead class="bg-gray-50"><tr><th class="th-style text-left">Veículo</th><th class="th-style">Qtd. Abastec.</th><th class="th-style">Litros</th><th class="th-style">KM Rodado</th><th class="th-style">Total Pago</th></tr></thead><tbody class="bg-white divide-y divide-gray-200">${Object.entries(monthlyData).map(([name, d]) => `<tr><td class="td-style text-left font-semibold">${name}</td><td class="td-style">${d.fillupCount}</td><td class="td-style">${d.totalLiters.toFixed(2)} L</td><td class="td-style">${d.totalKm.toLocaleString('pt-BR')} km</td><td class="td-style font-medium">R$ ${d.totalValue.toFixed(2).replace(',', '.')}</td></tr>`).join('')}</tbody><tfoot class="bg-slate-100 font-bold"><tr><td class="td-style text-left">TOTAL DO MÊS</td><td class="td-style">${grandTotalFillups}</td><td class="td-style">${grandTotalLiters.toFixed(2)} L</td><td class="td-style">${grandTotalKm.toLocaleString('pt-BR')} km</td><td class="td-style text-base text-green-700">R$ ${grandTotalValue.toFixed(2).replace(',', '.')}</td></tr></tfoot></table></div>`;
            }).catch(err => { document.getElementById('report-results').innerHTML = `<p class="text-center text-red-500 py-8">${err.message}</p>`; });
        };
        
        const switchTab = (tabToActivate) => {
            const isActiveReport = tabToActivate === 'report';
            overviewTabButton.className = `fuel-summary-tab whitespace-nowrap py-3 px-1 border-b-2 font-medium text-sm ${!isActiveReport ? 'text-indigo-600 border-indigo-500' : 'text-gray-500 border-transparent hover:text-gray-700'}`;
            reportTabButton.className = `fuel-summary-tab whitespace-nowrap py-3 px-1 border-b-2 font-medium text-sm ${isActiveReport ? 'text-indigo-600 border-indigo-500' : 'text-gray-500 border-transparent hover:text-gray-700'}`;
            if (isActiveReport) {
                const today = new Date();
                renderReportView(`${today.getFullYear()}-${String(today.getMonth() + 1).padStart(2, '0')}`);
            } else {
                renderOverviewView(allFuelLogs);
            }
        };

        overviewTabButton.addEventListener('click', () => switchTab('overview'));
        reportTabButton.addEventListener('click', () => switchTab('report'));

        DataService.getHistoricoCombustivel({}, currentUser.role).then(result => {
            allFuelLogs = result.data;
            renderOverviewView(allFuelLogs);
        }).catch(err => { tabContent.innerHTML = `<p class="text-center text-red-500 py-8">${err.message}</p>`; });
    };
    fullRenderFunction();
}

/**
 * Abre o modal de resumo de combustível.
 */
function openFuelSummaryModal() {
    showInfoModal('Resumo de Combustível', 'Carregando...');
    renderFuelSummaryContent();
}

// Adiciona o novo evento de clique ao card
if (cardDashboardFuel) {
    cardDashboardFuel.addEventListener('click', openFuelSummaryModal);
}
// SUBSTITUA O BLOCO DO MODAL DE CLIENTES POR ESTE:

const cardDashboardClients = document.getElementById('card-dashboard-clients');

/**
 * Monta o conteúdo do modal de resumo de clientes com detalhes da última atividade e histórico.
 * (VERSÃO FINAL E DETALHADA)
 */
    function renderClientsSummaryContent() {
        const contentContainer = document.getElementById('generic-modal-content');
        contentContainer.innerHTML = `
        <div class="mb-4"><input class="w-full p-2 border border-gray-300 rounded-md" type="text" id="clients-summary-search" placeholder="Buscar por nome do cliente..." /></div>
        <div id="clients-list-container" class="max-h-[60vh] overflow-y-auto pr-2"><div class="text-center py-8"><i class="fas fa-spinner fa-spin text-indigo-600 text-2xl"></i></div></div>
        `;

        const listContainer = document.getElementById('clients-list-container');
        const searchInput = document.getElementById('clients-summary-search');

        DataService.getClientActivityDetails(currentUser.role)
        .then(result => {
        const allClientsData = result.data;

        const renderList = (clientsToRender) => {
            if (!Array.isArray(clientsToRender) || clientsToRender.length === 0) {
                listContainer.innerHTML = emptyStateHTML('Nenhum cliente encontrado.', 'fas fa-user-friends');
                return;
            }
            
            listContainer.innerHTML = clientsToRender.map(client => {
                const lastActivity = client.activities && client.activities.length > 0 ? client.activities[0] : null;

                // --- INÍCIO DA CORREÇÃO ---
                // Prioriza a torre/setor da última atividade. Se não houver, usa a do cadastro do cliente.
                const displayTower = lastActivity?.tower || client.tower || 'N/A';
                const displaySector = lastActivity?.sector || client.sector || 'N/A';
                // --- FIM DA CORREÇÃO ---

                let lastActivityHtml = '<p class="text-sm text-slate-500 italic">Nenhuma atividade registrada.</p>';
                if(lastActivity) {
                    const date = new Date(lastActivity.date).toLocaleString('pt-BR', { day: '2-digit', month: '2-digit', year: 'numeric' });
                    lastActivityHtml = `<p class="text-sm text-slate-600"><strong>Último Serviço:</strong> ${lastActivity.reason} por ${lastActivity.userName} em ${date}</p>`;
                }
                
                const historyHtml = client.activities && client.activities.length > 0 
                    ? client.activities.map(activity => {
                        const patrimonioHtml = activity.patrimonios_details && activity.patrimonios_details.length > 0
                            ? activity.patrimonios_details.map(p => `<li>${p.productName} - ${p.patrimonio}</li>`).join('')
                            : '';
                        
                        const consumablesHtml = activity.consumiveis_details && activity.consumiveis_details.length > 0
                            ? activity.consumiveis_details.map(c => `<li>${c.productName} - ${c.quantidade} und.</li>`).join('')
                            : '';

                        const cableHtml = activity.metragem_cabo > 0 
                            ? `<li>Cabo Utilizado - ${activity.metragem_cabo} metros</li>` 
                            : '';

                        const itemsHtml = (patrimonioHtml + consumablesHtml + cableHtml) || '<li class="text-xs text-slate-400 italic list-none">Nenhum item registrado nesta atividade.</li>';
                        const activityDate = new Date(activity.date).toLocaleDateString('pt-BR');

                        return `
                            <div class="mt-2 pt-2 border-t border-dashed">
                                <p class="font-semibold text-xs text-slate-500">${activity.reason} em ${activityDate}</p>
                                <ul class="list-disc list-inside pl-2 text-sm">${itemsHtml}</ul>
                            </div>
                        `;
                    }).join('')
                    : '<p class="text-sm text-slate-500 italic p-2">Sem histórico de atividades.</p>';

                return `
                    <div class="bg-slate-50 border rounded-lg p-4 mb-3">
                        <h4 class="font-bold text-slate-800">${client.name}</h4>
                        
                        <p class="text-xs text-slate-500">Torre: ${displayTower} - Setor: ${displaySector}</p>
                        
                        <div class="mt-3 pt-3 border-t">${lastActivityHtml}</div>
                        
                        <details class="mt-2 text-sm">
                            <summary class="cursor-pointer font-semibold text-indigo-600 hover:underline">Ver Histórico Detalhado</summary>
                            <div class="mt-2 bg-white p-2 rounded-md border">${historyHtml}</div>
                        </details>
                    </div>`;
            }).join('');
        };

        renderList(allClientsData);
        searchInput.addEventListener('keyup', () => {
            const searchTerm = searchInput.value.toLowerCase().trim();
            const filteredClients = allClientsData.filter(c => c.name && c.name.toLowerCase().includes(searchTerm));
            renderList(filteredClients);
        });
        }).catch(error => {
        listContainer.innerHTML = `<p class="text-center text-red-500 py-8">${error.message}</p>`;
        });
    }

/**
 * Abre o modal de resumo de clientes.
 */
function openClientsSummaryModal() {
    showInfoModal('Resumo de Clientes', 'Carregando...');
    renderClientsSummaryContent();
}

// Adiciona o novo evento de clique ao card
if (cardDashboardClients) {
    cardDashboardClients.addEventListener('click', openClientsSummaryModal);
}
// [NOVO] Função para renderizar o gráfico de atividades de clientes
async function renderClientActivityChart(filterDate) {
    try {
        if (!filterDate) {
            const today = new Date();
            filterDate = `${today.getFullYear()}-${String(today.getMonth() + 1).padStart(2, '0')}`;
        }
        const [year, month] = filterDate.split('-');

        const filteredActivities = clientActivities.filter(act => {
            if (!act.date) return false;
            const d = new Date(act.date);
            return d.getFullYear() === parseInt(year, 10) && (d.getMonth() + 1) === parseInt(month, 10);
        });

        // CONTAGEM 1: Tipos de Serviço
        const reasonCounts = filteredActivities.reduce((acc, act) => {
            const reason = act.reason || 'Outros';
            acc[reason] = (acc[reason] || 0) + 1;
            return acc;
        }, {});
        const sortedReasons = Object.entries(reasonCounts).sort((a, b) => b[1] - a[1]);

        // CONTAGEM 2: Clientes
        const clientCounts = filteredActivities.reduce((acc, act) => {
            const client = act.clientName || 'Desconhecido';
            acc[client] = (acc[client] || 0) + 1;
            return acc;
        }, {});
        
        const allClientsChart = Object.entries(clientCounts).sort((a, b) => b[1] - a[1]);

        // =========================================================
        // INSERÇÃO SEGURA DO RESUMO E TÍTULO FIXO
        // =========================================================
        const chartCanvas = document.getElementById('clientActivityChart');
        const chartWrapper = chartCanvas.parentElement; 
        
        let summaryContainer = document.getElementById('activity-chart-summary');
        
        if (!summaryContainer) {
            summaryContainer = document.createElement('div');
            summaryContainer.id = 'activity-chart-summary';
            chartWrapper.parentNode.insertBefore(summaryContainer, chartWrapper);
        }

        summaryContainer.className = 'mb-2 mt-4';
        summaryContainer.innerHTML = `
            <div class="grid grid-cols-1 md:grid-cols-2 gap-4 mb-6">
                <div class="bg-indigo-50 border border-indigo-100 rounded-lg p-4 shadow-sm">
                    <h4 class="font-bold text-indigo-800 mb-3 text-sm border-b border-indigo-200 pb-2">
                        <i class="fas fa-tools mr-1"></i> Serviços Realizados (Totais)
                    </h4>
                    <ul class="text-sm text-slate-700 space-y-2 max-h-32 overflow-y-auto pr-2">
                        ${sortedReasons.length > 0 
                            ? sortedReasons.map(([reason, count]) => `
                                <li class="flex justify-between items-center border-b border-indigo-100 pb-1 last:border-0">
                                    <span class="font-medium">${reason}</span> 
                                    <span class="font-bold bg-white text-indigo-700 px-2 py-0.5 rounded shadow-sm border border-indigo-100">${count}</span>
                                </li>`).join('')
                            : '<li>Nenhum serviço prestado neste mês.</li>'}
                    </ul>
                </div>
                
                <div class="bg-slate-50 border border-slate-200 rounded-lg p-4 shadow-sm flex flex-col justify-center items-center text-center">
                    <h4 class="text-slate-500 font-bold uppercase tracking-wider text-xs mb-2">Total de Chamados no Mês</h4>
                    <p class="text-5xl font-black text-indigo-600">${filteredActivities.length}</p>
                    <p class="text-xs font-medium text-slate-500 mt-2 bg-slate-200 px-2 py-1 rounded-md">Atendendo ${allClientsChart.length} clientes diferentes</p>
                </div>
            </div>

            <div class="text-center mb-2 mt-6">
                <h3 class="text-slate-700 font-bold text-sm md:text-base uppercase tracking-wider">Volume de Solicitações por Cliente</h3>
                ${allClientsChart.length > 6 ? `<p class="text-[10px] md:text-xs text-slate-400 mt-1 flex justify-center items-center gap-1"><i class="fas fa-arrows-alt-v text-indigo-400 animate-pulse"></i> Deslize para BAIXO para ver a lista completa</p>` : ''}
            </div>
        `;

        // =========================================================
        // MÁGICA DO GRÁFICO VERTICAL COM NOMES DEITADOS PERFEITOS
        // =========================================================
        // Troca as classes do wrapper para permitir scroll vertical, não mais horizontal
        chartWrapper.classList.remove('overflow-x-auto');
        chartWrapper.classList.add('overflow-y-auto', 'overflow-x-hidden', 'pr-2');
        
        // Define uma altura máxima visual para o container, para não empurrar a tela inteira para baixo
        chartWrapper.style.maxHeight = "400px"; 
        
        // Calcula a altura interna que o gráfico precisa para caber todo mundo (ex: 35px de altura por cliente)
        const dynamicHeight = Math.max(300, allClientsChart.length * 35);
        chartCanvas.style.minHeight = `${dynamicHeight}px`;
        chartCanvas.style.height = `${dynamicHeight}px`;
        chartCanvas.style.width = "100%";

        // =========================================================
        // DESENHANDO O GRÁFICO (DEITADO)
        // =========================================================
        const ctx = chartCanvas.getContext('2d');
        if (clientActivityChart) clientActivityChart.destroy();

        clientActivityChart = new Chart(ctx, {
            type: 'bar',
            data: {
                labels: allClientsChart.map(item => item[0]), // Nomes dos Clientes na lateral
                datasets: [{
                    label: 'Nº de Solicitações',
                    data: allClientsChart.map(item => item[1]), // Quantidades nas barras
                    backgroundColor: 'rgba(79, 70, 229, 0.8)',
                    borderColor: 'rgba(79, 70, 229, 1)',
                    borderWidth: 1,
                    borderRadius: 4,
                }]
            },
            options: {
                indexAxis: 'y', // <--- A MÁGICA: DEITA O GRÁFICO (HORIZONTAL BAR CHART)
                responsive: true,
                maintainAspectRatio: false,
                scales: {
                    x: { // Agora o Eixo X é de NÚMEROS
                        beginAtZero: true,
                        ticks: { stepSize: 1 }
                    },
                    y: { // Agora o Eixo Y é de NOMES
                        ticks: {
                            autoSkip: false, // Força a mostrar o nome de TODOS os clientes
                            font: { size: 11 } // Tamanho da fonte amigável para celular
                        }
                    }
                },
                plugins: {
                    legend: { display: false },
                    title: { display: false }, // Oculto aqui porque usamos o nosso título HTML fixo
                    tooltip: {
                        callbacks: {
                            label: function(context) {
                                return ` ${context.parsed.x} solicitações`; // Atualizado para context.parsed.x
                            }
                        }
                    }
                }
            }
        });

    } catch (error) {
        console.error("Erro ao renderizar gráfico de atividades:", error);
    }
}

// ===================================================================
    // ===== LÓGICA DO MÓDULO DE PONTO (INTEGRADA E SEGURA) =====
    // ===================================================================

    // 1. Função Global para abrir a aba (Precisa ser window. para o onclick do HTML funcionar)
    window.abrirModuloPonto = function(destino) {
        // Pega o usuário da sessão atual para garantir
        const sessionUser = sessionStorage.getItem('currentUser');
        
        if (!sessionUser) {
            Swal.fire('Erro', 'Sessão não encontrada. Faça login novamente.', 'error');
            return;
        }

        // Salva na "Ponte" (LocalStorage) para a nova aba conseguir ler
        localStorage.setItem('ponto_auth_user', sessionUser);

        // Abre a nova aba
        window.open(destino, '_blank');
    };

    // 2. Lógica do Clique no Card Roxo
    const cardPontoDashboard = document.getElementById('card-dashboard-ponto');

    if (cardPontoDashboard) {
        cardPontoDashboard.style.cursor = 'pointer';

        cardPontoDashboard.addEventListener('click', function() {
            // Verifica permissão usando a variável currentUser que JÁ EXISTE aqui dentro
            const role = currentUser ? currentUser.role : '';
            const isGestor = ['Desenvolvedor', 'Administrador', 'Estoquista'].includes(role);

            // Conteúdo do Modal
            const content = `
                <div class="flex flex-col gap-6 p-4">
                    <p class="text-center text-slate-500 text-sm">Selecione o módulo:</p>
                    <div class="grid grid-cols-1 md:grid-cols-2 gap-4">
                        
                        <div onclick="window.abrirModuloPonto('gestao_ponto/index.html')" class="group flex flex-col items-center justify-center p-6 bg-white border-2 border-indigo-100 rounded-2xl hover:border-indigo-500 hover:bg-indigo-50 cursor-pointer text-center transition-all shadow-sm">
                            <div class="w-12 h-12 bg-indigo-100 text-indigo-600 rounded-full flex items-center justify-center text-2xl mb-3"><i class="fas fa-fingerprint"></i></div>
                            <h4 class="font-bold text-indigo-900">Registrar Ponto</h4>
                            <p class="text-xs text-slate-500 mt-1">Funcionário</p>
                        </div>

                        <div onclick="window.abrirModuloPonto('gestao_ponto/admin.html')" : "Swal.fire('Acesso Restrito', 'Apenas gestores.', 'warning')"}" class="group flex flex-col items-center justify-center p-6 bg-white border-2 border-slate-100 rounded-2xl ${isGestor ? 'hover:border-emerald-500 hover:bg-emerald-50 cursor-pointer' : 'opacity-50 cursor-not-allowed grayscale'} text-center transition-all shadow-sm">
                            <div class="w-12 h-12 bg-emerald-100 text-emerald-600 rounded-full flex items-center justify-center text-2xl mb-3"><i class="fas fa-chart-pie"></i></div>
                            <h4 class="font-bold text-slate-800">Painel RH</h4>
                            <p class="text-xs text-slate-500 mt-1">Gestão</p>
                        </div>

                    </div>
                    <div class="text-center mt-4 pt-2 border-t border-gray-100">
                        <span class="text-[10px] text-gray-400 uppercase tracking-widest">Módulo Integrado</span>
                    </div>
                </div>
            `;

            // Usa a função showInfoModal que JÁ EXISTE aqui dentro
            showInfoModal('Controle de Ponto', content);
        });
    }

    // ===================================================================
    // ===== MÓDULO PONTO: LÓGICA DE INTEGRAÇÃO (STEP-BY-STEP) =====
    // ===================================================================

    // 1. Função Global para abrir o sistema de ponto
    window.abrirModuloPonto = function(caminho) {
    const sessionData = sessionStorage.getItem('currentUser');
    if (!sessionData) {
        Swal.fire('Erro', 'Sessão inválida.', 'error');
        return;
    }
    // Salva na "ponte" para a nova aba ler
    localStorage.setItem('ponto_auth_user', sessionData);
    window.open(caminho, '_blank');
    };

    // 2. Listener do Card "Controle de Ponto"
    const cardPonto = document.getElementById('card-dashboard-ponto');
    if (cardPonto) {
        cardPonto.style.cursor = 'pointer';
        
        cardPonto.addEventListener('click', function() {
            // Verifica se é gestor (para habilitar o botão verde)
            const isGestor = ['Desenvolvedor', 'Administrador', 'Estoquista'].includes(currentUser.role);

            // Cria o Modal
            const content = `
                <div class="flex flex-col gap-6 p-4">
                    <p class="text-center text-slate-500 text-sm">Selecione o módulo:</p>
                    <div class="grid grid-cols-1 md:grid-cols-2 gap-4">
                        
                        <div onclick="window.abrirModuloPonto('gestao_ponto/index.html')" class="group flex flex-col items-center justify-center p-6 bg-white border-2 border-indigo-100 rounded-2xl hover:border-indigo-500 cursor-pointer text-center transition-all shadow-sm">
                            <div class="w-12 h-12 bg-indigo-100 text-indigo-600 rounded-full flex items-center justify-center text-2xl mb-3"><i class="fas fa-fingerprint"></i></div>
                            <h4 class="font-bold text-indigo-900">Registrar Ponto</h4>
                            <p class="text-xs text-slate-500 mt-1">Funcionário</p>
                        </div>

                        <div onclick="${isGestor ? "window.abrirModuloPonto('gestao_ponto/admin.html')" : "Swal.fire('Acesso Restrito', 'Apenas gestores.', 'warning')"}" class="group flex flex-col items-center justify-center p-6 bg-white border-2 border-slate-100 rounded-2xl ${isGestor ? 'hover:border-emerald-500 cursor-pointer' : 'opacity-50 cursor-not-allowed grayscale'} text-center transition-all shadow-sm">
                            <div class="w-12 h-12 bg-emerald-100 text-emerald-600 rounded-full flex items-center justify-center text-2xl mb-3"><i class="fas fa-chart-pie"></i></div>
                            <h4 class="font-bold text-slate-800">Painel RH</h4>
                            <p class="text-xs text-slate-500 mt-1">Gestão</p>
                        </div>

                    </div>
                    <div class="text-center mt-4 pt-2 border-t border-gray-100">
                        <span class="text-[10px] text-gray-400 uppercase tracking-widest">Módulo Integrado v4.0</span>
                    </div>
                </div>
            `;

            showInfoModal('Controle de Ponto', content);
        });
    }
    // --- NOVA FUNÇÃO: VERIFICA NO BANCO ANTES DE ABRIR A JANELA ---
    window.tentarAcessarPainelAdmin = async function() {
        const sessionData = sessionStorage.getItem('currentUser');
        if (!sessionData) return;
        const localUser = JSON.parse(sessionData);

        // Mostra um "Carregando" rápido
        const loadingSwal = Swal.fire({
            title: 'Verificando permissões...',
            allowOutsideClick: false,
            didOpen: () => Swal.showLoading(),
            background: 'transparent',
            color: 'white',
            backdrop: 'rgba(0,0,0,0.8)'
        });

        try {
            // Pergunta direto para o banco de dados (API)
            const resp = await fetch('gestao_ponto/api.php', {
                method: 'POST',
                body: JSON.stringify({
                    acao: 'checar_permissao',
                    usuario_id: localUser.id
                })
            });
            
            const json = await resp.json();
            
            Swal.close(); // Fecha o carregando

            if (json.status === 'sucesso' && json.nivel === 'admin') {
                // SE FOR ADMIN: Abre a janela
                window.abrirModuloPonto('gestao_ponto/admin.html');
            } else {
                // SE FOR COMUM: Mostra erro e NÃO ABRE nada
                Swal.fire({
                    icon: 'error',
                    title: 'Acesso Negado',
                    text: 'Seu usuário não possui nível de Administrador no banco de dados.',
                    confirmButtonColor: '#4f46e5'
                });
            }
        } catch (error) {
            Swal.close();
            console.error(error);
            Swal.fire('Erro', 'Não foi possível verificar as permissões.', 'error');
        }
    };
    // --- FUNÇÃO MOVIDA PARA DENTRO DO ESCOPO (Resolve o erro showInfoModal) ---
    window.exibirModalPonto = function() {
        const sessionData = sessionStorage.getItem('currentUser');
        if (!sessionData) {
            Swal.fire('Erro', 'Sessão não encontrada.', 'error');
            return;
        }

        const content = `
            <div class="flex flex-col gap-6 p-4">
                <p class="text-center text-slate-500 text-sm">Selecione o módulo:</p>
                <div class="grid grid-cols-1 md:grid-cols-2 gap-4">
                    
                    <div onclick="window.abrirModuloPonto('gestao_ponto/index.html')" class="group flex flex-col items-center justify-center p-6 bg-white border-2 border-indigo-100 rounded-2xl hover:border-indigo-500 cursor-pointer text-center transition-all shadow-sm">
                        <div class="w-12 h-12 bg-indigo-100 text-indigo-600 rounded-full flex items-center justify-center text-2xl mb-3"><i class="fas fa-fingerprint"></i></div>
                        <h4 class="font-bold text-indigo-900">Registrar Ponto</h4>
                        <p class="text-xs text-slate-500 mt-1">Funcionário</p>
                    </div>

                    <div onclick="window.tentarAcessarPainelAdmin()" class="group flex flex-col items-center justify-center p-6 bg-white border-2 border-slate-100 rounded-2xl hover:border-emerald-500 cursor-pointer text-center transition-all shadow-sm">
                        <div class="w-12 h-12 bg-emerald-100 text-emerald-600 rounded-full flex items-center justify-center text-2xl mb-3"><i class="fas fa-chart-pie"></i></div>
                        <h4 class="font-bold text-slate-800">Painel RH</h4>
                        <p class="text-xs text-slate-500 mt-1">Gestão</p>
                    </div>

                </div>
                <div class="text-center mt-4 pt-2 border-t border-gray-100">
                    <span class="text-[10px] text-gray-400 uppercase tracking-widest">Módulo Integrado</span>
                </div>
            </div>
        `;

        showInfoModal('Controle de Ponto', content);
    }

    
    // Atualiza o listener do Card Roxo (apenas se ele existir na tela)
    const cardPontoRef = document.getElementById('card-dashboard-ponto');
    if (cardPontoRef) {
        cardPontoRef.style.cursor = 'pointer';
        cardPontoRef.addEventListener('click', window.exibirModalPonto);
    }

    checkLoginStatus(); 
    applyStyles();

});

// Listener genérico para fechar QUALQUER modal
document.body.addEventListener('click', function(event) {
    // Procura por um botão com a classe 'modal-close-button'
    const closeButton = event.target.closest('.modal-close-button');
    if (closeButton) {
        // Encontra o modal pai mais próximo com a classe 'modal-overlay' e o esconde
        const modalToClose = closeButton.closest('.modal-overlay');
        if (modalToClose) {
            modalToClose.classList.add('hidden');
        }
    }
});