<?php
// =============================================
// 🔥 PROCESSAR AJAX ANTES DE QUALQUER HTML
// =============================================

// Verificar se é uma requisição AJAX
$isAjax = isset($_GET['ajax']) || isset($_POST['ajax']);

// =============================================
// 🔥 FUNÇÕES GLOBAIS (DEFINIDAS ANTES DE QUALQUER CONDIÇÃO)
// =============================================

// 🔥 FUNÇÃO CORRIGIDA PARA FORMATAR DESCRIÇÃO DO SERVIÇO (PADRÃO TABELA COM LINHAS E COLUNAS)
function formatarDescricaoServico($itens) {
    // Se não houver itens, retorna vazio
    if (empty($itens) || !is_array($itens)) {
        return '';
    }
    
    $resultado = '';
    $totalNota = 0;
    $contador = 0;
    $totalItens = count($itens);
    
    // Para cada item, monta a linha da tabela
    foreach ($itens as $item) {
        $descricao = isset($item['descricao']) ? trim($item['descricao']) : '';
        
        // 🔥 CORREÇÃO: Usar mb_convert_case para preservar acentos
        $descricaoUpper = mb_convert_case($descricao, MB_CASE_UPPER, 'UTF-8');
        
        // Garantir que o charset está correto
        if (!mb_check_encoding($descricaoUpper, 'UTF-8')) {
            $descricaoUpper = utf8_encode($descricaoUpper);
        }
        
        $quantidade = isset($item['quantidade']) ? (float)$item['quantidade'] : 1;
        $valorUnitario = isset($item['valor_unitario']) ? (float)$item['valor_unitario'] : 0;
        $subTotal = $quantidade * $valorUnitario;
        $totalNota += $subTotal;
        
        // Formatar valores
        $qtdFormatada = number_format($quantidade, 0, ',', '.');
        $valorUnitarioFormatado = number_format($valorUnitario, 2, ',', '.');
        $subTotalFormatado = number_format($subTotal, 2, ',', '.');
        
        // 🔥 Monta a linha da tabela com a descrição em maiúsculas (com acentos preservados)
        $resultado .= "Descrição: {$descricaoUpper} QTD: {$qtdFormatada} Valor: Unid: R$ {$valorUnitarioFormatado} Sub Total: R$ {$subTotalFormatado}";
        
        // 🔥 CORREÇÃO: Adiciona DUPLA quebra de linha após cada item (exceto no último)
        if ($contador < $totalItens - 1) {
            $resultado .= "\n\n"; // Dupla quebra de linha para separar os itens
        } else {
            $resultado .= "\n"; // Apenas uma quebra de linha no último item
        }
        
        $contador++;
    }
    
    // Adiciona o total da nota com quebra de linha dupla antes
    $resultado .= "\nTOTAL DA NOTA R$ " . number_format($totalNota, 2, ',', '.') . "\n";
    
    return $resultado;
}

// 🔥 FUNÇÃO AUXILIAR PARA FORMATAR DESCRIÇÃO EM MAIÚSCULAS COM ACENTOS
function formatarDescricaoMaiuscula($descricao) {
    // Converter para maiúsculas mantendo acentos
    $descricaoUpper = mb_convert_case($descricao, MB_CASE_UPPER, 'UTF-8');
    
    // Garantir que o charset está correto
    if (!mb_check_encoding($descricaoUpper, 'UTF-8')) {
        $descricaoUpper = utf8_encode($descricaoUpper);
    }
    
    return $descricaoUpper;
}

// 🔥 FUNÇÃO CORRIGIDA PARA BUSCAR ALÍQUOTA ISS
// REGRA: Se município de prestação == município do emitente -> usa aliquota_iss do emitente
//        Se for diferente -> busca na tabela municipios_iss
function buscarAliquotaISS($codigoMunicipioPrestacao, $emitenteId, $pdo) {
    // 1. Buscar o código do município do emitente
    $stmt = $pdo->prepare("
        SELECT e.id, e.aliquota_iss, end.codigo_municipio as codigo_municipio_emitente
        FROM emitentes e
        LEFT JOIN enderecos end ON e.endereco_id = end.id
        WHERE e.id = ?
    ");
    $stmt->execute([$emitenteId]);
    $emitente = $stmt->fetch(PDO::FETCH_ASSOC);
    
    if (!$emitente) {
        return null;
    }
    
    $codigoMunicipioEmitente = (int)($emitente['codigo_municipio_emitente'] ?? 0);
    $aliquotaEmitente = (float)($emitente['aliquota_iss'] ?? 0);
    
    // 2. Se o município de prestação for igual ao do emitente, usa a alíquota do emitente
    if ($codigoMunicipioPrestacao == $codigoMunicipioEmitente && $aliquotaEmitente > 0) {
        return [
            'aliquota' => $aliquotaEmitente,
            'origem' => 'emitente',
            'codigo_municipio' => $codigoMunicipioEmitente,
            'mensagem' => 'Usando alíquota do emitente (mesmo município)'
        ];
    }
    
    // 3. Se for diferente, busca na tabela municipios_iss
    if ($codigoMunicipioPrestacao > 0) {
        $stmt = $pdo->prepare("
            SELECT aliquota_iss, codigo_municipio, nome_municipio, uf
            FROM municipios_iss 
            WHERE codigo_municipio = ? AND ativo = 1
            LIMIT 1
        ");
        $stmt->execute([$codigoMunicipioPrestacao]);
        $municipio = $stmt->fetch(PDO::FETCH_ASSOC);
        
        if ($municipio && !empty($municipio['aliquota_iss'])) {
            return [
                'aliquota' => (float)$municipio['aliquota_iss'],
                'origem' => 'municipios_iss',
                'codigo_municipio' => (int)$municipio['codigo_municipio'],
                'nome_municipio' => $municipio['nome_municipio'],
                'uf' => $municipio['uf'],
                'mensagem' => 'Usando alíquota da tabela municipios_iss'
            ];
        }
    }
    
    // 4. Fallback: se não encontrar em lugar nenhum, usa a do emitente mesmo
    if ($aliquotaEmitente > 0) {
        return [
            'aliquota' => $aliquotaEmitente,
            'origem' => 'emitente_fallback',
            'codigo_municipio' => $codigoMunicipioEmitente,
            'mensagem' => 'Fallback: usando alíquota do emitente'
        ];
    }
    
    return null;
}

// 🔥 FUNÇÃO PARA BUSCAR ALÍQUOTA POR MUNICÍPIO (APENAS TABELA MUNICIPIOS_ISS)
function buscarAliquotaPorMunicipio($codigoMunicipio, $pdo) {
    if (empty($codigoMunicipio) || $codigoMunicipio == 0) {
        return null;
    }
    
    $stmt = $pdo->prepare("
        SELECT aliquota_iss 
        FROM municipios_iss 
        WHERE codigo_municipio = ? AND ativo = 1
        LIMIT 1
    ");
    $stmt->execute([$codigoMunicipio]);
    $resultado = $stmt->fetch(PDO::FETCH_ASSOC);
    
    if ($resultado) {
        return (float)$resultado['aliquota_iss'];
    }
    return null;
}

// 🔥 FUNÇÃO PARA ENVIAR E-MAIL (CORRIGIDA - PERMITE REENVIO E ANEXA XML)
function enviarEmailNota($ref, $pdo, $forcar = false) {
    // Carregar PHPMailer
    $currentDir = __DIR__;
    $phpmailerLoaded = false;
    
    if (file_exists($currentDir . '/PHPMailer/src/PHPMailer.php')) {
        require_once $currentDir . '/PHPMailer/src/PHPMailer.php';
        require_once $currentDir . '/PHPMailer/src/SMTP.php';
        require_once $currentDir . '/PHPMailer/src/Exception.php';
        $phpmailerLoaded = true;
    } elseif (file_exists($currentDir . '/vendor/autoload.php')) {
        require_once $currentDir . '/vendor/autoload.php';
        $phpmailerLoaded = true;
    }
    
    if (!$phpmailerLoaded) {
        $erro = 'PHPMailer não disponível';
        $stmt = $pdo->prepare("UPDATE notas_fiscais SET erro_envio_email = ? WHERE ref = ?");
        $stmt->execute([$erro, $ref]);
        return ['sucesso' => false, 'erro' => $erro];
    }
    
    try {
        // Buscar dados da nota (INCLUINDO empresa_id para pegar o token)
        $stmt = $pdo->prepare("
            SELECT 
                n.*,
                t.razao_social as tomador_nome,
                t.email as tomador_email,
                t.cnpj as tomador_cnpj,
                t.cpf as tomador_cpf,
                e.razao_social as emitente_nome,
                e.cnpj as emitente_cnpj,
                emp.nome as empresa_nome,
                emp.token as empresa_token,
                emp.ambiente as empresa_ambiente
            FROM notas_fiscais n
            LEFT JOIN tomadores t ON n.tomador_id = t.id
            LEFT JOIN emitentes e ON n.emitente_id = e.id
            INNER JOIN empresas emp ON n.empresa_id = emp.id
            WHERE n.ref = ?
        ");
        $stmt->execute([$ref]);
        $nota = $stmt->fetch(PDO::FETCH_ASSOC);
        
        if (!$nota) {
            return ['sucesso' => false, 'erro' => 'Nota não encontrada'];
        }
        
        // Verificar se já tem PDF
        if (empty($nota['pdf_url'])) {
            $erro = 'PDF não disponível para esta nota';
            $stmt = $pdo->prepare("UPDATE notas_fiscais SET erro_envio_email = ? WHERE ref = ?");
            $stmt->execute([$erro, $ref]);
            return ['sucesso' => false, 'erro' => $erro];
        }
        
        // 🔥 VERIFICAR SE JÁ FOI ENVIADO (APENAS SE NÃO FOR REENVIO FORÇADO)
        if (!$forcar) {
            if (!empty($nota['data_envio_email'])) {
                return [
                    'sucesso' => true,
                    'mensagem' => 'E-mail já enviado anteriormente em ' . date('d/m/Y H:i', strtotime($nota['data_envio_email'])),
                    'pdf_url' => $nota['pdf_url'],
                    'xml_url' => $nota['xml_url']
                ];
            }
        }
        
        // Verificar se tomador tem email
        if (empty($nota['tomador_email'])) {
            $erro = 'Tomador não possui e-mail cadastrado';
            $stmt = $pdo->prepare("UPDATE notas_fiscais SET erro_envio_email = ? WHERE ref = ?");
            $stmt->execute([$erro, $ref]);
            return ['sucesso' => false, 'erro' => $erro];
        }
        
        // =============================================
        // CONFIGURAÇÕES DO E-MAIL
        // =============================================
        $smtpHost = 'mail.emissornotascontrolmaxerp.com.br';
        $smtpPort = 465;
        $smtpSecure = 'ssl';
        $smtpAuth = true;
        $smtpUser = 'naoresponda@emissornotascontrolmaxerp.com.br';
        $smtpPass = 'Canal4230@';
        $fromEmail = 'naoresponda@emissornotascontrolmaxerp.com.br';
        $fromName = 'Emissor Nacional - Notas Fiscais';
        
        $toEmail = $nota['tomador_email'];
        $toName = $nota['tomador_nome'] ?? 'Tomador';
        $subject = "Nota Fiscal Eletrônica - NFSe " . ($nota['numero_nfse'] ?? $nota['ref']);
        
        // =============================================
        // MONTAR CORPO DO E-MAIL (HTML)
        // =============================================
        $body = "
        <html>
        <head>
            <style>
                body { font-family: Arial, sans-serif; color: #333; }
                .container { max-width: 600px; margin: 0 auto; padding: 20px; border: 1px solid #ddd; border-radius: 10px; }
                .header { background: #28a745; color: white; padding: 15px; border-radius: 10px 10px 0 0; text-align: center; }
                .header h2 { margin: 0; }
                .content { padding: 20px; }
                .info { background: #f8f9fa; padding: 15px; border-radius: 5px; margin: 10px 0; }
                .info-item { display: flex; justify-content: space-between; padding: 5px 0; border-bottom: 1px solid #eee; }
                .info-item:last-child { border-bottom: none; }
                .label { font-weight: bold; color: #555; }
                .value { color: #333; }
                .footer { text-align: center; padding: 15px; font-size: 12px; color: #888; border-top: 1px solid #ddd; }
                .btn { display: inline-block; padding: 10px 20px; background: #28a745; color: white; text-decoration: none; border-radius: 5px; }
                .btn:hover { background: #218838; }
                .status-ok { color: #28a745; font-weight: bold; }
                .anexos-info { background: #e7f3ff; padding: 10px; border-radius: 5px; margin: 10px 0; font-size: 14px; }
                .anexos-info .ok { color: #28a745; }
                .anexos-info .aviso { color: #ffc107; }
                .descricao-servico { 
                    background: #f8f9fa; 
                    padding: 12px 15px; 
                    border-radius: 5px; 
                    margin: 10px 0;
                    font-family: monospace;
                    font-size: 13px;
                    white-space: pre-wrap;
                    border-left: 3px solid #28a745;
                }
            </style>
        </head>
        <body>
            <div class='container'>
                <div class='header'>
                    <h2>📄 Nota Fiscal Eletrônica</h2>
                </div>
                <div class='content'>
                    <p>Olá <strong>" . htmlspecialchars($toName) . "</strong>,</p>
                    <p>Segue em anexo a Nota Fiscal Eletrônica (NFSe) referente ao serviço prestado.</p>
                    
                    <div class='info'>
                        <div class='info-item'>
                            <span class='label'>📌 Número da NF:</span>
                            <span class='value'><strong>" . htmlspecialchars($nota['numero_nfse'] ?? '-') . "</strong></span>
                        </div>
                        <div class='info-item'>
                            <span class='label'>📅 Data Emissão:</span>
                            <span class='value'>" . date('d/m/Y H:i', strtotime($nota['data_emissao'] ?? $nota['criado_em'])) . "</span>
                        </div>
                        <div class='info-item'>
                            <span class='label'>💰 Valor:</span>
                            <span class='value'><strong>R$ " . number_format($nota['valor_servico'], 2, ',', '.') . "</strong></span>
                        </div>
                        <div class='info-item'>
                            <span class='label'>🏢 Emitente:</span>
                            <span class='value'>" . htmlspecialchars($nota['emitente_nome'] ?? '-') . "</span>
                        </div>
                        <div class='info-item'>
                            <span class='label'>📋 CNPJ Emitente:</span>
                            <span class='value'>" . (isset($nota['emitente_cnpj']) ? formatarCnpj($nota['emitente_cnpj']) : '-') . "</span>
                        </div>
                        <div class='info-item'>
                            <span class='label'>👤 Tomador:</span>
                            <span class='value'>" . htmlspecialchars($nota['tomador_nome'] ?? '-') . "</span>
                        </div>
                        <div class='info-item'>
                            <span class='label'>📋 Documento:</span>
                            <span class='value'>" . (isset($nota['tomador_cnpj']) && !empty($nota['tomador_cnpj']) ? formatarCnpj($nota['tomador_cnpj']) : (isset($nota['tomador_cpf']) ? formatarCpf($nota['tomador_cpf']) : '-')) . "</span>
                        </div>
                        <div class='info-item'>
                            <span class='label'>📊 Status:</span>
                            <span class='value'><span class='status-ok'>AUTORIZADO</span></span>
                        </div>
                        <div class='info-item'>
                            <span class='label'>🔗 Referência:</span>
                            <span class='value'><code>" . htmlspecialchars($nota['ref']) . "</code></span>
                        </div>
                    </div>
                    
                    <div class='anexos-info'>
                        <i class='bi bi-paperclip'></i> <strong>Anexos incluídos:</strong><br>
                        <span class='ok'>✅ PDF da Nota Fiscal</span><br>
                        " . (!empty($nota['xml_url']) ? "<span class='ok'>✅ XML da Nota Fiscal</span>" : "<span class='aviso'>⚠️ XML não disponível</span>") . "
                    </div>
                    
                    <p style='text-align: center; margin-top: 20px;'>
                        <a href='" . htmlspecialchars($nota['pdf_url']) . "' target='_blank' class='btn'>
                            📄 Baixar PDF da Nota
                        </a>
                    </p>
                    
                    <p style='margin-top: 15px; font-size: 14px; color: #666;'>
                        Este e-mail foi enviado automaticamente pelo sistema.
                        Para qualquer dúvida, entre em contato com a empresa emissora.
                    </p>
                </div>
                <div class='footer'>
                    <p>© " . date('Y') . " W7master Desenvolvimento de Software - Sistema de Emissão de Notas Fiscais</p>
                    <p><small>E-mail automático - Não responda a esta mensagem.</small></p>
                </div>
            </div>
        </body>
        </html>
        ";
        
        // =============================================
        // ENVIAR E-MAIL COM PHPMailer
        // =============================================
        $mail = new PHPMailer\PHPMailer\PHPMailer(true);
        
        $mail->isSMTP();
        $mail->Host       = $smtpHost;
        $mail->SMTPAuth   = $smtpAuth;
        $mail->Username   = $smtpUser;
        $mail->Password   = $smtpPass;
        $mail->SMTPSecure = $smtpSecure;
        $mail->Port       = $smtpPort;
        $mail->CharSet    = 'UTF-8';
        
        $mail->setFrom($fromEmail, $fromName);
        $mail->addAddress($toEmail, $toName);
        $mail->addReplyTo($fromEmail, $fromName);
        
        // 🔥 ANEXAR PDF
        $pdfContent = @file_get_contents($nota['pdf_url']);
        if ($pdfContent !== false) {
            $mail->addStringAttachment($pdfContent, 'NFSe_' . ($nota['numero_nfse'] ?? $nota['ref']) . '.pdf', 'base64', 'application/pdf');
        } else {
            error_log("⚠️ Falha ao baixar PDF para nota {$ref}: " . $nota['pdf_url']);
        }
        
        // 🔥 ANEXAR XML - CORRIGIDO COM AUTENTICAÇÃO
        if (!empty($nota['xml_url'])) {
            $xmlContent = null;
            $xmlUrl = $nota['xml_url'];
            
            // 🔥 VERIFICA SE É URL DA API FOCUS (precisa de autenticação)
            if (strpos($xmlUrl, 'api.focusnfe.com.br') !== false || strpos($xmlUrl, 'focusnfe') !== false) {
                // Busca o token da empresa (já veio na consulta)
                $token = $nota['empresa_token'] ?? null;
                
                if (empty($token)) {
                    // Tenta buscar novamente
                    $stmtToken = $pdo->prepare("SELECT token FROM empresas WHERE id = ?");
                    $stmtToken->execute([$nota['empresa_id']]);
                    $empresa = $stmtToken->fetch(PDO::FETCH_ASSOC);
                    $token = $empresa['token'] ?? null;
                }
                
                if (!empty($token)) {
                    // 🔥 GARANTE QUE TEM ?download=1
                    if (strpos($xmlUrl, '?download=1') === false) {
                        $xmlUrl .= (strpos($xmlUrl, '?') === false ? '?' : '&') . 'download=1';
                    }
                    
                    // 🔥 BAIXA O XML DA API FOCUS COM AUTENTICAÇÃO
                    $ch = curl_init();
                    curl_setopt($ch, CURLOPT_URL, $xmlUrl);
                    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                    curl_setopt($ch, CURLOPT_HTTPHEADER, [
                        'Authorization: Basic ' . base64_encode($token . ':'),
                        'Accept: application/xml'
                    ]);
                    curl_setopt($ch, CURLOPT_TIMEOUT, 30);
                    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
                    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
                    curl_setopt($ch, CURLOPT_HEADER, false);
                    
                    $xmlContent = curl_exec($ch);
                    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
                    $curlError = curl_error($ch);
                    curl_close($ch);
                    
                    if ($httpCode != 200 || empty($xmlContent)) {
                        error_log("⚠️ Falha ao baixar XML da Focus para nota {$ref}: HTTP {$httpCode} - " . ($curlError ?: ''));
                        $xmlContent = null;
                    } else {
                        error_log("✅ XML baixado com sucesso para nota {$ref} - Tamanho: " . strlen($xmlContent) . " bytes");
                    }
                } else {
                    error_log("⚠️ Token não encontrado para empresa ID: " . ($nota['empresa_id'] ?? 'N/A'));
                }
            } else {
                // 🔥 URL LOCAL (PROXY) - USA file_get_contents
                $xmlContent = @file_get_contents($xmlUrl);
                if ($xmlContent === false) {
                    error_log("⚠️ Falha ao baixar XML local para nota {$ref}: " . $xmlUrl);
                    $xmlContent = null;
                }
            }
            
            // 🔥 ANEXA O XML SE FOI BAIXADO COM SUCESSO
            if (!empty($xmlContent)) {
                $mail->addStringAttachment($xmlContent, 'NFSe_' . ($nota['numero_nfse'] ?? $nota['ref']) . '.xml', 'base64', 'application/xml');
                error_log("✅ XML anexado com sucesso para nota {$ref}");
            } else {
                error_log("⚠️ XML não pôde ser anexado para nota {$ref} - URL: " . ($nota['xml_url'] ?? 'vazio'));
            }
        } else {
            error_log("⚠️ XML URL vazio para nota {$ref}");
        }
        
        $mail->isHTML(true);
        $mail->Subject = $subject;
        $mail->Body    = $body;
        $mail->AltBody = strip_tags(str_replace(['<br>', '</p>', '<p>', '</div>'], "\n", $body));
        
        $mail->send();
        
        // 🔥 ATUALIZAR BANCO COM DATA DO ENVIO
        $stmt = $pdo->prepare("
            UPDATE notas_fiscais SET 
                enviado_por = 'email',
                data_envio_email = NOW(),
                erro_envio_email = NULL
            WHERE ref = ?
        ");
        $stmt->execute([$ref]);
        
        return [
            'sucesso' => true, 
            'mensagem' => 'E-mail enviado com sucesso para ' . $toEmail,
            'pdf_url' => $nota['pdf_url'],
            'xml_url' => $nota['xml_url'],
            'numero_nfse' => $nota['numero_nfse']
        ];
        
    } catch (Exception $e) {
        $erro = 'Erro ao enviar e-mail: ' . ($mail->ErrorInfo ?? $e->getMessage());
        $stmt = $pdo->prepare("UPDATE notas_fiscais SET erro_envio_email = ? WHERE ref = ?");
        $stmt->execute([$erro, $ref]);
        return ['sucesso' => false, 'erro' => $erro];
    }
}

// 🔥 FUNÇÃO PARA CONSULTAR NOTA NA API
function consultarNotaFocus($ref, $token, $ambiente = 'homologacao') {
    $baseUrl = ($ambiente == 'producao') 
        ? 'https://api.focusnfe.com.br/v2' 
        : 'https://homologacao.focusnfe.com.br/v2';
    
    $url = $baseUrl . '/nfsen/' . urlencode($ref);
    
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, [
        'Authorization: Basic ' . base64_encode($token . ':'),
        'Content-Type: application/json',
        'Accept: application/json'
    ]);
    curl_setopt($ch, CURLOPT_TIMEOUT, 30);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_HEADER, false);
    
    $resposta = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    $curlError = curl_error($ch);
    curl_close($ch);
    
    if ($httpCode == 404 || $curlError || $httpCode != 200) {
        return null;
    }
    
    $dados = json_decode($resposta, true);
    if (!$dados) {
        return null;
    }
    
    $resultado = [
        'status' => $dados['status'] ?? 'desconhecido',
        'ref' => $dados['ref'] ?? $ref,
        'protocolo' => $dados['protocolo'] ?? null,
        'numero' => $dados['numero'] ?? null,
        'data_emissao' => $dados['data_emissao'] ?? null,
        'valor_servico' => $dados['valor_servico'] ?? null,
    ];
    
    if (isset($dados['url_danfse'])) {
        $resultado['url_danfse'] = $dados['url_danfse'];
        $resultado['pdf_url'] = $dados['url_danfse'];
    }
    if (isset($dados['caminho_xml_nota_fiscal'])) {
        $resultado['caminho_xml_nota_fiscal'] = $dados['caminho_xml_nota_fiscal'];
        $resultado['xml_url'] = $dados['caminho_xml_nota_fiscal'];
    }
    if (isset($dados['nfse']) && is_array($dados['nfse'])) {
        $nfse = $dados['nfse'];
        if (isset($nfse['numero'])) $resultado['numero'] = $nfse['numero'];
        if (isset($nfse['url_danfse'])) {
            $resultado['url_danfse'] = $nfse['url_danfse'];
            $resultado['pdf_url'] = $nfse['url_danfse'];
        }
        if (isset($nfse['caminho_xml_nota_fiscal'])) {
            $resultado['caminho_xml_nota_fiscal'] = $nfse['caminho_xml_nota_fiscal'];
            $resultado['xml_url'] = $nfse['caminho_xml_nota_fiscal'];
        }
    }
    if (isset($dados['xml_url'])) $resultado['xml_url'] = $dados['xml_url'];
    if (isset($dados['pdf_url'])) $resultado['pdf_url'] = $dados['pdf_url'];
    
    if (empty($resultado['xml_url']) && !empty($resultado['numero'])) {
        $resultado['xml_url'] = $baseUrl . '/nfsen/xml/' . urlencode($ref);
    }
    if (empty($resultado['pdf_url']) && !empty($resultado['numero'])) {
        $resultado['pdf_url'] = $baseUrl . '/nfsen/' . urlencode($resultado['numero']) . '/danfse';
    }
    
    return $resultado;
}

// 🔥 FUNÇÃO PARA CANCELAR NOTA FISCAL
function cancelarNotaFocus($ref, $pdo, $justificativa = '', $tipo = 'nacional') {
    try {
        // Buscar dados da nota
        $stmt = $pdo->prepare("
            SELECT 
                n.*,
                e.token as empresa_token,
                e.ambiente as empresa_ambiente,
                e.nome as empresa_nome
            FROM notas_fiscais n
            INNER JOIN empresas e ON n.empresa_id = e.id
            WHERE n.ref = ? AND e.ativo = 1
        ");
        $stmt->execute([$ref]);
        $nota = $stmt->fetch(PDO::FETCH_ASSOC);
        
        if (!$nota) {
            return ['sucesso' => false, 'erro' => 'Nota fiscal não encontrada'];
        }
        
        // Verificar se a nota pode ser cancelada (apenas autorizada/aprovada)
        if (!in_array($nota['status'], ['autorizado', 'aprovado'])) {
            return [
                'sucesso' => false, 
                'erro' => 'Apenas notas com status "autorizado" podem ser canceladas. Status atual: ' . $nota['status']
            ];
        }
        
        // Verificar se já está cancelada
        if ($nota['status'] == 'cancelado') {
            return ['sucesso' => false, 'erro' => 'Nota já está cancelada'];
        }
        
        // Validar justificativa para NFSe padrão
        if ($tipo == 'padrao' && !empty($justificativa)) {
            $len = strlen($justificativa);
            if ($len < 15 || $len > 255) {
                return ['sucesso' => false, 'erro' => 'Justificativa deve ter entre 15 e 255 caracteres'];
            }
        }
        
        // Determinar o endpoint
        $baseUrl = ($nota['empresa_ambiente'] == 'producao') 
            ? 'https://api.focusnfe.com.br/v2' 
            : 'https://homologacao.focusnfe.com.br/v2';
        
        if ($tipo == 'nacional') {
            $endpoint = "/nfsen/" . urlencode($ref);
        } else {
            $endpoint = "/nfse/" . urlencode($ref);
        }
        
        $url = $baseUrl . $endpoint;
        
        // Montar payload
        $payload = [];
        if (!empty($justificativa)) {
            $payload['justificativa'] = $justificativa;
        }
        
        // Fazer requisição DELETE
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, [
            'Authorization: Basic ' . base64_encode($nota['empresa_token'] . ':'),
            'Content-Type: application/json',
            'Accept: application/json'
        ]);
        if (!empty($payload)) {
            curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload));
        }
        curl_setopt($ch, CURLOPT_TIMEOUT, 30);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
        curl_setopt($ch, CURLOPT_HEADER, false);
        
        $resposta = curl_exec($ch);
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        $curlError = curl_error($ch);
        curl_close($ch);
        
        if ($curlError) {
            return ['sucesso' => false, 'erro' => 'Erro de conexão: ' . $curlError];
        }
        
        $respostaJson = json_decode($resposta, true);
        
        // Processar resposta
        if ($httpCode == 200 || $httpCode == 204) {
            // Verificar se foi cancelado
            if (isset($respostaJson['status']) && $respostaJson['status'] == 'cancelado') {
                // Atualizar banco de dados
                $updateStmt = $pdo->prepare("
                    UPDATE notas_fiscais SET 
                        status = 'cancelado',
                        data_cancelamento = NOW(),
                        justificativa_cancelamento = ?,
                        mensagem_erro = NULL,
                        resposta_api = ?,
                        atualizado_em = NOW()
                    WHERE ref = ?
                ");
                $updateStmt->execute([$justificativa, $resposta, $ref]);
                
                return [
                    'sucesso' => true,
                    'mensagem' => 'Nota fiscal cancelada com sucesso',
                    'status' => 'cancelado',
                    'ref' => $ref,
                    'justificativa' => $justificativa
                ];
            }
            
            // Verificar se houve erro no cancelamento
            if (isset($respostaJson['status']) && $respostaJson['status'] == 'erro_cancelamento') {
                $erros = [];
                if (isset($respostaJson['erros']) && is_array($respostaJson['erros'])) {
                    foreach ($respostaJson['erros'] as $erro) {
                        $erros[] = $erro['mensagem'] ?? $erro['Descricao'] ?? 'Erro desconhecido';
                    }
                }
                $mensagemErro = implode('; ', $erros);
                
                // Atualizar banco com erro
                $updateStmt = $pdo->prepare("
                    UPDATE notas_fiscais SET 
                        mensagem_erro = ?,
                        resposta_api = ?,
                        atualizado_em = NOW()
                    WHERE ref = ?
                ");
                $updateStmt->execute([$mensagemErro, $resposta, $ref]);
                
                return [
                    'sucesso' => false,
                    'erro' => $mensagemErro,
                    'detalhes' => $respostaJson
                ];
            }
            
            // Se chegou aqui, resposta inesperada
            if (isset($respostaJson['status'])) {
                return [
                    'sucesso' => false,
                    'erro' => 'Status inesperado: ' . $respostaJson['status'],
                    'detalhes' => $respostaJson
                ];
            }
        }
        
        // Erro HTTP 404 - Nota não encontrada
        if ($httpCode == 404) {
            return ['sucesso' => false, 'erro' => 'Nota fiscal não encontrada na API Focus'];
        }
        
        // Erro HTTP 400 - Requisição inválida
        if ($httpCode == 400) {
            $mensagem = $respostaJson['mensagem'] ?? $respostaJson['error'] ?? 'Requisição inválida';
            return ['sucesso' => false, 'erro' => $mensagem];
        }
        
        // Outros erros
        return [
            'sucesso' => false,
            'erro' => 'Erro ao cancelar nota (HTTP ' . $httpCode . ')',
            'detalhes' => $respostaJson ?? $resposta
        ];
        
    } catch (Exception $e) {
        return ['sucesso' => false, 'erro' => 'Erro: ' . $e->getMessage()];
    }
}

// 🔥 FUNÇÃO PARA EMITIR NOTA (CORRIGIDA - COM LÓGICA DE ALÍQUOTA ISS E DESCRIÇÃO PADRONIZADA)
function emitirNota($ref, $pdo) {
    // Buscar dados completos da nota (rascunho)
    $stmt = $pdo->prepare("
        SELECT 
            n.*,
            e.id as emitente_id,
            e.razao_social as emitente_nome,
            e.cnpj as emitente_cnpj,
            e.inscricao_municipal as emitente_inscricao,
            e.aliquota_iss as emitente_aliquota,
            e.codigo_nbs as emitente_codigo_nbs,
            e.codigo_municipio_prestacao as emitente_municipio,
            e.tipo_retencao_iss as emitente_tipo_retencao,
            e.codigo_opcao_simples_nacional as emitente_regime,
            e.usar_ibs_cbs as emitente_usar_ibs_cbs,
            e.regime_tributario_simples_nacional as emitente_regime_simples,
            e.usar_tributacao_municipal as emitente_usar_tributacao,
            e.usar_inscricao_municipal as emitente_usar_inscricao,
            t.id as tomador_id,
            t.razao_social as tomador_nome,
            t.cnpj as tomador_cnpj,
            t.cpf as tomador_cpf,
            t.email as tomador_email,
            t.telefone as tomador_telefone,
            t.inscricao_municipal as tomador_inscricao,
            end_t.logradouro as tomador_logradouro,
            end_t.numero as tomador_numero,
            end_t.bairro as tomador_bairro,
            end_t.cidade as tomador_cidade,
            end_t.codigo_municipio as tomador_codigo_municipio,
            end_t.uf as tomador_uf,
            end_t.cep as tomador_cep,
            emp.nome as empresa_nome,
            emp.ambiente as empresa_ambiente,
            emp.token as empresa_token,
            emp.id as empresa_id
        FROM notas_fiscais n
        LEFT JOIN emitentes e ON n.emitente_id = e.id
        LEFT JOIN tomadores t ON n.tomador_id = t.id
        LEFT JOIN enderecos end_t ON t.endereco_id = end_t.id
        INNER JOIN empresas emp ON n.empresa_id = emp.id
        WHERE n.ref = ? AND n.status = 'rascunho'
    ");
    $stmt->execute([$ref]);
    $nota = $stmt->fetch(PDO::FETCH_ASSOC);
    
    if (!$nota) {
        return ['sucesso' => false, 'erro' => 'Nota não encontrada ou já emitida'];
    }
    
    // Buscar empresa para obter token e ambiente
    $stmt = $pdo->prepare("SELECT id, nome, token, ambiente FROM empresas WHERE id = ? AND ativo = 1");
    $stmt->execute([$nota['empresa_id']]);
    $empresa = $stmt->fetch(PDO::FETCH_ASSOC);
    
    if (!$empresa) {
        return ['sucesso' => false, 'erro' => 'Empresa não encontrada'];
    }
    
    // Decodificar payload
    $payload = json_decode($nota['payload_enviado'] ?? '{}', true);
    
    // ============================================================
    // 🔥 EXTRAIR MUNICÍPIOS DA NOTA
    // ============================================================
    $codigoMunicipioEmitente = (int)($nota['codigo_municipio_emissora'] ?? 0);
    $codigoMunicipioTomador = (int)($nota['codigo_municipio_tomador'] ?? 0);
    $codigoMunicipioPrestacao = (int)($nota['codigo_municipio_prestacao'] ?? 0);
    
    if ($codigoMunicipioEmitente == 0) {
        $stmtEnd = $pdo->prepare("SELECT e.*, end.codigo_municipio FROM emitentes e LEFT JOIN enderecos end ON e.endereco_id = end.id WHERE e.id = ?");
        $stmtEnd->execute([$nota['emitente_id']]);
        $emitenteEnd = $stmtEnd->fetch(PDO::FETCH_ASSOC);
        if ($emitenteEnd && !empty($emitenteEnd['codigo_municipio'])) {
            $codigoMunicipioEmitente = (int)$emitenteEnd['codigo_municipio'];
        }
    }
    if ($codigoMunicipioTomador == 0) {
        $stmtEnd = $pdo->prepare("SELECT t.*, end.codigo_municipio FROM tomadores t LEFT JOIN enderecos end ON t.endereco_id = end.id WHERE t.id = ?");
        $stmtEnd->execute([$nota['tomador_id']]);
        $tomadorEnd = $stmtEnd->fetch(PDO::FETCH_ASSOC);
        if ($tomadorEnd && !empty($tomadorEnd['codigo_municipio'])) {
            $codigoMunicipioTomador = (int)$tomadorEnd['codigo_municipio'];
        }
    }
    if ($codigoMunicipioPrestacao == 0) {
        $codigoMunicipioPrestacao = $codigoMunicipioEmitente;
    }
    
    if ($codigoMunicipioEmitente == 0 || $codigoMunicipioTomador == 0 || $codigoMunicipioPrestacao == 0) {
        $pdo->prepare("UPDATE notas_fiscais SET status = 'erro_autorizacao', mensagem_erro = ?, atualizado_em = NOW() WHERE ref = ? AND status = 'rascunho'")
            ->execute(['Código de município não encontrado', $ref]);
        return ['sucesso' => false, 'erro' => 'Código de município não encontrado'];
    }
    
    // ============================================================
    // 🔥 APLICAR REGRAS DA EMPRESA
    // ============================================================
    $empresaId = (int)$nota['empresa_id'];
    $codigoNBS = $nota['emitente_codigo_nbs'] ?? '124032200';
    $tipoRetencaoIss = (int)$nota['emitente_tipo_retencao'];
    $codigoOpcaoSimplesNacional = (int)$nota['emitente_regime'];
    $regimeTributarioSimplesNacional = $nota['emitente_regime_simples'] ?? null;
    $usarIbsCbs = (int)$nota['emitente_usar_ibs_cbs'];
    $usarTributacaoMunicipal = (int)($nota['emitente_usar_tributacao'] ?? 1);
    $usarInscricaoMunicipal = (int)($nota['emitente_usar_inscricao'] ?? 1);
    $inscricaoMunicipal = preg_replace('/[^0-9]/', '', $nota['emitente_inscricao'] ?? '');
    
    if ($empresaId == 1) {
        $codigoNBS = "124033200";
        $tipoRetencaoIss = 2;
        $regimeTributarioSimplesNacional = 1;
        $usarTributacaoMunicipal = 0;
        $usarInscricaoMunicipal = 0;
        $usarIbsCbs = 0;
        $codigoOpcaoSimplesNacional = 3;
    }
    if ($empresaId == 2) {
        $codigoNBS = "124032200";
        $tipoRetencaoIss = 2;
        $regimeTributarioSimplesNacional = null;
        $usarTributacaoMunicipal = 1;
        $usarInscricaoMunicipal = 1;
        $usarIbsCbs = 1;
        $codigoOpcaoSimplesNacional = 1;
    }
    if ($empresaId == 3) {
        $codigoNBS = "124033200";
        $tipoRetencaoIss = 2;
        $regimeTributarioSimplesNacional = 1;
        $usarTributacaoMunicipal = 1;
        $usarInscricaoMunicipal = 1;
        $usarIbsCbs = 1;
        $codigoOpcaoSimplesNacional = 3;
    }
    
    // ============================================================
    // 🔥 BUSCAR ALÍQUOTA ISS COM A LÓGICA CORRETA
    // REGRA: Se município de prestação == município do emitente -> usa aliquota_iss do emitente
    //        Se for diferente -> busca na tabela municipios_iss
    // ============================================================
    $aliquotaISS = 0;
    $aliquotaInfo = buscarAliquotaISS($codigoMunicipioPrestacao, $nota['emitente_id'], $pdo);
    
    if ($aliquotaInfo !== null && $aliquotaInfo['aliquota'] > 0) {
        $aliquotaISS = $aliquotaInfo['aliquota'];
        error_log("✅ Alíquota ISS: {$aliquotaISS}% - Origem: {$aliquotaInfo['origem']} - {$aliquotaInfo['mensagem']}");
    } else {
        // Fallback: usar a alíquota do emitente
        $aliquotaISS = (float)($nota['emitente_aliquota'] ?? 0);
        error_log("⚠️ Alíquota ISS fallback: {$aliquotaISS}% (usando emitente)");
    }
    
    // Garantir que a alíquota seja um número válido
    if ($aliquotaISS <= 0) {
        $aliquotaISS = 2.00; // Alíquota padrão
        error_log("⚠️ Alíquota ISS padrão: {$aliquotaISS}%");
    }
    
    // ============================================================
    // 🔥 RECALCULAR VALORES
    // ============================================================
    $valorServico = (float)$nota['valor_servico'];
    $quantidade = (float)($nota['quantidade'] ?? 1);
    $desconto = (float)($nota['desconto'] ?? 0);
    $valorISS = round(($valorServico * $aliquotaISS) / 100, 2);
    $codigoServico = $nota['codigo_servico'] ?? '070901';
    $pis_retido = 0;
    $cofins_retido = 0;
    $csll_retido = 0;
    $irrf_retido = 0;
    $valor_ibs = 0;
    $valor_cbs = 0;
    $valor_liquido = $valorServico;
    
    if ($tipoRetencaoIss == 2 || $tipoRetencaoIss == 3) {
        $valor_liquido = $valorServico - $valorISS;
        if ($usarIbsCbs == 1) {
            $base_ibs_cbs = $valorServico - $valorISS;
            $valor_ibs = ($base_ibs_cbs * 0.10) / 100;
            $valor_cbs = ($base_ibs_cbs * 0.90) / 100;
            $valor_liquido = $valor_liquido - $valor_ibs - $valor_cbs;
        }
        $base_retencoes = $valorServico;
        $pis_retido = ($base_retencoes * 0.65) / 100;
        $cofins_retido = ($base_retencoes * 3.00) / 100;
        $csll_retido = ($base_retencoes * 1.00) / 100;
        $irrf_retido = ($base_retencoes * 1.50) / 100;
        $valor_liquido = $valor_liquido - $pis_retido - $cofins_retido - $csll_retido - $irrf_retido;
    }
    $valor_liquido = round($valor_liquido, 2);
    
    // ============================================================
    // 🔥 FORMATAR DESCRIÇÃO DO SERVIÇO (PADRÃO TABELA COM LINHAS E COLUNAS)
    // ============================================================
    
    // 🔥 CORREÇÃO: USAR A DESCRIÇÃO JÁ SALVA NO BANCO (COM A QUANTIDADE CORRETA)
    $descricao = $nota['discriminacao_servico'] ?? '';
    
    // Verificar se a descrição já está no formato correto
    if (!empty($descricao) && strpos($descricao, 'Descrição:') !== false && strpos($descricao, 'TOTAL DA NOTA') !== false) {
        // ✅ JÁ ESTÁ FORMATADA - USAR DIRETAMENTE
        error_log("📝 Usando descrição já formatada do banco para nota {$ref}");
        
        // 🔥 ATUALIZAR O PAYLOAD COM A DESCRIÇÃO EXISTENTE
        $payloadEnvio['descricao_servico'] = $descricao;
        
        // Também salvar no banco para garantir
        $pdo->prepare("UPDATE notas_fiscais SET discriminacao_servico = ? WHERE ref = ?")
            ->execute([$descricao, $ref]);
        
    } else {
        // ❌ NÃO ESTÁ FORMATADA - CONSTRUIR A PARTIR DOS ITENS
        error_log("⚠️ Descrição não formatada, construindo a partir dos itens para nota {$ref}");
        
        $itens = [];
        $descricaoOriginal = $nota['discriminacao_servico'] ?? 'SERVIÇO PRESTADO';
        $payloadItens = $payload['itens_detalhados'] ?? null;
        $itensEncontrados = false;
        
        if (!empty($payloadItens) && is_array($payloadItens)) {
            foreach ($payloadItens as $item) {
                // 🔥 EXTRAIR QUANTIDADE - PRIORIDADE PARA qtd_horas
                $quantidade = 1;
                if (isset($item['qtd_horas']) && !empty($item['qtd_horas'])) {
                    $quantidade = (float) $item['qtd_horas'];
                } elseif (isset($item['quantidade']) && !empty($item['quantidade'])) {
                    $quantidade = (float) $item['quantidade'];
                } elseif (isset($item['qtd']) && !empty($item['qtd'])) {
                    $quantidade = (float) $item['qtd'];
                }
                
                if ($quantidade <= 0) $quantidade = 1;
                
                // 🔥 EXTRAIR VALOR UNITÁRIO
                $valorUnitario = 0;
                if (isset($item['valor_unitario']) && !empty($item['valor_unitario'])) {
                    $valorUnitario = (float) $item['valor_unitario'];
                } elseif (isset($item['valor']) && !empty($item['valor'])) {
                    $valorUnitario = (float) $item['valor'] / $quantidade;
                } elseif (isset($item['sub_total']) && !empty($item['sub_total'])) {
                    $valorUnitario = (float) $item['sub_total'] / $quantidade;
                }
                
                if ($valorUnitario <= 0) {
                    $valorUnitario = $valorServico / $quantidade;
                }
                
                $itens[] = [
                    'descricao' => $item['descricao'] ?? $descricaoOriginal,
                    'quantidade' => $quantidade,
                    'valor_unitario' => round($valorUnitario, 2)
                ];
                $itensEncontrados = true;
            }
        } elseif (!empty($nota['itens'])) {
            $itensArray = json_decode($nota['itens'], true);
            if (is_array($itensArray) && !empty($itensArray)) {
                foreach ($itensArray as $item) {
                    $quantidade = $item['qtd_horas'] ?? $item['quantidade'] ?? 1;
                    if ($quantidade <= 0) $quantidade = 1;
                    
                    $valorUnitario = $item['valor_unitario'] ?? ($valorServico / $quantidade);
                    if ($valorUnitario <= 0) $valorUnitario = $valorServico / $quantidade;
                    
                    $itens[] = [
                        'descricao' => $item['descricao'] ?? $descricaoOriginal,
                        'quantidade' => $quantidade,
                        'valor_unitario' => round($valorUnitario, 2)
                    ];
                    $itensEncontrados = true;
                }
            }
        }
        
        if (!$itensEncontrados || empty($itens)) {
            // Fallback: criar um único item
            $itens[] = [
                'descricao' => $descricaoOriginal,
                'quantidade' => $quantidade > 0 ? $quantidade : 1,
                'valor_unitario' => $quantidade > 0 ? round($valorServico / $quantidade, 2) : $valorServico
            ];
            error_log("⚠️ Nenhum item encontrado, criando item único com quantidade: {$quantidade}");
        }
        
        // 🔥 Aplicar formatação
        $descricao = formatarDescricaoServico($itens);
        
        // 🔥 Salvar a descrição formatada no banco para uso futuro
        $pdo->prepare("UPDATE notas_fiscais SET discriminacao_servico = ? WHERE ref = ?")
            ->execute([$descricao, $ref]);
        
        error_log("📝 Descrição formatada para nota {$ref}: " . substr($descricao, 0, 200) . "...");
    }
    
    // ============================================================
    // 🔥 MONTAR PAYLOAD PARA ENVIO
    // ============================================================
    $dataEmissao = date('Y-m-d\TH:i:sP');
    $dataCompetencia = date('Y-m-d');
    $cnpjPrestador = preg_replace('/[^0-9]/', '', $nota['emitente_cnpj']);
    
    $cnpjTomador = null;
    $cpfTomador = null;
    if (!empty($nota['tomador_cnpj'])) {
        $cnpjTomador = preg_replace('/[^0-9]/', '', $nota['tomador_cnpj']);
    } elseif (!empty($nota['tomador_cpf'])) {
        $cpfTomador = preg_replace('/[^0-9]/', '', $nota['tomador_cpf']);
    }
    
    $codigoServicoNumerico = preg_replace('/[^0-9]/', '', $codigoServico);
    if (strlen($codigoServicoNumerico) == 4) {
        $codigoServicoFormatado = $codigoServicoNumerico . '01';
    } elseif (strlen($codigoServicoNumerico) == 6) {
        $codigoServicoFormatado = $codigoServicoNumerico;
    } else {
        $codigoServicoFormatado = str_pad($codigoServicoNumerico, 6, '0', STR_PAD_RIGHT);
    }
    $codigoServicoFormatado = sprintf("%06d", (int)$codigoServicoFormatado);
    
    // ============================================================
    // 🔥 PAYLOAD CORRETO (COM DESCRIÇÃO FORMATADA PADRÃO TABELA)
    // ============================================================
    $payloadEnvio = [
        "data_emissao" => $dataEmissao,
        "data_competencia" => $dataCompetencia,
        "codigo_municipio_emissora" => $codigoMunicipioEmitente,
        "cnpj_prestador" => $cnpjPrestador,
        "codigo_opcao_simples_nacional" => $codigoOpcaoSimplesNacional,
        "regime_especial_tributacao" => 0,
        "cnpj_tomador" => $cnpjTomador,
        "razao_social_tomador" => substr($nota['tomador_nome'], 0, 100),
        "codigo_municipio_tomador" => $codigoMunicipioTomador,
        "cep_tomador" => preg_replace('/[^0-9]/', '', $nota['tomador_cep'] ?? ''),
        "logradouro_tomador" => substr($nota['tomador_logradouro'] ?? '', 0, 100),
        "numero_tomador" => substr($nota['tomador_numero'] ?? 'S/N', 0, 10),
        "complemento_tomador" => substr($nota['tomador_complemento'] ?? '', 0, 50),
        "bairro_tomador" => substr($nota['tomador_bairro'] ?? 'CENTRO', 0, 50),
        "telefone_tomador" => preg_replace('/[^0-9]/', '', $nota['tomador_telefone'] ?? ''),
        "email_tomador" => $nota['tomador_email'] ?? '',
        "codigo_municipio_prestacao" => $codigoMunicipioPrestacao,
        "codigo_tributacao_nacional_iss" => $codigoServicoFormatado,
        "descricao_servico" => $descricao, // 🔥 DESCRIÇÃO FORMATADA PADRÃO TABELA
        "valor_servico" => $valorServico,
        "tributacao_iss" => 1,
        "tipo_retencao_iss" => (string)$tipoRetencaoIss,
        "codigo_nbs" => $codigoNBS
    ];
    
    if ($usarInscricaoMunicipal && !empty($inscricaoMunicipal)) {
        $payloadEnvio["inscricao_municipal_prestador"] = $inscricaoMunicipal;
    }
    if ($usarTributacaoMunicipal) {
        $payloadEnvio["codigo_tributacao_municipal_iss"] = "001";
    }
    if ($tipoRetencaoIss == 2 || $tipoRetencaoIss == 3) {
        $payloadEnvio["percentual_aliquota_relativa_municipio"] = number_format($aliquotaISS, 2, '.', '');
        $payloadEnvio["percentual_total_tributos_municipais"] = number_format($aliquotaISS, 2, '.', '');
        if ($valorISS > 0) {
            $payloadEnvio["valor_iss"] = $valorISS;
        }
    }
    $payloadEnvio["percentual_total_tributos_federais"] = "0.00";
    $payloadEnvio["percentual_total_tributos_estaduais"] = "0.00";
    $payloadEnvio["situacao_tributaria_pis_cofins"] = "00";
    $payloadEnvio["indicador_total_tributacao"] = null;
    if ($regimeTributarioSimplesNacional !== null) {
        $payloadEnvio["regime_tributario_simples_nacional"] = $regimeTributarioSimplesNacional;
    }
    if ($usarIbsCbs) {
        $payloadEnvio["finalidade_emissao"] = $payload['finalidade_emissao'] ?? "0";
        $payloadEnvio["consumidor_final"] = $payload['consumidor_final'] ?? "0";
        $payloadEnvio["codigo_indicador_operacao"] = $payload['codigo_indicador_operacao'] ?? "050102";
        $payloadEnvio["indicador_destinatario"] = $payload['indicador_destinatario'] ?? "0";
        $payloadEnvio["ibs_cbs_situacao_tributaria"] = $payload['ibs_cbs_situacao_tributaria'] ?? "000";
        $payloadEnvio["ibs_cbs_classificacao_tributaria"] = $payload['ibs_cbs_classificacao_tributaria'] ?? "000001";
        $payloadEnvio["compra_governamental"] = $payload['compra_governamental'] ?? "0";
        $payloadEnvio["pais_prestacao"] = $payload['pais_prestacao'] ?? "1058";
    }
    if ($cpfTomador && !$cnpjTomador) {
        unset($payloadEnvio['cnpj_tomador']);
        $payloadEnvio['cpf_tomador'] = $cpfTomador;
    }
    
    $issRetido = ($tipoRetencaoIss == 2 || $tipoRetencaoIss == 3) ? 1 : 0;
    $optanteSN = ($codigoOpcaoSimplesNacional == 3) ? 1 : 0;
    
    $pdo->prepare("
        UPDATE notas_fiscais SET 
            aliquota = ?,
            valor_iss = ?,
            valor_liquido = ?,
            pis_retido = ?,
            cofins_retido = ?,
            csll_retido = ?,
            irrf_retido = ?,
            iss_retido = ?,
            optante_simples_nacional = ?,
            payload_enviado = ?,
            discriminacao_servico = ?,
            atualizado_em = NOW()
        WHERE ref = ? AND status = 'rascunho'
    ")->execute([
        $aliquotaISS, $valorISS, $valor_liquido,
        $pis_retido, $cofins_retido, $csll_retido, $irrf_retido,
        $issRetido, $optanteSN,
        json_encode($payloadEnvio, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE),
        $descricao, // Salva a descrição formatada no banco
        $ref
    ]);
    
    // ============================================================
    // 🔥 ENVIAR PARA FOCUS NFe
    // ============================================================
    $baseUrlApi = $empresa['ambiente'] == 'producao' 
        ? 'https://api.focusnfe.com.br/v2' 
        : 'https://homologacao.focusnfe.com.br/v2';
    
    $url = $baseUrlApi . '/nfsen?ref=' . urlencode($ref);
    
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payloadEnvio));
    curl_setopt($ch, CURLOPT_HTTPHEADER, [
        'Content-Type: application/json',
        'Accept: application/json',
        'Authorization: Basic ' . base64_encode($empresa['token'] . ':')
    ]);
    curl_setopt($ch, CURLOPT_TIMEOUT, 60);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    
    $resposta = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    $curlError = curl_error($ch);
    curl_close($ch);
    
    if ($curlError) {
        $pdo->prepare("UPDATE notas_fiscais SET status = 'erro_autorizacao', mensagem_erro = ?, resposta_api = ?, atualizado_em = NOW() WHERE ref = ? AND status = 'rascunho'")
            ->execute(['Erro de conexão: ' . $curlError, $curlError, $ref]);
        return ['sucesso' => false, 'erro' => 'Erro de conexão: ' . $curlError];
    }
    
    $respostaJson = json_decode($resposta, true);
    
    // ============================================================
    // 🔥 VERIFICAR SE A NOTA FOI AUTORIZADA OU TEVE ERRO
    // ============================================================
    
    // 🔥 CASO 1: RESPOSTA COM SUCESSO (HTTP 200, 201, 202)
    if ($httpCode == 200 || $httpCode == 201 || $httpCode == 202) {
        
        // 🔥 EXTRAIR DADOS DA RESPOSTA
        $statusApi = $respostaJson['status'] ?? null;
        $numeroNfse = $respostaJson['numero'] ?? $respostaJson['nfse']['numero'] ?? null;
        $pdfUrl = $respostaJson['url_danfse'] ?? $respostaJson['pdf_url'] ?? null;
        
        // 🔥 CONSTRUIR URL DO XML DIRETO DA API FOCUS
        $xmlUrl = null;
        
        // 1º - Tentar pegar da resposta da API
        if (!empty($respostaJson['caminho_xml_nota_fiscal'])) {
            $xmlUrl = $respostaJson['caminho_xml_nota_fiscal'];
            if (strpos($xmlUrl, '?download=1') === false) {
                $xmlUrl .= '?download=1';
            }
        } elseif (!empty($respostaJson['xml_url'])) {
            $xmlUrl = $respostaJson['xml_url'];
            if (strpos($xmlUrl, '?download=1') === false) {
                $xmlUrl .= '?download=1';
            }
        }
        
        // 2º - Se não veio na resposta, construir manualmente com URL da API
        if (empty($xmlUrl) && !empty($numeroNfse) && !empty($nota['emitente_cnpj'])) {
            $cnpj = preg_replace('/[^0-9]/', '', $nota['emitente_cnpj']);
            $data = date('Ym', strtotime($nota['data_emissao'] ?? date('Y-m-d')));
            $empresaId = $nota['id'] ?? $nota['empresa_id'] ?? '219068';
            $ambiente = $empresa['ambiente'] ?? 'homologacao';
            
            // 🔥 URL DA API FOCUS (NÃO DO SEU SERVIDOR)
            $baseUrlApiFocus = 'https://api.focusnfe.com.br';
            
            if ($ambiente == 'producao') {
                // Produção usa /arquivos/
                $xmlUrl = $baseUrlApiFocus . '/arquivos/' . $cnpj . '_' . $empresaId . '/' . $data . '/XMLsNFSe/NFS' . $numeroNfse . '-nfse.xml?download=1';
            } else {
                // Homologação usa /arquivos_development/
                $xmlUrl = $baseUrlApiFocus . '/arquivos_development/' . $cnpj . '_' . $empresaId . '/' . $data . '/XMLsNFSe/NFS' . $numeroNfse . '-nfse.xml?download=1';
            }
        }
        
        // 3º - Fallback para o proxy (se tudo falhar)
        if (empty($xmlUrl)) {
            $xmlUrl = 'https://' . $_SERVER['HTTP_HOST'] . '/tirentulho/emissornota/proxy_xml.php?ref=' . urlencode($ref);
        }
        
        // 🔥 1º - VERIFICAR SE É ERRO (MESMO COM HTTP 200)
        if (isset($respostaJson['status']) && $respostaJson['status'] == 'erro_autorizacao') {
            $mensagemErro = '';
            if (isset($respostaJson['erros']) && is_array($respostaJson['erros'])) {
                foreach ($respostaJson['erros'] as $erro) {
                    $mensagemErro .= ($erro['Descricao'] ?? $erro['mensagem'] ?? '') . "\n";
                }
            } elseif (isset($respostaJson['mensagem'])) {
                $mensagemErro = $respostaJson['mensagem'];
            } else {
                $mensagemErro = 'Erro desconhecido na autorização';
            }
            $pdo->prepare("UPDATE notas_fiscais SET status = 'erro_autorizacao', mensagem_erro = ?, resposta_api = ?, atualizado_em = NOW() WHERE ref = ? AND status = 'rascunho'")
                ->execute([trim($mensagemErro), $resposta, $ref]);
            return ['sucesso' => false, 'erro' => trim($mensagemErro), 'detalhes' => $respostaJson];
        }
        
        // 🔥 2º - VERIFICAR SE FOI AUTORIZADA (TEM NÚMERO DA NF)
        $temDadosAutorizacao = ($numeroNfse || $pdfUrl || $xmlUrl);
        $statusAutorizado = in_array($statusApi, ['autorizado', 'aprovado']);
        
        if ($temDadosAutorizacao || $statusAutorizado) {
            // 🔥 NOTA AUTORIZADA COM SUCESSO!
            $statusFinal = $statusApi == 'aprovado' ? 'aprovado' : 'autorizado';
            
            $updateStmt = $pdo->prepare("
                UPDATE notas_fiscais SET 
                    status = ?,
                    numero_nfse = ?,
                    pdf_url = ?,
                    xml_url = ?,
                    data_autorizacao = NOW(),
                    resposta_api = ?,
                    atualizado_em = NOW()
                WHERE ref = ? AND status = 'rascunho'
            ");
            
            $updateStmt->execute([
                $statusFinal,
                $numeroNfse,
                $pdfUrl,
                $xmlUrl,
                $resposta,
                $ref
            ]);
            
            // 🔥 SE NÃO VEIO PDF, TENTAR BUSCAR DA API
            if (!$pdfUrl) {
                error_log("⚠️ Nota {$ref} autorizada sem PDF. Tentando buscar...");
                $dadosBusca = consultarNotaFocus($ref, $empresa['token'], $empresa['ambiente']);
                if ($dadosBusca && isset($dadosBusca['url_danfse'])) {
                    $pdfUrl = $dadosBusca['url_danfse'];
                    $xmlUrl = $dadosBusca['caminho_xml_nota_fiscal'] ?? $xmlUrl;
                    $pdo->prepare("UPDATE notas_fiscais SET pdf_url = ?, xml_url = ?, atualizado_em = NOW() WHERE ref = ?")
                        ->execute([$pdfUrl, $xmlUrl, $ref]);
                    error_log("✅ PDF obtido para nota {$ref}: {$pdfUrl}");
                }
            }
            
            // 🔥 ENVIAR E-MAIL AUTOMATICAMENTE APÓS EMITIR
            $emailResultado = null;
            if ($pdfUrl) {
                $emailResultado = enviarEmailNota($ref, $pdo);
                if ($emailResultado['sucesso']) {
                    error_log("📧 E-mail enviado para nota $ref: " . $emailResultado['mensagem']);
                } else {
                    error_log("⚠️ Erro ao enviar e-mail para nota $ref: " . $emailResultado['erro']);
                }
            }
            
            return [
                'sucesso' => true,
                'numero_nfse' => $numeroNfse,
                'pdf_url' => $pdfUrl,
                'xml_url' => $xmlUrl,
                'ref' => $ref,
                'ambiente' => $empresa['ambiente'],
                'email_enviado' => $emailResultado && $emailResultado['sucesso'],
                'email_mensagem' => $emailResultado ? $emailResultado['mensagem'] : null,
                'status' => $statusFinal,
                'aliquota_utilizada' => $aliquotaISS,
                'origem_aliquota' => $aliquotaInfo['origem'] ?? 'desconhecida',
                'descricao_formatada' => $descricao
            ];
        }
        
        // 🔥 3º - SE NÃO TEM DADOS E NÃO É AUTORIZADO, É PROCESSANDO
        if ($httpCode == 202 || $statusApi == 'processando_autorizacao') {
            $pdo->prepare("UPDATE notas_fiscais SET status = 'processando_autorizacao', resposta_api = ?, atualizado_em = NOW() WHERE ref = ? AND status = 'rascunho'")
                ->execute([$resposta, $ref]);
            return [
                'sucesso' => true,
                'status' => 'processando_autorizacao',
                'ref' => $ref,
                'mensagem' => 'Nota em processamento. Aguarde a autorização.'
            ];
        }
        
        // 🔥 4º - RESPOSTA 200/201/202 MAS SEM DADOS E SEM STATUS DE AUTORIZAÇÃO
        $mensagemErro = 'Resposta da API sem dados de autorização';
        if (isset($respostaJson['mensagem'])) $mensagemErro = $respostaJson['mensagem'];
        elseif (isset($respostaJson['error'])) $mensagemErro = $respostaJson['error'];
        
        $pdo->prepare("UPDATE notas_fiscais SET status = 'processando_autorizacao', mensagem_erro = ?, resposta_api = ?, atualizado_em = NOW() WHERE ref = ? AND status = 'rascunho'")
            ->execute([$mensagemErro, $resposta, $ref]);
        return ['sucesso' => false, 'erro' => $mensagemErro];
    }
    
    // ============================================================
    // 🔥 CASO 2: ERRO NA EMISSÃO (HTTP 400, 401, 422, 500, etc)
    // ============================================================
    $mensagemErro = '';
    if (isset($respostaJson['erros']) && is_array($respostaJson['erros'])) {
        foreach ($respostaJson['erros'] as $erro) {
            $mensagemErro .= ($erro['Descricao'] ?? $erro['mensagem'] ?? '') . "\n";
        }
    } elseif (isset($respostaJson['mensagem'])) {
        $mensagemErro = $respostaJson['mensagem'];
    } elseif (isset($respostaJson['error'])) {
        $mensagemErro = $respostaJson['error'];
    } else {
        $mensagemErro = 'Erro na comunicação com a Focus NFe (HTTP ' . $httpCode . ')';
    }
    
    $statusErro = $httpCode == 422 ? 'erro_validacao' : 'erro_autorizacao';
    if (isset($respostaJson['status']) && in_array($respostaJson['status'], ['erro_autorizacao', 'erro_validacao', 'rejeitado'])) {
        $statusErro = $respostaJson['status'];
    }
    
    $pdo->prepare("UPDATE notas_fiscais SET status = ?, mensagem_erro = ?, resposta_api = ?, atualizado_em = NOW() WHERE ref = ? AND status = 'rascunho'")
        ->execute([$statusErro, trim($mensagemErro), $resposta, $ref]);
    return ['sucesso' => false, 'erro' => trim($mensagemErro)];
}

// =============================================
// SE FOR AJAX, PROCESSAR E SAIR
// =============================================

if ($isAjax) {
    // 🔥 Desligar exibição de erros para não poluir o JSON
    ini_set('display_errors', 0);
    error_reporting(0);
    
    // Carregar apenas o necessário
    require_once 'includes/funcoes.php';
    $pdo = conectarBanco();
    
    if (!$pdo) {
        header('Content-Type: application/json');
        echo json_encode(['sucesso' => false, 'erro' => 'Erro ao conectar ao banco']);
        exit;
    }
    
    // =============================================
    // PROCESSAR CADA TIPO DE AJAX
    // =============================================
    
    // 1. ATUALIZAR TODAS
    if (isset($_GET['ajax']) && $_GET['ajax'] == 'atualizar_todas') {
        ob_clean();
        header('Content-Type: application/json');
        
        $resultados = [];
        $totalRascunhos = 0;
        $emitidas = 0;
        $erros = 0;
        $atualizadas = 0;
        $emailsEnviados = 0;
        $ignoradas = 0;
        
        try {
            $stmt = $pdo->prepare("
                SELECT 
                    n.ref, n.id, n.status, n.criado_em, n.atualizado_em,
                    n.pdf_url, n.xml_url, n.numero_nfse, n.data_envio_email,
                    e.token, e.ambiente, e.nome as empresa_nome
                FROM notas_fiscais n
                INNER JOIN empresas e ON n.empresa_id = e.id
                WHERE e.ativo = 1
                AND (
                    n.status = 'rascunho'
                    OR n.status = 'processando_autorizacao'
                    OR (n.status IN ('autorizado', 'aprovado') AND (n.pdf_url IS NULL OR n.xml_url IS NULL))
                    OR (n.status = 'autorizado' AND n.data_envio_email IS NULL AND n.pdf_url IS NOT NULL)
                )
                ORDER BY n.criado_em DESC
                LIMIT 100
            ");
            $stmt->execute();
            $notas = $stmt->fetchAll(PDO::FETCH_ASSOC);
            $total = count($notas);
            
            foreach ($notas as $nota) {
                $ref = $nota['ref'];
                $id = $nota['id'];
                $status = $nota['status'];
                
                if ($status == 'rascunho') {
                    $totalRascunhos++;
                    $resultado = emitirNota($ref, $pdo);
                    if ($resultado['sucesso']) {
                        $emitidas++;
                        $resultados[$ref] = [
                            'status' => 'emitida',
                            'numero_nfse' => $resultado['numero_nfse'],
                            'pdf_url' => $resultado['pdf_url'],
                            'xml_url' => $resultado['xml_url'],
                            'email_enviado' => $resultado['email_enviado'] ?? false,
                            'empresa' => $nota['empresa_nome'],
                            'ambiente' => $resultado['ambiente'] ?? $nota['ambiente'],
                            'aliquota_utilizada' => $resultado['aliquota_utilizada'] ?? null,
                            'mensagem' => '✅ Rascunho emitido com sucesso!'
                        ];
                        if ($resultado['email_enviado']) $emailsEnviados++;
                    } else {
                        $erros++;
                        $resultados[$ref] = ['status' => 'erro', 'empresa' => $nota['empresa_nome'], 'mensagem' => '❌ ' . $resultado['erro']];
                    }
                    continue;
                }
                
                if ($status == 'processando_autorizacao') {
                    $dados = consultarNotaFocus($ref, $nota['token'], $nota['ambiente']);
                    if ($dados && isset($dados['status'])) {
                        $statusApi = $dados['status'];
                        $numeroNfse = $dados['numero'] ?? null;
                        if ($statusApi == 'autorizado' || $statusApi == 'aprovado' || $numeroNfse) {
                            $pdfUrl = $dados['url_danfse'] ?? $dados['pdf_url'] ?? null;
                            $xmlUrl = $dados['caminho_xml_nota_fiscal'] ?? $dados['xml_url'] ?? null;
                            $pdo->prepare("UPDATE notas_fiscais SET status = ?, numero_nfse = ?, pdf_url = ?, xml_url = ?, data_autorizacao = ?, atualizado_em = NOW() WHERE id = ?")
                                ->execute([$statusApi, $numeroNfse, $pdfUrl, $xmlUrl, $dados['data_emissao'] ?? null, $id]);
                            $atualizadas++;
                            $emailEnviado = false;
                            if ($pdfUrl && empty($nota['data_envio_email']) && empty($nota['erro_envio_email'])) {
                                $resultadoEmail = enviarEmailNota($ref, $pdo);
                                if ($resultadoEmail['sucesso']) {
                                    $emailEnviado = true;
                                    $emailsEnviados++;
                                }
                            }
                            $resultados[$ref] = [
                                'status' => 'autorizado',
                                'numero_nfse' => $numeroNfse,
                                'pdf_url' => $pdfUrl,
                                'xml_url' => $xmlUrl,
                                'email_enviado' => $emailEnviado,
                                'empresa' => $nota['empresa_nome'],
                                'mensagem' => '✅ Nota autorizada com sucesso!'
                            ];
                        } else {
                            $resultados[$ref] = ['status' => $statusApi, 'empresa' => $nota['empresa_nome'], 'mensagem' => '📌 Status atual: ' . strtoupper($statusApi)];
                        }
                    } else {
                        $erros++;
                        $resultados[$ref] = ['status' => 'erro', 'empresa' => $nota['empresa_nome'], 'mensagem' => '❌ Nota não encontrada na API'];
                    }
                    continue;
                }
                
                if (($status == 'autorizado' || $status == 'aprovado') && !empty($nota['pdf_url']) && empty($nota['data_envio_email']) && empty($nota['erro_envio_email'])) {
                    $resultadoEmail = enviarEmailNota($ref, $pdo);
                    if ($resultadoEmail['sucesso']) {
                        $emailsEnviados++;
                        $resultados[$ref] = ['status' => 'email_enviado', 'pdf_url' => $nota['pdf_url'], 'xml_url' => $nota['xml_url'], 'empresa' => $nota['empresa_nome'], 'mensagem' => '📧 ' . $resultadoEmail['mensagem']];
                    } else {
                        $erros++;
                        $resultados[$ref] = ['status' => 'erro_email', 'empresa' => $nota['empresa_nome'], 'mensagem' => '❌ ' . $resultadoEmail['erro']];
                    }
                    continue;
                }
                
                if (($status == 'autorizado' || $status == 'aprovado') && (empty($nota['pdf_url']) || empty($nota['xml_url']))) {
                    $dados = consultarNotaFocus($ref, $nota['token'], $nota['ambiente']);
                    if ($dados && isset($dados['status']) && in_array($dados['status'], ['autorizado', 'aprovado'])) {
                        $pdfUrl = $dados['url_danfse'] ?? $dados['pdf_url'] ?? null;
                        $xmlUrl = $dados['caminho_xml_nota_fiscal'] ?? $dados['xml_url'] ?? null;
                        if ($pdfUrl || $xmlUrl) {
                            $pdo->prepare("UPDATE notas_fiscais SET pdf_url = ?, xml_url = ?, atualizado_em = NOW() WHERE id = ?")->execute([$pdfUrl, $xmlUrl, $id]);
                            $atualizadas++;
                            if ($pdfUrl && empty($nota['data_envio_email']) && empty($nota['erro_envio_email'])) {
                                $resultadoEmail = enviarEmailNota($ref, $pdo);
                                if ($resultadoEmail['sucesso']) $emailsEnviados++;
                            }
                            $resultados[$ref] = ['status' => 'autorizado', 'pdf_url' => $pdfUrl, 'xml_url' => $xmlUrl, 'empresa' => $nota['empresa_nome'], 'mensagem' => '✅ PDF/XML obtido com sucesso!'];
                            continue;
                        }
                    }
                    $resultados[$ref] = ['status' => 'aguardando', 'empresa' => $nota['empresa_nome'], 'mensagem' => '⏳ Aguardando geração do PDF/XML'];
                }
            }
            
            $rascunhosRestantes = $pdo->query("SELECT COUNT(*) as total FROM notas_fiscais WHERE status = 'rascunho'")->fetch(PDO::FETCH_ASSOC)['total'] ?? 0;
            if ($total === 0 && $rascunhosRestantes > 0) $ignoradas = $rascunhosRestantes;
            
        } catch (Exception $e) {
            echo json_encode(['sucesso' => false, 'erro' => $e->getMessage()]);
            exit;
        }
        
        echo json_encode([
            'sucesso' => true,
            'total' => $total,
            'rascunhos_encontrados' => $totalRascunhos,
            'emitidas' => $emitidas,
            'erros' => $erros,
            'atualizadas' => $atualizadas,
            'emails_enviados' => $emailsEnviados,
            'ignoradas' => $ignoradas,
            'resultados' => $resultados,
            'rascunhos_restantes' => $rascunhosRestantes
        ]);
        exit;
    }
    
    // 2. ATUALIZAR INDIVIDUAL
    if (isset($_GET['ajax']) && $_GET['ajax'] == 'atualizar_individual' && isset($_GET['ref'])) {
        ob_clean();
        header('Content-Type: application/json');
        
        $ref = $_GET['ref'];
        $resultado = [];
        
        try {
            $stmt = $pdo->prepare("
                SELECT n.ref, n.id, n.status, n.data_envio_email, n.erro_envio_email,
                       n.pdf_url, n.xml_url, n.numero_nfse, e.token, e.ambiente, e.nome as empresa_nome
                FROM notas_fiscais n
                INNER JOIN empresas e ON n.empresa_id = e.id
                WHERE n.ref = ? AND e.ativo = 1
            ");
            $stmt->execute([$ref]);
            $nota = $stmt->fetch(PDO::FETCH_ASSOC);
            
            if (!$nota) {
                echo json_encode(['sucesso' => false, 'erro' => 'Nota não encontrada']);
                exit;
            }
            
            if ($nota['status'] == 'rascunho') {
                $resultado = emitirNota($ref, $pdo);
                echo json_encode($resultado);
                exit;
            }
            
            $dados = consultarNotaFocus($ref, $nota['token'], $nota['ambiente']);
            if ($dados && isset($dados['status'])) {
                $status = $dados['status'];
                $numeroNfse = $dados['numero'] ?? null;
                if ($status == 'autorizado' || $status == 'aprovado' || $numeroNfse) {
                    $pdfUrl = $dados['url_danfse'] ?? $dados['pdf_url'] ?? null;
                    $xmlUrl = $dados['caminho_xml_nota_fiscal'] ?? $dados['xml_url'] ?? null;
                    $pdo->prepare("UPDATE notas_fiscais SET status = ?, numero_nfse = ?, pdf_url = ?, xml_url = ?, data_autorizacao = ?, atualizado_em = NOW() WHERE id = ?")
                        ->execute([$status, $numeroNfse, $pdfUrl, $xmlUrl, $dados['data_emissao'] ?? null, $nota['id']]);
                    $emailEnviado = false;
                    if ($pdfUrl && empty($nota['data_envio_email']) && empty($nota['erro_envio_email'])) {
                        $resultadoEmail = enviarEmailNota($ref, $pdo);
                        if ($resultadoEmail['sucesso']) $emailEnviado = true;
                    }
                    $resultado = ['sucesso' => true, 'status' => 'autorizado', 'numero_nfse' => $numeroNfse, 'pdf_url' => $pdfUrl, 'xml_url' => $xmlUrl, 'email_enviado' => $emailEnviado];
                } else {
                    $resultado = ['sucesso' => false, 'status' => $status, 'mensagem' => '📌 Status atual: ' . strtoupper($status)];
                }
            } else {
                $resultado = ['sucesso' => false, 'erro' => 'Nota não encontrada na API'];
            }
        } catch (Exception $e) {
            $resultado = ['sucesso' => false, 'erro' => $e->getMessage()];
        }
        echo json_encode($resultado);
        exit;
    }
    
    // 3. EXCLUIR RASCUNHO
    if (isset($_GET['ajax']) && $_GET['ajax'] == 'excluir_rascunho' && isset($_GET['ref'])) {
        ob_clean();
        header('Content-Type: application/json');
        
        $ref = $_GET['ref'];
        try {
            $stmt = $pdo->prepare("SELECT id, status FROM notas_fiscais WHERE ref = ?");
            $stmt->execute([$ref]);
            $nota = $stmt->fetch(PDO::FETCH_ASSOC);
            if (!$nota) {
                echo json_encode(['sucesso' => false, 'erro' => 'Nota não encontrada']);
                exit;
            }
            if ($nota['status'] !== 'rascunho') {
                echo json_encode(['sucesso' => false, 'erro' => 'Apenas rascunhos podem ser excluídos']);
                exit;
            }
            $stmt = $pdo->prepare("DELETE FROM notas_fiscais WHERE ref = ? AND status = 'rascunho'");
            $stmt->execute([$ref]);
            echo json_encode(['sucesso' => true, 'mensagem' => 'Rascunho excluído com sucesso']);
        } catch (Exception $e) {
            echo json_encode(['sucesso' => false, 'erro' => $e->getMessage()]);
        }
        exit;
    }
    
    // 4. EMITIR RASCUNHO
    if (isset($_POST['ajax']) && $_POST['ajax'] == 'emitir_rascunho') {
        ob_clean();
        header('Content-Type: application/json');
        
        $ref = $_POST['ref'] ?? '';
        if (empty($ref)) {
            echo json_encode(['sucesso' => false, 'erro' => 'Referência não informada']);
            exit;
        }
        try {
            $stmt = $pdo->prepare("SELECT id, status FROM notas_fiscais WHERE ref = ?");
            $stmt->execute([$ref]);
            $notaExistente = $stmt->fetch(PDO::FETCH_ASSOC);
            if (!$notaExistente) {
                echo json_encode(['sucesso' => false, 'erro' => 'Nota não encontrada']);
                exit;
            }
            if ($notaExistente['status'] !== 'rascunho') {
                echo json_encode(['sucesso' => false, 'erro' => 'Nota já foi emitida ou não é um rascunho']);
                exit;
            }
            $resultado = emitirNota($ref, $pdo);
            echo json_encode($resultado);
        } catch (Exception $e) {
            echo json_encode(['sucesso' => false, 'erro' => $e->getMessage()]);
        }
        exit;
    }
    
    // 5. REENVIAR E-MAIL (CORRIGIDO - PERMITE REENVIO FORÇADO)
    if (isset($_POST['ajax']) && $_POST['ajax'] == 'reenviar_email' && isset($_POST['ref'])) {
        ob_clean();
        header('Content-Type: application/json');
        
        $ref = $_POST['ref'] ?? '';
        if (empty($ref)) {
            echo json_encode(['sucesso' => false, 'erro' => 'Referência não informada']);
            exit;
        }
        try {
            // 🔥 PASSANDO 'true' COMO TERCEIRO PARÂMETRO PARA FORÇAR O REENVIO
            $resultado = enviarEmailNota($ref, $pdo, true);
            echo json_encode($resultado);
        } catch (Exception $e) {
            echo json_encode(['sucesso' => false, 'erro' => 'Erro: ' . $e->getMessage()]);
        }
        exit;
    }
    
    // 6. CANCELAR NOTA
    if (isset($_POST['ajax']) && $_POST['ajax'] == 'cancelar_nota' && isset($_POST['ref'])) {
        ob_clean();
        header('Content-Type: application/json');
        
        $ref = $_POST['ref'] ?? '';
        $justificativa = $_POST['justificativa'] ?? '';
        $tipo = $_POST['tipo'] ?? 'nacional';
        
        if (empty($ref)) {
            echo json_encode(['sucesso' => false, 'erro' => 'Referência não informada']);
            exit;
        }
        
        try {
            // Verificar se a nota existe
            $stmt = $pdo->prepare("SELECT id, status, empresa_id FROM notas_fiscais WHERE ref = ?");
            $stmt->execute([$ref]);
            $nota = $stmt->fetch(PDO::FETCH_ASSOC);
            
            if (!$nota) {
                echo json_encode(['sucesso' => false, 'erro' => 'Nota não encontrada']);
                exit;
            }
            
            // Verificar se já está cancelada
            if ($nota['status'] == 'cancelado') {
                echo json_encode(['sucesso' => false, 'erro' => 'Nota já está cancelada']);
                exit;
            }
            
            // Verificar se é autorizada
            if (!in_array($nota['status'], ['autorizado', 'aprovado'])) {
                echo json_encode([
                    'sucesso' => false, 
                    'erro' => 'Apenas notas autorizadas podem ser canceladas. Status atual: ' . $nota['status']
                ]);
                exit;
            }
            
            // Validar justificativa
            if ($tipo == 'padrao' && !empty($justificativa)) {
                $len = strlen($justificativa);
                if ($len < 15 || $len > 255) {
                    echo json_encode(['sucesso' => false, 'erro' => 'Justificativa deve ter entre 15 e 255 caracteres']);
                    exit;
                }
            }
            
            // Cancelar nota
            $resultado = cancelarNotaFocus($ref, $pdo, $justificativa, $tipo);
            
            if ($resultado['sucesso']) {
                // Log de auditoria (opcional - se a tabela existir)
                try {
                    $logStmt = $pdo->prepare("
                        INSERT INTO logs_auditoria 
                        (empresa_id, usuario_id, acao, detalhes, ip, criado_em)
                        VALUES (?, ?, ?, ?, ?, NOW())
                    ");
                    $logStmt->execute([
                        $nota['empresa_id'],
                        $_SESSION['usuario_id'] ?? null,
                        'cancelamento_nfse',
                        json_encode(['ref' => $ref, 'justificativa' => $justificativa, 'tipo' => $tipo]),
                        $_SERVER['REMOTE_ADDR']
                    ]);
                } catch (Exception $e) {
                    // Log não é crítico, continua
                }
                
                echo json_encode($resultado);
            } else {
                echo json_encode($resultado);
            }
            
        } catch (Exception $e) {
            echo json_encode(['sucesso' => false, 'erro' => 'Erro: ' . $e->getMessage()]);
        }
        exit;
    }
    
    // 7. VERIFICAR SE NOTA PODE SER CANCELADA
    if (isset($_GET['ajax']) && $_GET['ajax'] == 'verificar_cancelamento' && isset($_GET['ref'])) {
        ob_clean();
        header('Content-Type: application/json');
        
        $ref = $_GET['ref'];
        
        try {
            $stmt = $pdo->prepare("
                SELECT id, status, numero_nfse, valor_servico, data_emissao, 
                       tomador_id, emitente_id, empresa_id, ref
                FROM notas_fiscais 
                WHERE ref = ?
            ");
            $stmt->execute([$ref]);
            $nota = $stmt->fetch(PDO::FETCH_ASSOC);
            
            if (!$nota) {
                echo json_encode(['sucesso' => false, 'erro' => 'Nota não encontrada']);
                exit;
            }
            
            $podeCancelar = in_array($nota['status'], ['autorizado', 'aprovado']);
            
            echo json_encode([
                'sucesso' => true,
                'pode_cancelar' => $podeCancelar,
                'status' => $nota['status'],
                'status_label' => $podeCancelar ? 'Pode ser cancelada' : 'Não pode ser cancelada',
                'nota' => $nota
            ]);
            
        } catch (Exception $e) {
            echo json_encode(['sucesso' => false, 'erro' => $e->getMessage()]);
        }
        exit;
    }
    
    // Se chegou aqui, é um AJAX desconhecido
    header('Content-Type: application/json');
    echo json_encode(['sucesso' => false, 'erro' => 'Requisição inválida']);
    exit;
}

// =============================================
// SE NÃO FOR AJAX, CONTINUA O HTML NORMAL
// =============================================

// CONFIGURAÇÃO DE ERROS PARA O HTML
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

require_once 'includes/funcoes.php';
include 'includes/header.php';
ob_start();

$baseUrl = rtrim(dirname($_SERVER['SCRIPT_NAME']), '/');
define('BASE_URL', $baseUrl);

$pdo = conectarBanco();
if (!$pdo) {
    die('Erro ao conectar ao banco de dados');
}

// =============================================
// 🔥 CARREGAR PHPMailer DINAMICAMENTE
// =============================================
$phpmailerLoaded = false;
$currentDir = __DIR__;

if (file_exists($currentDir . '/PHPMailer/src/PHPMailer.php')) {
    require_once $currentDir . '/PHPMailer/src/PHPMailer.php';
    require_once $currentDir . '/PHPMailer/src/SMTP.php';
    require_once $currentDir . '/PHPMailer/src/Exception.php';
    $phpmailerLoaded = true;
} elseif (!$phpmailerLoaded && file_exists($currentDir . '/PHPMailer/PHPMailer.php')) {
    require_once $currentDir . '/PHPMailer/PHPMailer.php';
    require_once $currentDir . '/PHPMailer/SMTP.php';
    require_once $currentDir . '/PHPMailer/Exception.php';
    $phpmailerLoaded = true;
} elseif (!$phpmailerLoaded && file_exists($currentDir . '/vendor/autoload.php')) {
    require_once $currentDir . '/vendor/autoload.php';
    $phpmailerLoaded = true;
} elseif (!$phpmailerLoaded && file_exists($currentDir . '/includes/PHPMailer/PHPMailer.php')) {
    require_once $currentDir . '/includes/PHPMailer/PHPMailer.php';
    require_once $currentDir . '/includes/PHPMailer/SMTP.php';
    require_once $currentDir . '/includes/PHPMailer/Exception.php';
    $phpmailerLoaded = true;
}

// =============================================
// 📧 VERIFICAÇÃO DE E-MAILS PENDENTES AO CARREGAR
// =============================================
$isAjax = isset($_GET['ajax']) || isset($_POST['ajax']);

if (!$isAjax) {
    $stmt = $pdo->prepare("
        SELECT 
            n.ref,
            n.id,
            n.status,
            n.pdf_url,
            n.xml_url,
            n.data_envio_email,
            n.erro_envio_email,
            t.email as tomador_email,
            t.razao_social as tomador_nome
        FROM notas_fiscais n
        LEFT JOIN tomadores t ON n.tomador_id = t.id
        WHERE n.status IN ('autorizado', 'aprovado')
        AND n.pdf_url IS NOT NULL
        AND n.data_envio_email IS NULL
        AND n.erro_envio_email IS NULL
        AND t.email IS NOT NULL
        AND t.email != ''
        ORDER BY n.criado_em DESC
        LIMIT 50
    ");
    $stmt->execute();
    $notasParaEnviar = $stmt->fetchAll(PDO::FETCH_ASSOC);
    
    $totalEnviados = 0;
    $totalErros = 0;
    
    foreach ($notasParaEnviar as $nota) {
        $resultado = enviarEmailNota($nota['ref'], $pdo);
        if ($resultado['sucesso']) {
            $totalEnviados++;
        } else {
            $totalErros++;
        }
    }
    
    if ($totalEnviados > 0) {
        $mensagem = "📧 $totalEnviados e-mail(s) enviado(s) automaticamente para notas pendentes!";
        $tipoMensagem = "success";
    } elseif ($totalErros > 0) {
        $mensagem = "⚠️ $totalErros erro(s) ao enviar e-mails. Verifique os logs.";
        $tipoMensagem = "warning";
    }
}

// =============================================
// BUSCAR NOTAS COM FILTROS
// =============================================
$where = [];
$params = [];

if (isset($_GET['data_inicio']) && !empty($_GET['data_inicio'])) {
    $where[] = "DATE(n.data_emissao) >= ?";
    $params[] = $_GET['data_inicio'];
}
if (isset($_GET['data_fim']) && !empty($_GET['data_fim'])) {
    $where[] = "DATE(n.data_emissao) <= ?";
    $params[] = $_GET['data_fim'];
}
if (isset($_GET['numero_nfse']) && !empty($_GET['numero_nfse'])) {
    $where[] = "n.numero_nfse LIKE ?";
    $params[] = "%" . $_GET['numero_nfse'] . "%";
}
if (isset($_GET['emitente']) && !empty($_GET['emitente'])) {
    $where[] = "(e.razao_social LIKE ? OR e.cnpj LIKE ?)";
    $params[] = "%" . $_GET['emitente'] . "%";
    $params[] = "%" . $_GET['emitente'] . "%";
}
if (isset($_GET['status']) && !empty($_GET['status'])) {
    $where[] = "n.status = ?";
    $params[] = $_GET['status'];
}
if (isset($_GET['empresa_id']) && !empty($_GET['empresa_id'])) {
    $where[] = "n.empresa_id = ?";
    $params[] = $_GET['empresa_id'];
}

$sql = "
    SELECT 
        n.*,
        e.razao_social as emitente_nome,
        e.cnpj as emitente_cnpj,
        t.razao_social as tomador_nome,
        t.cnpj as tomador_cnpj,
        t.cpf as tomador_cpf,
        t.email as tomador_email,
        emp.nome as empresa_nome,
        emp.ambiente,
        emp.token,
        CASE 
            WHEN n.status = 'autorizado' THEN 'AUTORIZADO'
            WHEN n.status = 'aprovado' THEN 'APROVADO'
            WHEN n.status = 'processando_autorizacao' THEN 'PROCESSANDO'
            WHEN n.status = 'rejeitado' THEN 'REJEITADO'
            WHEN n.status = 'cancelado' THEN 'CANCELADO'
            WHEN n.status = 'erro_validacao' THEN 'ERRO VALIDAÇÃO'
            WHEN n.status = 'erro_autorizacao' THEN 'ERRO AUTORIZAÇÃO'
            WHEN n.status = 'rascunho' THEN 'RASCUNHO'
            ELSE UPPER(n.status)
        END as status_label,
        CASE 
            WHEN n.data_envio_email IS NOT NULL THEN '✅ Enviado'
            WHEN n.status IN ('autorizado', 'aprovado') AND n.pdf_url IS NOT NULL AND n.erro_envio_email IS NOT NULL THEN '❌ Erro'
            WHEN n.status IN ('autorizado', 'aprovado') AND n.pdf_url IS NOT NULL AND n.data_envio_email IS NULL THEN '⏳ Pendente'
            WHEN n.status IN ('autorizado', 'aprovado') AND n.pdf_url IS NULL THEN '⏳ Aguardando PDF'
            ELSE '-'
        END as status_envio
    FROM notas_fiscais n
    LEFT JOIN emitentes e ON n.emitente_id = e.id
    LEFT JOIN tomadores t ON n.tomador_id = t.id
    INNER JOIN empresas emp ON n.empresa_id = emp.id
";

if (count($where) > 0) {
    $sql .= " WHERE " . implode(" AND ", $where);
}

$sql .= " ORDER BY n.criado_em DESC";

$stmt = $pdo->prepare($sql);
$stmt->execute($params);
$notas = $stmt->fetchAll(PDO::FETCH_ASSOC);

$empresas = $pdo->query("SELECT id, nome FROM empresas WHERE ativo = 1 ORDER BY nome")->fetchAll(PDO::FETCH_ASSOC);

$totalNotas = count($notas);
$totalAutorizadas = count(array_filter($notas, function($n) { return $n['status'] == 'autorizado' || $n['status'] == 'aprovado'; }));
$totalProcessando = count(array_filter($notas, function($n) { return $n['status'] == 'processando_autorizacao'; }));
$totalRejeitadas = count(array_filter($notas, function($n) { return $n['status'] == 'rejeitado' || $n['status'] == 'erro_validacao' || $n['status'] == 'erro_autorizacao'; }));
$totalRascunhos = count(array_filter($notas, function($n) { return $n['status'] == 'rascunho'; }));
$totalCancelados = count(array_filter($notas, function($n) { return $n['status'] == 'cancelado'; }));
$totalEnviados = count(array_filter($notas, function($n) { return !empty($n['data_envio_email']); }));
$totalErroEmail = count(array_filter($notas, function($n) { return !empty($n['erro_envio_email']); }));
$totalPendentesEmail = count(array_filter($notas, function($n) { 
    return ($n['status'] == 'autorizado' || $n['status'] == 'aprovado') && !empty($n['pdf_url']) && empty($n['data_envio_email']) && empty($n['erro_envio_email']); 
}));

$totalRascunhosBadge = $totalRascunhos;

// =============================================
// INCLUIR O HEADER DA PÁGINA
// =============================================
?>
<!DOCTYPE html>
<html lang="pt-br">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Consultar Notas Fiscais - Emissor Nacional</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.8.1/font/bootstrap-icons.css" rel="stylesheet">
    <link href="https://cdn.datatables.net/1.11.5/css/dataTables.bootstrap5.min.css" rel="stylesheet">
    <style>
        /* ... (mantido igual ao seu CSS original) ... */
        .card-shadow { box-shadow: 0 2px 4px rgba(0,0,0,0.1); }
        .status-badge { 
            padding: 5px 12px; 
            border-radius: 20px; 
            font-size: 11px; 
            font-weight: 600; 
            display: inline-block;
            text-transform: uppercase;
            letter-spacing: 0.5px;
        }
        .status-processando_autorizacao { background-color: #fff3cd; color: #856404; animation: pulse 2s infinite; }
        .status-autorizado { background-color: #d4edda; color: #155724; }
        .status-aprovado { background-color: #d4edda; color: #155724; }
        .status-rejeitado { background-color: #f8d7da; color: #721c24; }
        .status-cancelado { background-color: #e2e3e5; color: #383d41; }
        .status-erro_validacao { background-color: #f8d7da; color: #721c24; }
        .status-erro_autorizacao { background-color: #f8d7da; color: #721c24; }
        .status-rascunho { background-color: #e2e3e5; color: #383d41; }
        
        .badge-enviado { background-color: #28a745; color: white; }
        .badge-erro { background-color: #dc3545; color: white; }
        .badge-pendente { background-color: #ffc107; color: #212529; }
        .badge-aguardando { background-color: #6c757d; color: white; }
        
        @keyframes pulse {
            0% { opacity: 1; }
            50% { opacity: 0.6; }
            100% { opacity: 1; }
        }
        
        .loading-overlay {
            position: fixed;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
            background: rgba(0,0,0,0.7);
            z-index: 9999;
            display: none;
            justify-content: center;
            align-items: center;
            flex-direction: column;
        }
        .loading-spinner {
            width: 50px;
            height: 50px;
            border: 5px solid #f3f3f3;
            border-top: 5px solid #3498db;
            border-radius: 50%;
            animation: spin 1s linear infinite;
        }
        @keyframes spin {
            0% { transform: rotate(0deg); }
            100% { transform: rotate(360deg); }
        }
        
        .btn-pdf-active {
            background-color: #dc3545;
            color: white;
            border: none;
            padding: 5px 10px;
            border-radius: 4px;
            font-size: 13px;
            cursor: pointer;
            transition: all 0.2s;
            text-decoration: none;
            display: inline-block;
            line-height: 1.5;
        }
        .btn-pdf-active:hover {
            background-color: #c82333;
            color: white;
            transform: scale(1.05);
        }
        .btn-pdf-active i { font-size: 16px; }
        .btn-pdf-inactive {
            background-color: #6c757d;
            color: white;
            border: none;
            padding: 5px 10px;
            border-radius: 4px;
            font-size: 13px;
            cursor: not-allowed;
            opacity: 0.6;
            line-height: 1.5;
        }
        .btn-pdf-inactive i { font-size: 16px; }

        .btn-xml {
            background-color: #17a2b8;
            color: white;
            border: none;
            padding: 5px 10px;
            border-radius: 4px;
            font-size: 13px;
            cursor: pointer;
            transition: all 0.2s;
            text-decoration: none;
            display: inline-block;
            line-height: 1.5;
        }
        .btn-xml:hover {
            background-color: #138496;
            color: white;
            transform: scale(1.05);
        }
        .btn-xml i { font-size: 16px; }
        .btn-xml-inactive {
            background-color: #6c757d;
            color: white;
            border: none;
            padding: 5px 10px;
            border-radius: 4px;
            font-size: 13px;
            cursor: not-allowed;
            opacity: 0.6;
            line-height: 1.5;
        }
        .btn-xml-inactive i { font-size: 16px; }
        
        .btn-email {
            background-color: #17a2b8;
            color: white;
            border: none;
            padding: 5px 10px;
            border-radius: 4px;
            font-size: 13px;
            cursor: pointer;
            transition: all 0.2s;
            line-height: 1.5;
        }
        .btn-email:hover {
            background-color: #138496;
            color: white;
            transform: scale(1.05);
        }
        .btn-email:disabled {
            background-color: #6c757d;
            cursor: not-allowed;
        }
        .btn-email i { font-size: 16px; }
        .btn-email-outline {
            background-color: transparent;
            color: #17a2b8;
            border: 1px solid #17a2b8;
            padding: 4px 9px;
            border-radius: 4px;
            font-size: 13px;
            cursor: pointer;
            transition: all 0.2s;
            line-height: 1.5;
        }
        .btn-email-outline:hover {
            background-color: #17a2b8;
            color: white;
            transform: scale(1.05);
        }
        .btn-email-outline i { font-size: 16px; }
        
        .btn-atualizar-individual {
            background-color: #28a745;
            color: white;
            border: none;
            padding: 5px 10px;
            border-radius: 4px;
            font-size: 13px;
            cursor: pointer;
            transition: all 0.2s;
            line-height: 1.5;
        }
        .btn-atualizar-individual:hover {
            background-color: #218838;
            transform: scale(1.05);
        }
        .btn-atualizar-individual:disabled {
            background-color: #6c757d;
            cursor: not-allowed;
        }
        .btn-atualizar-individual i { font-size: 16px; }
        
        .btn-editar-rascunho {
            background-color: #ffc107;
            color: #212529;
            border: none;
            padding: 5px 10px;
            border-radius: 4px;
            font-size: 13px;
            cursor: pointer;
            transition: all 0.2s;
            text-decoration: none;
            display: inline-block;
            line-height: 1.5;
        }
        .btn-editar-rascunho:hover {
            background-color: #e0a800;
            color: #212529;
            transform: scale(1.05);
        }
        .btn-editar-rascunho i { font-size: 16px; }
        
        .btn-excluir-rascunho {
            background-color: #dc3545;
            color: white;
            border: none;
            padding: 5px 10px;
            border-radius: 4px;
            font-size: 13px;
            cursor: pointer;
            transition: all 0.2s;
            line-height: 1.5;
        }
        .btn-excluir-rascunho:hover {
            background-color: #c82333;
            transform: scale(1.05);
        }
        .btn-excluir-rascunho:disabled {
            background-color: #6c757d;
            cursor: not-allowed;
        }
        .btn-excluir-rascunho i { font-size: 16px; }
        
        .btn-emitir-rascunho {
            background-color: #28a745;
            color: white;
            border: none;
            padding: 5px 10px;
            border-radius: 4px;
            font-size: 13px;
            cursor: pointer;
            transition: all 0.2s;
            line-height: 1.5;
        }
        .btn-emitir-rascunho:hover {
            background-color: #218838;
            transform: scale(1.05);
        }
        .btn-emitir-rascunho:disabled {
            background-color: #6c757d;
            cursor: not-allowed;
        }
        .btn-emitir-rascunho i { font-size: 16px; }
        
        .btn-cancelar-nota {
            background-color: #dc3545;
            color: white;
            border: none;
            padding: 5px 10px;
            border-radius: 4px;
            font-size: 13px;
            cursor: pointer;
            transition: all 0.2s;
            line-height: 1.5;
        }
        .btn-cancelar-nota:hover {
            background-color: #c82333;
            color: white;
            transform: scale(1.05);
        }
        .btn-cancelar-nota:disabled {
            background-color: #6c757d;
            cursor: not-allowed;
        }
        .btn-cancelar-nota i { font-size: 16px; }
        
        .toast-container { position: fixed; top: 20px; right: 20px; z-index: 9999; }
        .table-actions { white-space: nowrap; }
        .table-notas td { vertical-align: middle; font-size: 13px; }
        .table-notas th { font-size: 12px; text-transform: uppercase; letter-spacing: 0.5px; }
        .ref-code { font-size: 12px; background: #f8f9fa; padding: 2px 8px; border-radius: 4px; font-family: monospace; }
        
        .resumo-stats {
            display: grid;
            grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
            gap: 10px;
            margin-bottom: 15px;
        }
        .stat-card {
            background: #f8f9fa;
            padding: 10px 15px;
            border-radius: 8px;
            text-align: center;
            transition: transform 0.2s;
            cursor: pointer;
        }
        .stat-card:hover {
            transform: translateY(-3px);
            box-shadow: 0 4px 12px rgba(0,0,0,0.1);
        }
        .stat-card .number { font-size: 24px; font-weight: bold; }
        .stat-card .label { font-size: 12px; color: #666; text-transform: uppercase; }
        .stat-card.total .number { color: #007bff; }
        .stat-card.autorizadas .number { color: #28a745; }
        .stat-card.processando .number { color: #ffc107; }
        .stat-card.rejeitadas .number { color: #dc3545; }
        .stat-card.rascunhos .number { color: #6c757d; }
        .stat-card.cancelados .number { color: #6c757d; }
        .stat-card.enviados .number { color: #17a2b8; }
        .stat-card.erro-email .number { color: #dc3545; }
        .stat-card.pendentes-email .number { color: #ffc107; }
        
        .ambiente-badge { font-size: 10px; padding: 2px 8px; border-radius: 12px; }
        .auto-update-badge {
            background: #17a2b8;
            color: white;
            font-size: 10px;
            padding: 2px 10px;
            border-radius: 12px;
            animation: pulse 2s infinite;
        }
        #autoStatusBadge { font-size: 11px; padding: 4px 12px; }
        #autoTimer { font-weight: bold; color: #00ff88; }
        
        .btn-auto { transition: all 0.3s; }
        .btn-auto.active { background: #ffc107; color: #000; }
        .btn-auto.inactive { background: #6c757d; color: #fff; }
        
        .filtros-box {
            background: #f8f9fa;
            border: 1px solid #dee2e6;
            border-radius: 8px;
            padding: 15px;
            margin-bottom: 20px;
        }
        .filtros-box .form-label { font-size: 12px; font-weight: 600; color: #555; }
        .filtros-box .form-control,
        .filtros-box .form-select { font-size: 13px; }
        
        .info-atualizacao {
            background: #e7f3ff;
            border: 1px solid #b6d4fe;
            border-radius: 6px;
            padding: 8px 12px;
            font-size: 12px;
            color: #0d6efd;
            margin-bottom: 10px;
        }
        .info-atualizacao i { margin-right: 6px; }
        
        .acoes-wrapper {
            display: flex;
            flex-wrap: wrap;
            gap: 3px;
            align-items: center;
        }
        
        .modal-confirmacao .modal-header {
            background-color: #28a745;
            color: white;
        }
        .modal-confirmacao .modal-header .btn-close {
            filter: brightness(0) invert(1);
        }
        .modal-confirmacao .modal-footer .btn-confirmar {
            background-color: #28a745;
            color: white;
        }
        .modal-confirmacao .modal-footer .btn-confirmar:hover {
            background-color: #218838;
        }
        .modal-confirmacao .modal-footer .btn-cancelar {
            background-color: #6c757d;
            color: white;
        }
        .modal-confirmacao .modal-footer .btn-cancelar:hover {
            background-color: #5a6268;
        }
        .modal-confirmacao .detalhe-nota {
            background-color: #f8f9fa;
            padding: 12px 15px;
            border-radius: 6px;
            margin: 10px 0;
            font-size: 14px;
        }
        .modal-confirmacao .detalhe-nota .linha {
            display: flex;
            justify-content: space-between;
            padding: 4px 0;
            border-bottom: 1px dashed #e9ecef;
        }
        .modal-confirmacao .detalhe-nota .linha:last-child {
            border-bottom: none;
        }
        .modal-confirmacao .detalhe-nota .label {
            color: #6c757d;
            font-weight: 500;
        }
        .modal-confirmacao .detalhe-nota .valor {
            font-weight: 600;
        }
        .modal-confirmacao .detalhe-nota .valor-destaque {
            color: #28a745;
            font-weight: 700;
        }
        .modal-confirmacao .alerta-emissao {
            background-color: #fff3cd;
            border: 1px solid #ffc107;
            border-radius: 6px;
            padding: 10px 14px;
            margin: 10px 0;
            font-size: 13px;
            color: #856404;
        }
        .modal-confirmacao .alerta-emissao i { margin-right: 8px; }
        
        /* Modal de cancelamento */
        .modal-cancelar .modal-header {
            background-color: #dc3545;
            color: white;
        }
        .modal-cancelar .modal-header .btn-close {
            filter: brightness(0) invert(1);
        }
        .modal-cancelar .modal-footer .btn-confirmar-cancelar {
            background-color: #dc3545;
            color: white;
        }
        .modal-cancelar .modal-footer .btn-confirmar-cancelar:hover {
            background-color: #c82333;
        }
        .modal-cancelar .modal-footer .btn-cancelar-acao {
            background-color: #6c757d;
            color: white;
        }
        .modal-cancelar .modal-footer .btn-cancelar-acao:hover {
            background-color: #5a6268;
        }
        .modal-cancelar .alerta-cancelamento {
            background-color: #f8d7da;
            border: 1px solid #dc3545;
            border-radius: 6px;
            padding: 10px 14px;
            margin: 10px 0;
            font-size: 13px;
            color: #721c24;
        }
        .modal-cancelar .alerta-cancelamento i { margin-right: 8px; }
        
        .auto-emitido { background-color: #d4edda !important; transition: background-color 2s ease; }
        .auto-emitido td { background-color: #d4edda !important; }
        .auto-erro { background-color: #f8d7da !important; }
        .auto-erro td { background-color: #f8d7da !important; }
        .status-pendente { background-color: #fff3cd !important; }
        .status-pendente td { background-color: #fff3cd !important; }
        .email-enviado { background-color: #d4edda !important; }
        .email-enviado td { background-color: #d4edda !important; }
        .email-erro { background-color: #f8d7da !important; }
        .email-erro td { background-color: #f8d7da !important; }
        
        /* 🔥 ESTILO PARA DESCRIÇÃO DA NOTA */
        .descricao-servico {
            background: #f8f9fa;
            padding: 12px 15px;
            border-radius: 5px;
            margin: 10px 0;
            font-family: monospace;
            font-size: 13px;
            white-space: pre-wrap;
            border-left: 3px solid #28a745;
        }
        .descricao-servico strong {
            color: #28a745;
        }
        .descricao-linha {
            padding: 2px 0;
            border-bottom: 1px dashed #e9ecef;
        }
        .descricao-linha:last-child {
            border-bottom: none;
        }
        .descricao-total {
            font-weight: bold;
            font-size: 14px;
            color: #28a745;
            padding-top: 5px;
            border-top: 2px solid #28a745;
        }
    </style>
</head>
<body>

<!-- LOADING OVERLAY -->
<div class="loading-overlay" id="loadingOverlay">
    <div class="loading-spinner"></div>
    <div class="text-white mt-3" id="loadingMensagem">Processando...</div>
</div>

<!-- TOAST CONTAINER -->
<div class="toast-container" id="toastContainer"></div>

<!-- MODAL DE CONFIRMAÇÃO DE EMISSÃO -->
<div class="modal fade modal-confirmacao" id="modalEmitirRascunho" tabindex="-1" aria-hidden="true">
    <div class="modal-dialog modal-dialog-centered">
        <div class="modal-content">
            <div class="modal-header">
                <h5 class="modal-title"><i class="bi bi-send"></i> Confirmar Emissão</h5>
                <button type="button" class="btn-close" data-bs-dismiss="modal"></button>
            </div>
            <div class="modal-body">
                <p><strong>Você está prestes a emitir a nota fiscal abaixo:</strong></p>
                
                <div class="detalhe-nota" id="detalhesNotaModal">
                    <div class="linha">
                        <span class="label">📌 Referência</span>
                        <span class="valor" id="modalRef">-</span>
                    </div>
                    <div class="linha">
                        <span class="label">🏢 Empresa</span>
                        <span class="valor" id="modalEmpresa">-</span>
                    </div>
                    <div class="linha">
                        <span class="label">👤 Emitente</span>
                        <span class="valor" id="modalEmitente">-</span>
                    </div>
                    <div class="linha">
                        <span class="label">👥 Tomador</span>
                        <span class="valor" id="modalTomador">-</span>
                    </div>
                    <div class="linha">
                        <span class="label">💰 Valor</span>
                        <span class="valor valor-destaque" id="modalValor">-</span>
                    </div>
                    <div class="linha">
                        <span class="label">📅 Data Emissão</span>
                        <span class="valor" id="modalData">-</span>
                    </div>
                    <div class="linha">
                        <span class="label">📊 Status</span>
                        <span class="valor"><span class="badge bg-warning text-dark">RASCUNHO</span></span>
                    </div>
                </div>
                
                <div class="alerta-emissao">
                    <i class="bi bi-info-circle"></i>
                    <strong>Atenção:</strong> Após a emissão, a nota será enviada para a SEFAZ e não poderá mais ser editada.
                    <br><small>O e-mail com o PDF e XML será enviado automaticamente para o tomador.</small>
                </div>
            </div>
            <div class="modal-footer">
                <button type="button" class="btn btn-cancelar" data-bs-dismiss="modal">
                    <i class="bi bi-x-circle"></i> Cancelar
                </button>
                <button type="button" class="btn btn-confirmar" id="btnConfirmarEmissao">
                    <i class="bi bi-check-circle"></i> Confirmar Emissão
                </button>
            </div>
        </div>
    </div>
</div>

<!-- MODAL DE CANCELAMENTO -->
<div class="modal fade modal-cancelar" id="modalCancelarNota" tabindex="-1" aria-hidden="true">
    <div class="modal-dialog modal-dialog-centered">
        <div class="modal-content">
            <div class="modal-header">
                <h5 class="modal-title"><i class="bi bi-exclamation-triangle"></i> Cancelar Nota Fiscal</h5>
                <button type="button" class="btn-close" data-bs-dismiss="modal"></button>
            </div>
            <div class="modal-body">
                <div class="alerta-cancelamento">
                    <i class="bi bi-exclamation-triangle-fill"></i>
                    <strong>Atenção:</strong> O cancelamento é <strong>definitivo</strong> e não pode ser desfeito.
                    <br><small>Apenas notas com status "autorizado" podem ser canceladas.</small>
                </div>
                
                <div class="detalhe-nota" id="detalhesNotaCancelamento">
                    <div class="linha">
                        <span class="label">📌 Referência</span>
                        <span class="valor" id="modalCancelRef">-</span>
                    </div>
                    <div class="linha">
                        <span class="label">📄 Número NF</span>
                        <span class="valor" id="modalCancelNumero">-</span>
                    </div>
                    <div class="linha">
                        <span class="label">💰 Valor</span>
                        <span class="valor valor-destaque" id="modalCancelValor">-</span>
                    </div>
                    <div class="linha">
                        <span class="label">📅 Data Emissão</span>
                        <span class="valor" id="modalCancelData">-</span>
                    </div>
                    <div class="linha">
                        <span class="label">🏢 Empresa</span>
                        <span class="valor" id="modalCancelEmpresa">-</span>
                    </div>
                    <div class="linha">
                        <span class="label">📊 Status</span>
                        <span class="valor"><span class="badge bg-success">AUTORIZADO</span></span>
                    </div>
                </div>
                
                <div class="mb-3 mt-3">
                    <label for="justificativaCancelamento" class="form-label">
                        <i class="bi bi-pencil"></i> Justificativa do Cancelamento
                        <span class="text-muted small">(opcional)</span>
                    </label>
                    <textarea class="form-control" id="justificativaCancelamento" 
                              rows="3" placeholder="Descreva o motivo do cancelamento..."></textarea>
                    <small class="text-muted">Mínimo 15 caracteres para NFSe padrão</small>
                </div>
            </div>
            <div class="modal-footer">
                <button type="button" class="btn btn-cancelar-acao" data-bs-dismiss="modal">
                    <i class="bi bi-x-circle"></i> Fechar
                </button>
                <button type="button" class="btn btn-confirmar-cancelar" id="btnConfirmarCancelamento">
                    <i class="bi bi-check-circle"></i> Confirmar Cancelamento
                </button>
            </div>
        </div>
    </div>
</div>

<div class="container-fluid mt-3">
    <!-- CABEÇALHO -->
    <div class="d-flex justify-content-between flex-wrap flex-md-nowrap align-items-center pt-3 pb-2 mb-3 border-bottom">
        <div>
            <h1><i class="bi bi-search"></i> Consultar Notas Fiscais</h1>
            <span class="badge bg-info text-white">Emissor Nacional</span>
            <span class="auto-update-badge ms-2">
                <i class="bi bi-arrow-repeat"></i> Auto-Atualização
            </span>
            <span class="badge bg-success ms-2" id="autoStatusBadge">
                <i class="bi bi-arrow-repeat"></i> Auto: <span id="autoTimer">5s</span>
            </span>
            <span class="badge bg-warning ms-2" id="rascunhoBadge">
                <i class="bi bi-file-earmark"></i> Rascunhos: <span id="totalRascunhosBadge"><?php echo $totalRascunhosBadge; ?></span>
            </span>
            <?php if ($totalPendentesEmail > 0): ?>
            <span class="badge bg-info ms-2" id="pendentesEmailBadge">
                <i class="bi bi-envelope"></i> E-mails pendentes: <span id="totalPendentesEmailBadge"><?php echo $totalPendentesEmail; ?></span>
            </span>
            <?php endif; ?>
        </div>
        <div>
            <a href="<?php echo BASE_URL; ?>/emitir_nota.php" class="btn btn-success">
                <i class="bi bi-plus-circle"></i> Nova Nota
            </a>
            <button class="btn btn-primary ms-2" onclick="atualizarEmitirTodas()">
                <i class="bi bi-arrow-repeat"></i> Atualizar e Emitir
            </button>
            <button class="btn btn-warning ms-2 btn-auto active" id="btnAutoVerificacao" onclick="alternarAutoVerificacao()">
                <i class="bi bi-pause-circle"></i> Parar Auto
            </button>
            <button class="btn btn-outline-secondary ms-2" onclick="recarregarTabela()">
                <i class="bi bi-arrow-clockwise"></i>
            </button>
        </div>
    </div>

    <?php if (isset($mensagem)): ?>
        <div class="alert alert-<?php echo $tipoMensagem ?? 'warning'; ?> alert-dismissible fade show">
            <?php echo $mensagem; ?>
            <button type="button" class="btn-close" data-bs-dismiss="alert"></button>
        </div>
    <?php endif; ?>

    <!-- INFO ATUALIZAÇÃO -->
    <div class="info-atualizacao">
        <i class="bi bi-info-circle"></i>
        <strong>Emissão automática com envio de e-mail:</strong> O sistema verifica e <strong>emite automaticamente</strong> todas as notas em <strong>rascunho</strong>, e envia <strong>e-mail</strong> para o tomador com o <strong>PDF e XML</strong> anexados.
        <span class="badge bg-success ms-2" id="statusAtualizacao">✅ Ativo</span>
    </div>

    <!-- RESUMO ESTATÍSTICAS -->
    <div class="resumo-stats">
        <div class="stat-card total" onclick="filtrarPorStatus('')">
            <div class="number"><?php echo $totalNotas; ?></div>
            <div class="label">Total de Notas</div>
        </div>
        <div class="stat-card autorizadas" onclick="filtrarPorStatus('autorizado')">
            <div class="number"><?php echo $totalAutorizadas; ?></div>
            <div class="label">Autorizadas</div>
        </div>
        <div class="stat-card processando" onclick="filtrarPorStatus('processando_autorizacao')">
            <div class="number"><?php echo $totalProcessando; ?></div>
            <div class="label">Processando</div>
        </div>
        <div class="stat-card rejeitadas" onclick="filtrarPorStatus('rejeitado')">
            <div class="number"><?php echo $totalRejeitadas; ?></div>
            <div class="label">Rejeitadas</div>
        </div>
        <div class="stat-card rascunhos" onclick="filtrarPorStatus('rascunho')">
            <div class="number"><?php echo $totalRascunhos; ?></div>
            <div class="label">Rascunhos</div>
        </div>
        <div class="stat-card cancelados" onclick="filtrarPorStatus('cancelado')">
            <div class="number"><?php echo $totalCancelados; ?></div>
            <div class="label">Cancelados</div>
        </div>
        <div class="stat-card enviados" onclick="filtrarPorStatus('enviados')">
            <div class="number"><?php echo $totalEnviados; ?></div>
            <div class="label">📧 E-mail Enviado</div>
        </div>
        <div class="stat-card erro-email" onclick="filtrarPorStatus('erro_email')">
            <div class="number"><?php echo $totalErroEmail; ?></div>
            <div class="label">❌ Erro E-mail</div>
        </div>
        <?php if ($totalPendentesEmail > 0): ?>
        <div class="stat-card pendentes-email" onclick="filtrarPorStatus('pendentes_email')">
            <div class="number"><?php echo $totalPendentesEmail; ?></div>
            <div class="label">⏳ E-mail Pendente</div>
        </div>
        <?php endif; ?>
    </div>

    <!-- FILTROS -->
    <div class="filtros-box">
        <form method="GET" class="row g-3" id="formFiltros">
            <div class="col-md-2">
                <label class="form-label">📅 Data Início</label>
                <input type="date" class="form-control" name="data_inicio" value="<?php echo htmlspecialchars($_GET['data_inicio'] ?? ''); ?>">
            </div>
            <div class="col-md-2">
                <label class="form-label">📅 Data Fim</label>
                <input type="date" class="form-control" name="data_fim" value="<?php echo htmlspecialchars($_GET['data_fim'] ?? ''); ?>">
            </div>
            <div class="col-md-2">
                <label class="form-label">📄 NF</label>
                <input type="text" class="form-control" name="numero_nfse" placeholder="Número da NF" value="<?php echo htmlspecialchars($_GET['numero_nfse'] ?? ''); ?>">
            </div>
            <div class="col-md-2">
                <label class="form-label">🏢 Emitente</label>
                <input type="text" class="form-control" name="emitente" placeholder="Nome ou CNPJ" value="<?php echo htmlspecialchars($_GET['emitente'] ?? ''); ?>">
            </div>
            <div class="col-md-2">
                <label class="form-label">📊 Status</label>
                <select class="form-select" name="status">
                    <option value="">Todos</option>
                    <option value="processando_autorizacao" <?php echo (isset($_GET['status']) && $_GET['status'] == 'processando_autorizacao') ? 'selected' : ''; ?>>Processando</option>
                    <option value="autorizado" <?php echo (isset($_GET['status']) && $_GET['status'] == 'autorizado') ? 'selected' : ''; ?>>Autorizado</option>
                    <option value="aprovado" <?php echo (isset($_GET['status']) && $_GET['status'] == 'aprovado') ? 'selected' : ''; ?>>Aprovado</option>
                    <option value="rejeitado" <?php echo (isset($_GET['status']) && $_GET['status'] == 'rejeitado') ? 'selected' : ''; ?>>Rejeitado</option>
                    <option value="cancelado" <?php echo (isset($_GET['status']) && $_GET['status'] == 'cancelado') ? 'selected' : ''; ?>>Cancelado</option>
                    <option value="erro_validacao" <?php echo (isset($_GET['status']) && $_GET['status'] == 'erro_validacao') ? 'selected' : ''; ?>>Erro Validação</option>
                    <option value="erro_autorizacao" <?php echo (isset($_GET['status']) && $_GET['status'] == 'erro_autorizacao') ? 'selected' : ''; ?>>Erro Autorização</option>
                    <option value="rascunho" <?php echo (isset($_GET['status']) && $_GET['status'] == 'rascunho') ? 'selected' : ''; ?>>Rascunho</option>
                    <option value="enviados" <?php echo (isset($_GET['status']) && $_GET['status'] == 'enviados') ? 'selected' : ''; ?>>E-mail Enviado</option>
                    <option value="erro_email" <?php echo (isset($_GET['status']) && $_GET['status'] == 'erro_email') ? 'selected' : ''; ?>>Erro E-mail</option>
                    <option value="pendentes_email" <?php echo (isset($_GET['status']) && $_GET['status'] == 'pendentes_email') ? 'selected' : ''; ?>>E-mail Pendente</option>
                </select>
            </div>
            <div class="col-md-2">
                <label class="form-label">🏭 Empresa</label>
                <select class="form-select" name="empresa_id">
                    <option value="">Todas</option>
                    <?php foreach ($empresas as $emp): ?>
                        <option value="<?php echo $emp['id']; ?>" <?php echo (isset($_GET['empresa_id']) && $_GET['empresa_id'] == $emp['id']) ? 'selected' : ''; ?>>
                            <?php echo htmlspecialchars($emp['nome']); ?>
                        </option>
                    <?php endforeach; ?>
                </select>
            </div>
            <div class="col-md-12 d-flex gap-2">
                <button type="submit" class="btn btn-primary">
                    <i class="bi bi-search"></i> Filtrar
                </button>
                <a href="<?php echo BASE_URL; ?>/consultar_notas.php" class="btn btn-secondary">
                    <i class="bi bi-eraser"></i> Limpar Filtros
                </a>
            </div>
        </form>
    </div>

    <!-- TABELA DE NOTAS -->
    <div class="card card-shadow">
        <div class="card-header bg-success text-white d-flex justify-content-between align-items-center">
            <div>
                <strong><i class="bi bi-list-ul"></i> Notas Emitidas</strong>
                <span class="badge bg-light text-dark ms-2" id="totalRegistros"><?php echo $totalNotas; ?> registros</span>
            </div>
            <div>
                <span class="badge bg-warning text-dark" id="rascunhosPendentes">
                    <i class="bi bi-file-earmark"></i> Rascunhos: <span id="rascunhosPendentesCount"><?php echo $totalRascunhos; ?></span>
                </span>
                <?php if ($totalPendentesEmail > 0): ?>
                <span class="badge bg-info text-white ms-2" id="emailsPendentes">
                    <i class="bi bi-envelope"></i> E-mails pendentes: <span id="emailsPendentesCount"><?php echo $totalPendentesEmail; ?></span>
                </span>
                <?php endif; ?>
            </div>
        </div>
        <div class="card-body">
            <div class="table-responsive">
                <table id="tabelaNotas" class="table table-notas table-striped table-hover">
                    <thead>
                        <tr>
                            <th>Empresa</th>
                            <th>Data Emissão</th>
                            <th>NF</th>
                            <th>Tomador</th>
                            <th>Valor</th>
                            <th>Referência</th>
                            <th>Status</th>
                            <th>📧 E-mail</th>
                            <th>Ações</th>
                        </tr>
                    </thead>
                    <tbody>
                        <?php foreach ($notas as $nota): ?>
                        <?php 
                        $temPdf = !empty($nota['pdf_url']);
                        $temXml = !empty($nota['xml_url']);
                        $emailPendente = (($nota['status'] == 'autorizado' || $nota['status'] == 'aprovado') && $temPdf && empty($nota['data_envio_email']) && empty($nota['erro_envio_email']));
                        $isCancelado = ($nota['status'] == 'cancelado');
                        
                        $emailStatus = '';
                        $emailTitle = '';
                        $emailClass = '';
                        
                        if (!empty($nota['data_envio_email'])) {
                            $emailStatus = '✅ Enviado';
                            $emailTitle = 'Enviado em: ' . date('d/m/Y H:i', strtotime($nota['data_envio_email']));
                            $emailClass = 'badge-enviado';
                        } elseif (!empty($nota['erro_envio_email'])) {
                            $emailStatus = '❌ Erro';
                            $emailTitle = htmlspecialchars($nota['erro_envio_email']);
                            $emailClass = 'badge-erro';
                        } elseif ($nota['status'] == 'autorizado' || $nota['status'] == 'aprovado') {
                            if ($temPdf) {
                                $emailStatus = '⏳ Pendente';
                                $emailTitle = 'Aguardando envio do e-mail';
                                $emailClass = 'badge-pendente';
                            } else {
                                $emailStatus = '⏳ Aguardando PDF';
                                $emailTitle = 'Aguardando PDF para enviar e-mail';
                                $emailClass = 'badge-aguardando';
                            }
                        } else {
                            $emailStatus = '-';
                            $emailTitle = '';
                            $emailClass = 'badge-secondary';
                        }
                        ?>
                        <tr id="nota_<?php echo $nota['id']; ?>" data-ref="<?php echo htmlspecialchars($nota['ref']); ?>" data-empresa="<?php echo htmlspecialchars($nota['empresa_nome'] ?? ''); ?>" data-emitente="<?php echo htmlspecialchars($nota['emitente_nome'] ?? ''); ?>" data-tomador="<?php echo htmlspecialchars($nota['tomador_nome'] ?? ''); ?>" data-valor="<?php echo number_format($nota['valor_servico'], 2, ',', '.'); ?>" data-data="<?php echo date('d/m/Y H:i', strtotime($nota['data_emissao'] ?? $nota['criado_em'])); ?>" class="<?php echo $emailPendente ? 'status-pendente' : ''; ?> <?php echo !empty($nota['data_envio_email']) ? 'email-enviado' : ''; ?> <?php echo !empty($nota['erro_envio_email']) ? 'email-erro' : ''; ?> <?php echo $isCancelado ? 'table-secondary' : ''; ?>">
                            <td>
                                <strong><?php echo htmlspecialchars($nota['empresa_nome'] ?? '-'); ?></strong>
                                <br>
                                <span class="ambiente-badge badge <?php echo ($nota['ambiente'] == 'producao') ? 'bg-success' : 'bg-warning'; ?>">
                                    <?php echo strtoupper($nota['ambiente'] ?? 'homologacao'); ?>
                                </span>
                            </td>
                            <td>
                                <?php echo date('d/m/Y H:i', strtotime($nota['data_emissao'] ?? $nota['criado_em'])); ?>
                            </td>
                            <td id="numero_<?php echo $nota['id']; ?>">
                                <?php if ($nota['numero_nfse']): ?>
                                    <strong><?php echo htmlspecialchars($nota['numero_nfse']); ?></strong>
                                <?php else: ?>
                                    <span class="text-muted">-</span>
                                <?php endif; ?>
                            </td>
                            <td>
                                <strong><?php echo htmlspecialchars(substr($nota['tomador_nome'] ?? '-', 0, 30)); ?></strong>
                                <br><small class="text-muted">
                                    <?php 
                                    if ($nota['tomador_cnpj']) echo formatarCnpj($nota['tomador_cnpj']);
                                    elseif ($nota['tomador_cpf']) echo formatarCpf($nota['tomador_cpf']);
                                    else echo '-';
                                    ?>
                                </small>
                                <?php if ($nota['tomador_email']): ?>
                                    <br><small class="text-muted"><i class="bi bi-envelope"></i> <?php echo htmlspecialchars($nota['tomador_email']); ?></small>
                                <?php endif; ?>
                            </td>
                            <td>
                                <strong>R$ <?php echo number_format($nota['valor_servico'], 2, ',', '.'); ?></strong>
                            </td>
                            <td>
                                <code class="ref-code"><?php echo htmlspecialchars($nota['ref']); ?></code>
                            </td>
                            <td>
                                <?php
                                $statusClass = [
                                    'processando_autorizacao' => 'status-processando_autorizacao',
                                    'autorizado' => 'status-autorizado',
                                    'aprovado' => 'status-aprovado',
                                    'rejeitado' => 'status-rejeitado',
                                    'cancelado' => 'status-cancelado',
                                    'erro_validacao' => 'status-erro_validacao',
                                    'erro_autorizacao' => 'status-erro_autorizacao',
                                    'rascunho' => 'status-rascunho'
                                ];
                                ?>
                                <span class="status-badge <?php echo $statusClass[$nota['status']] ?? 'status-processando_autorizacao'; ?>" id="status_<?php echo $nota['id']; ?>">
                                    <?php echo $nota['status_label'] ?? strtoupper($nota['status']); ?>
                                </span>
                                <?php if ($nota['status'] == 'processando_autorizacao'): ?>
                                    <br><small class="text-muted"><i class="bi bi-clock-history"></i> Aguardando...</small>
                                <?php endif; ?>
                                <?php if ($nota['status'] == 'rascunho'): ?>
                                    <br><small class="text-muted"><i class="bi bi-pencil"></i> Rascunho</small>
                                <?php endif; ?>
                                <?php if ($nota['status'] == 'cancelado' && !empty($nota['justificativa_cancelamento'])): ?>
                                    <br><small class="text-muted" title="<?php echo htmlspecialchars($nota['justificativa_cancelamento']); ?>">
                                        <i class="bi bi-info-circle"></i> <?php echo substr(htmlspecialchars($nota['justificativa_cancelamento']), 0, 30); ?>...
                                    </small>
                                <?php endif; ?>
                            </td>
                            <td>
                                <?php if ($nota['status'] == 'autorizado' || $nota['status'] == 'aprovado'): ?>
                                    <span class="badge <?php echo $emailClass; ?>" title="<?php echo $emailTitle; ?>">
                                        <i class="bi <?php echo !empty($nota['data_envio_email']) ? 'bi-envelope-check' : (!empty($nota['erro_envio_email']) ? 'bi-envelope-exclamation' : 'bi-envelope'); ?>"></i>
                                        <?php echo $emailStatus; ?>
                                    </span>
                                    <?php if (!empty($nota['data_envio_email'])): ?>
                                        <br><small class="text-muted"><?php echo date('d/m/Y H:i', strtotime($nota['data_envio_email'])); ?></small>
                                    <?php endif; ?>
                                    <?php if (!empty($nota['erro_envio_email'])): ?>
                                        <br><small class="text-danger" title="<?php echo htmlspecialchars($nota['erro_envio_email']); ?>">
                                            <?php echo substr(htmlspecialchars($nota['erro_envio_email']), 0, 30); ?>...
                                        </small>
                                    <?php endif; ?>
                                <?php elseif ($nota['status'] == 'cancelado'): ?>
                                    <span class="badge bg-secondary">
                                        <i class="bi bi-x-circle"></i> Cancelado
                                    </span>
                                <?php else: ?>
                                    <span class="badge bg-secondary">-</span>
                                <?php endif; ?>
                            </td>
                            <td class="table-actions" id="acoes_<?php echo $nota['id']; ?>">
                                <div class="acoes-wrapper">
                                    <?php if ($temPdf): ?>
                                        <a href="<?php echo $nota['pdf_url']; ?>" target="_blank" class="btn btn-sm btn-pdf-active" title="Baixar PDF">
                                            <i class="bi bi-filetype-pdf"></i>
                                        </a>
                                    <?php else: ?>
                                        <button class="btn btn-sm btn-pdf-inactive" disabled title="PDF indisponível">
                                            <i class="bi bi-filetype-pdf"></i>
                                        </button>
                                    <?php endif; ?>
                                    
                                    <?php if ($temXml): ?>
                                        <a href="<?php echo $nota['xml_url']; ?>" target="_blank" class="btn btn-sm btn-xml" title="Baixar XML">
                                            <i class="bi bi-filetype-xml"></i>
                                        </a>
                                    <?php else: ?>
                                        <button class="btn btn-sm btn-xml-inactive" disabled title="XML indisponível">
                                            <i class="bi bi-filetype-xml"></i>
                                        </button>
                                    <?php endif; ?>
                                    
                                    <?php if ($nota['status'] != 'rascunho' && $nota['status'] != 'cancelado'): ?>
                                        <button class="btn-atualizar-individual ms-1" 
                                                onclick="atualizarNotaIndividual('<?php echo $nota['ref']; ?>', <?php echo $nota['id']; ?>)"
                                                id="btn_individual_<?php echo $nota['id']; ?>"
                                                title="Atualizar esta nota">
                                            <i class="bi bi-arrow-repeat"></i>
                                        </button>
                                    <?php endif; ?>
                                    
                                    <?php if ($nota['status'] == 'rascunho'): ?>
                                        <button class="btn-emitir-rascunho" 
                                                onclick="abrirModalEmitir('<?php echo $nota['ref']; ?>', <?php echo $nota['id']; ?>)"
                                                id="btn_emitir_<?php echo $nota['id']; ?>"
                                                title="Emitir nota fiscal">
                                            <i class="bi bi-send"></i>
                                        </button>
                                        
                                        <a href="<?php echo BASE_URL; ?>/emitir_nota.php?ref=<?php echo urlencode($nota['ref']); ?>" 
                                           class="btn-editar-rascunho" title="Editar rascunho">
                                            <i class="bi bi-pencil"></i>
                                        </a>
                                        
                                        <button class="btn-excluir-rascunho" 
                                                onclick="excluirRascunho('<?php echo $nota['ref']; ?>', <?php echo $nota['id']; ?>)"
                                                id="btn_excluir_<?php echo $nota['id']; ?>"
                                                title="Excluir rascunho">
                                            <i class="bi bi-trash"></i>
                                        </button>
                                    <?php endif; ?>
                                    
                                    <?php if ($nota['status'] == 'autorizado' || $nota['status'] == 'aprovado'): ?>
                                        <?php if ($temPdf || $temXml): ?>
                                            <?php if (empty($nota['data_envio_email'])): ?>
                                                <button class="btn-email ms-1" 
                                                        onclick="reenviarEmail('<?php echo $nota['ref']; ?>', <?php echo $nota['id']; ?>)"
                                                        id="btn_email_<?php echo $nota['id']; ?>"
                                                        title="Enviar e-mail agora">
                                                    <i class="bi bi-envelope"></i>
                                                </button>
                                            <?php else: ?>
                                                <button class="btn-email-outline ms-1" 
                                                        onclick="reenviarEmail('<?php echo $nota['ref']; ?>', <?php echo $nota['id']; ?>)"
                                                        id="btn_email_<?php echo $nota['id']; ?>"
                                                        title="Reenviar e-mail">
                                                    <i class="bi bi-envelope-check"></i>
                                                </button>
                                            <?php endif; ?>
                                        <?php endif; ?>
                                        
                                        <!-- Botão Cancelar -->
                                        <button class="btn-cancelar-nota ms-1" 
                                                onclick="abrirModalCancelar('<?php echo $nota['ref']; ?>', <?php echo $nota['id']; ?>)"
                                                id="btn_cancelar_<?php echo $nota['id']; ?>"
                                                title="Cancelar nota fiscal">
                                            <i class="bi bi-x-circle"></i>
                                        </button>
                                    <?php endif; ?>
                                    
                                    <?php if ($nota['status'] == 'cancelado'): ?>
                                        <span class="badge bg-danger">
                                            <i class="bi bi-x-circle"></i> Cancelado
                                        </span>
                                        <?php if ($nota['data_cancelamento']): ?>
                                            <span class="badge bg-secondary" title="Cancelado em <?php echo date('d/m/Y H:i', strtotime($nota['data_cancelamento'])); ?>">
                                                <i class="bi bi-clock"></i>
                                            </span>
                                        <?php endif; ?>
                                    <?php endif; ?>
                                </div>
                            </td>
                        </tr>
                        <?php endforeach; ?>
                        <?php if (empty($notas)): ?>
                        <tr>
                            <td colspan="9" class="text-center text-muted py-4">
                                <i class="bi bi-inbox fs-1"></i><br>
                                Nenhuma nota fiscal encontrada
                            </td>
                        </tr>
                        <?php endif; ?>
                    </tbody>
                </table>
            </div>
        </div>
    </div>
</div>

<!-- SCRIPTS -->
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js"></script>
<script src="https://cdn.datatables.net/1.11.5/js/jquery.dataTables.min.js"></script>
<script src="https://cdn.datatables.net/1.11.5/js/dataTables.bootstrap5.min.js"></script>

<script>
// =============================================
// VARIÁVEIS GLOBAIS
// =============================================
let dataTable;
let atualizando = false;
let autoVerificacaoAtiva = true;
let intervaloAutoVerificacao = null;
var BASE_URL = window.location.pathname.substring(0, window.location.pathname.lastIndexOf('/'));
var refEmEdicao = null;
var idEmEdicao = null;
var verificacaoInicialExecutada = false;

// =============================================
// FUNÇÃO PARA CRIAR BOTÕES
// =============================================
function criarBotoesAcoes(ref, id, pdfUrl, xmlUrl) {
    var temPdf = pdfUrl && pdfUrl !== '';
    var temXml = xmlUrl && xmlUrl !== '';
    var isCancelado = $('tr[data-ref="' + ref + '"] .status-cancelado').length > 0;
    
    var pdfBtn = temPdf 
        ? '<a href="' + pdfUrl + '" target="_blank" class="btn btn-sm btn-pdf-active" title="Baixar PDF"><i class="bi bi-filetype-pdf"></i></a>'
        : '<button class="btn btn-sm btn-pdf-inactive" disabled title="PDF indisponível"><i class="bi bi-filetype-pdf"></i></button>';
    
    var xmlBtn = temXml 
        ? '<a href="' + xmlUrl + '" target="_blank" class="btn btn-sm btn-xml" title="Baixar XML"><i class="bi bi-filetype-xml"></i></a>'
        : '<button class="btn btn-sm btn-xml-inactive" disabled title="XML indisponível"><i class="bi bi-filetype-xml"></i></button>';
    
    if (isCancelado) {
        return `
            <div class="acoes-wrapper">
                ${pdfBtn}
                ${xmlBtn}
                <span class="badge bg-danger">
                    <i class="bi bi-x-circle"></i> Cancelado
                </span>
                <button class="btn-atualizar-individual ms-1" onclick="atualizarNotaIndividual('${ref}', ${id})" title="Atualizar esta nota">
                    <i class="bi bi-arrow-repeat"></i>
                </button>
            </div>
        `;
    }
    
    var isRascunho = $('tr[data-ref="' + ref + '"] .status-rascunho').length > 0;
    var isAutorizada = $('tr[data-ref="' + ref + '"] .status-autorizado, tr[data-ref="' + ref + '"] .status-aprovado').length > 0;
    var temEmail = $('tr[data-ref="' + ref + '"] .badge-enviado').length > 0;
    
    var botoes = `
        <div class="acoes-wrapper">
            ${pdfBtn}
            ${xmlBtn}
    `;
    
    if (!isRascunho && !isCancelado) {
        botoes += `
            <button class="btn-atualizar-individual ms-1" onclick="atualizarNotaIndividual('${ref}', ${id})" title="Atualizar esta nota">
                <i class="bi bi-arrow-repeat"></i>
            </button>
        `;
    }
    
    if (isRascunho) {
        botoes += `
            <button class="btn-emitir-rascunho" onclick="abrirModalEmitir('${ref}', ${id})" title="Emitir nota fiscal">
                <i class="bi bi-send"></i>
            </button>
            <a href="${BASE_URL}/emitir_nota.php?ref=${encodeURIComponent(ref)}" class="btn-editar-rascunho" title="Editar rascunho">
                <i class="bi bi-pencil"></i>
            </a>
            <button class="btn-excluir-rascunho" onclick="excluirRascunho('${ref}', ${id})" title="Excluir rascunho">
                <i class="bi bi-trash"></i>
            </button>
        `;
    } else if (isAutorizada) {
        if (temPdf || temXml) {
            if (temEmail) {
                botoes += `
                    <button class="btn-email-outline ms-1" onclick="reenviarEmail('${ref}', ${id})" title="Reenviar e-mail">
                        <i class="bi bi-envelope-check"></i>
                    </button>
                `;
            } else {
                botoes += `
                    <button class="btn-email ms-1" onclick="reenviarEmail('${ref}', ${id})" title="Enviar e-mail agora">
                        <i class="bi bi-envelope"></i>
                    </button>
                `;
            }
        }
        // Botão cancelar
        botoes += `
            <button class="btn-cancelar-nota ms-1" onclick="abrirModalCancelar('${ref}', ${id})" title="Cancelar nota fiscal">
                <i class="bi bi-x-circle"></i>
            </button>
        `;
    }
    
    botoes += '</div>';
    return botoes;
}

// =============================================
// INICIALIZAÇÃO
// =============================================
$(document).ready(function() {
    dataTable = $('#tabelaNotas').DataTable({
        language: {
            "sEmptyTable": "Nenhum registro encontrado",
            "sInfo": "Mostrando _START_ até _END_ de _TOTAL_ registros",
            "sInfoEmpty": "Mostrando 0 até 0 de 0 registros",
            "sInfoFiltered": "(filtrado de _MAX_ registros no total)",
            "sInfoPostFix": "",
            "sInfoThousands": ".",
            "sLengthMenu": "Mostrar _MENU_ registros",
            "sLoadingRecords": "Carregando...",
            "sProcessing": "Processando...",
            "sSearch": "Pesquisar:",
            "sZeroRecords": "Nenhum registro encontrado",
            "oPaginate": {
                "sFirst": "Primeiro",
                "sLast": "Último",
                "sNext": "Próximo",
                "sPrevious": "Anterior"
            },
            "oAria": {
                "sSortAscending": ": ativar para ordenar a coluna de forma crescente",
                "sSortDescending": ": ativar para ordenar a coluna de forma decrescente"
            }
        },
        order: [[1, 'desc']],
        pageLength: 25,
        columnDefs: [
            { orderable: false, targets: [8] }
        ]
    });
    
    iniciarAutoVerificacao();
    
    var segundos = 5;
    setInterval(function() {
        if (autoVerificacaoAtiva) {
            segundos--;
            if (segundos <= 0) {
                segundos = 5;
            }
            $('#autoTimer').text(segundos + 's');
        } else {
            $('#autoTimer').text('⏸️');
        }
    }, 1000);
    
    $('#btnConfirmarEmissao').on('click', function() {
        if (refEmEdicao && idEmEdicao) {
            $('#modalEmitirRascunho').modal('hide');
            executarEmissao(refEmEdicao, idEmEdicao);
        }
    });
    
    setTimeout(function() {
        if (!verificacaoInicialExecutada) {
            var rascunhos = $('tr[data-ref] .status-rascunho').length;
            var processando = $('tr[data-ref] .status-processando_autorizacao').length;
            var emailsPendentes = $('tr[data-ref] .badge-pendente').length;
            
            var totalPendentes = rascunhos + processando + emailsPendentes;
            
            if (totalPendentes > 0) {
                var msg = '🔍 Verificando ' + totalPendentes + ' pendência(s)...';
                if (rascunhos > 0) msg += ' ' + rascunhos + ' rascunho(s)';
                if (processando > 0) msg += ' ' + processando + ' em processamento';
                if (emailsPendentes > 0) msg += ' ' + emailsPendentes + ' e-mail(s) pendente(s)';
                mostrarToast(msg, 'info');
                
                setTimeout(function() {
                    verificarNotasAuto();
                }, 1500);
            }
            
            verificacaoInicialExecutada = true;
        }
    }, 2000);
});

// =============================================
// FUNÇÕES DE FILTRO
// =============================================
function filtrarPorStatus(status) {
    var url = new URL(window.location.href);
    if (status) {
        url.searchParams.set('status', status);
    } else {
        url.searchParams.delete('status');
    }
    window.location.href = url.toString();
}

// =============================================
// ATUALIZAR E EMITIR TODAS AS NOTAS
// =============================================
function atualizarEmitirTodas() {
    if (atualizando) return;
    
    var rascunhos = $('tr[data-ref] .status-rascunho').length;
    var processando = $('tr[data-ref] .status-processando_autorizacao').length;
    var emailsPendentes = $('tr[data-ref] .badge-pendente').length;
    
    if (rascunhos === 0 && processando === 0 && emailsPendentes === 0) {
        mostrarToast('📌 Nenhuma pendência para processar.', 'info');
        return;
    }
    
    var msg = 'Deseja processar todas as pendências?\n\n';
    if (rascunhos > 0) {
        msg += '📄 ' + rascunhos + ' rascunho(s) serão emitidos.\n';
    }
    if (processando > 0) {
        msg += '🔄 ' + processando + ' nota(s) em processamento serão verificadas.\n';
    }
    if (emailsPendentes > 0) {
        msg += '📧 ' + emailsPendentes + ' e-mail(s) pendente(s) serão enviados.\n';
    }
    
    if (!confirm(msg)) return;
    
    atualizando = true;
    $('#loadingOverlay').show();
    $('#loadingMensagem').text('Processando notas...');
    mostrarToast('🔄 Iniciando processamento...', 'info');
    
    $.ajax({
        url: window.location.pathname,
        method: 'GET',
        data: { ajax: 'atualizar_todas' },
        dataType: 'json',
        timeout: 120000,
        success: function(response) {
            atualizando = false;
            $('#loadingOverlay').hide();
            
            if (response.sucesso) {
                var emitidas = response.emitidas || 0;
                var erros = response.erros || 0;
                var atualizadas = response.atualizadas || 0;
                var emailsEnviados = response.emails_enviados || 0;
                var rascunhosRestantes = response.rascunhos_restantes || 0;
                
                if (response.resultados) {
                    Object.keys(response.resultados).forEach(function(ref) {
                        var resultado = response.resultados[ref];
                        var linha = $('tr[data-ref="' + ref + '"]');
                        
                        if (linha.length > 0) {
                            var id = linha.attr('id').replace('nota_', '');
                            
                            if (resultado.status == 'emitida' || resultado.status == 'autorizado' || resultado.status == 'aprovado') {
                                var statusClass = getStatusClass('autorizado');
                                $('#status_' + id).removeClass().addClass('status-badge ' + statusClass).text('AUTORIZADO');
                                
                                if (resultado.numero_nfse) {
                                    $('#numero_' + id).html('<strong>' + resultado.numero_nfse + '</strong>');
                                }
                                
                                var botoes = criarBotoesAcoes(ref, id, resultado.pdf_url, resultado.xml_url);
                                $('#acoes_' + id).html(botoes);
                                
                                if (resultado.email_enviado) {
                                    var emailCell = linha.find('td:eq(7)');
                                    if (emailCell.length) {
                                        emailCell.html('<span class="badge badge-enviado"><i class="bi bi-envelope-check"></i> ✅ Enviado</span>');
                                    }
                                    linha.removeClass('status-pendente').addClass('email-enviado');
                                }
                                
                                linha.addClass('auto-emitido');
                                setTimeout(function() {
                                    linha.removeClass('auto-emitido');
                                }, 3000);
                                
                            } else if (resultado.status == 'email_enviado') {
                                var emailCell = linha.find('td:eq(7)');
                                if (emailCell.length) {
                                    emailCell.html('<span class="badge badge-enviado"><i class="bi bi-envelope-check"></i> ✅ Enviado</span>');
                                }
                                linha.removeClass('status-pendente').addClass('email-enviado');
                                
                            } else if (resultado.status == 'erro' || resultado.status == 'erro_email') {
                                var statusClass = getStatusClass('erro_validacao');
                                $('#status_' + id).removeClass().addClass('status-badge ' + statusClass).text('ERRO');
                                linha.addClass('auto-erro');
                                setTimeout(function() {
                                    linha.removeClass('auto-erro');
                                }, 3000);
                            }
                        }
                    });
                }
                
                var novoTotal = $('tr[data-ref]').length;
                $('#totalRegistros').text(novoTotal + ' registros');
                $('#rascunhosPendentesCount').text(rascunhosRestantes);
                $('#totalRascunhosBadge').text(rascunhosRestantes);
                
                var msgFinal = '';
                if (emitidas > 0) msgFinal += '✅ ' + emitidas + ' rascunho(s) emitido(s)! ';
                if (atualizadas > 0) msgFinal += '✅ ' + atualizadas + ' nota(s) autorizada(s)! ';
                if (emailsEnviados > 0) msgFinal += '📧 ' + emailsEnviados + ' e-mail(s) enviado(s)! ';
                if (erros > 0) msgFinal += '❌ ' + erros + ' erro(s)! ';
                if (rascunhosRestantes > 0) msgFinal += '📌 ' + rascunhosRestantes + ' rascunho(s) restante(s).';
                
                mostrarToast(msgFinal || '✅ Processamento concluído!', 'success');
            } else {
                mostrarToast('❌ Erro ao processar: ' + (response.erro || 'Erro desconhecido'), 'danger');
            }
        },
        error: function(xhr, status, error) {
            atualizando = false;
            $('#loadingOverlay').hide();
            console.error('Erro:', error);
            mostrarToast('❌ Erro ao processar: ' + error, 'danger');
        }
    });
}

// =============================================
// FUNÇÕES DE TOAST E AUXILIARES
// =============================================
function mostrarToast(mensagem, tipo) {
    var bg = tipo == 'success' ? 'bg-success' : (tipo == 'danger' ? 'bg-danger' : (tipo == 'warning' ? 'bg-warning' : 'bg-info'));
    var icon = tipo == 'success' ? 'bi-check-circle' : (tipo == 'danger' ? 'bi-exclamation-triangle' : (tipo == 'warning' ? 'bi-exclamation-circle' : 'bi-info-circle'));
    var toast = $('<div class="toast show" role="alert" data-bs-autohide="true" data-bs-delay="5000">' +
        '<div class="toast-header ' + bg + ' text-white">' +
        '<strong class="me-auto"><i class="bi ' + icon + '"></i> Notificação</strong>' +
        '<button type="button" class="btn-close btn-close-white" data-bs-dismiss="toast"></button>' +
        '</div>' +
        '<div class="toast-body">' + mensagem + '</div>' +
        '</div>');
    $('#toastContainer').append(toast);
    toast.toast('show');
    setTimeout(function() { toast.remove(); }, 5000);
}

function getStatusClass(status) {
    var map = {
        'processando_autorizacao': 'status-processando_autorizacao',
        'autorizado': 'status-autorizado',
        'aprovado': 'status-aprovado',
        'rejeitado': 'status-rejeitado',
        'cancelado': 'status-cancelado',
        'erro_validacao': 'status-erro_validacao',
        'erro_autorizacao': 'status-erro_autorizacao',
        'rascunho': 'status-rascunho'
    };
    return map[status] || 'status-processando_autorizacao';
}

// =============================================
// FUNÇÕES DE EMISSÃO INDIVIDUAL
// =============================================
function abrirModalEmitir(ref, id) {
    if (!ref) {
        mostrarToast('Referência não informada', 'danger');
        return;
    }
    
    refEmEdicao = ref;
    idEmEdicao = id;
    
    var linha = $('#nota_' + id);
    if (linha.length) {
        var empresa = linha.data('empresa') || '-';
        var emitente = linha.data('emitente') || '-';
        var tomador = linha.data('tomador') || '-';
        var valor = linha.data('valor') || 'R$ 0,00';
        var data = linha.data('data') || '-';
        
        $('#modalRef').text(ref);
        $('#modalEmpresa').text(empresa);
        $('#modalEmitente').text(emitente);
        $('#modalTomador').text(tomador);
        $('#modalValor').text(valor);
        $('#modalData').text(data);
    }
    
    var modal = new bootstrap.Modal(document.getElementById('modalEmitirRascunho'));
    modal.show();
}

function executarEmissao(ref, id) {
    if (!ref) {
        mostrarToast('Referência não informada', 'danger');
        return;
    }
    
    var btn = $('#btn_emitir_' + id);
    btn.prop('disabled', true).html('<i class="bi bi-hourglass-split"></i>');
    
    $('#loadingOverlay').show();
    $('#loadingMensagem').text('Emitindo nota ' + ref + '...');
    mostrarToast('🔄 Emitindo nota ' + ref + '...', 'info');
    
    $.ajax({
        url: window.location.pathname,
        method: 'POST',
        data: { 
            ajax: 'emitir_rascunho', 
            ref: ref 
        },
        dataType: 'json',
        timeout: 120000,
        success: function(response) {
            $('#loadingOverlay').hide();
            btn.prop('disabled', false).html('<i class="bi bi-send"></i>');
            
            if (response.sucesso) {
                var msg = '✅ Nota ' + ref + ' emitida com sucesso!';
                if (response.numero_nfse) msg += ' Número: ' + response.numero_nfse;
                if (response.ambiente) msg += ' Ambiente: ' + response.ambiente.toUpperCase();
                if (response.email_enviado) msg += ' 📧 E-mail enviado!';
                
                var linha = $('#nota_' + id);
                if (linha.length) {
                    var statusClass = getStatusClass('autorizado');
                    $('#status_' + id).removeClass().addClass('status-badge ' + statusClass).text('AUTORIZADO');
                    
                    if (response.numero_nfse) {
                        $('#numero_' + id).html('<strong>' + response.numero_nfse + '</strong>');
                    }
                    
                    var botoes = criarBotoesAcoes(ref, id, response.pdf_url, response.xml_url);
                    $('#acoes_' + id).html(botoes);
                    
                    if (response.email_enviado) {
                        var emailCell = linha.find('td:eq(7)');
                        if (emailCell.length) {
                            emailCell.html('<span class="badge badge-enviado"><i class="bi bi-envelope-check"></i> ✅ Enviado</span>');
                        }
                        linha.addClass('email-enviado');
                    }
                    
                    linha.addClass('auto-emitido');
                    setTimeout(function() {
                        linha.removeClass('auto-emitido');
                    }, 3000);
                }
                
                mostrarToast(msg, 'success');
                setTimeout(function() {
                    location.reload();
                }, 2000);
            } else {
                var msg = response.erro || 'Erro desconhecido';
                if (typeof msg === 'object') {
                    msg = msg.mensagem || JSON.stringify(msg);
                }
                mostrarToast('❌ Erro ao emitir nota: ' + msg, 'danger');
            }
        },
        error: function(xhr, status, error) {
            $('#loadingOverlay').hide();
            btn.prop('disabled', false).html('<i class="bi bi-send"></i>');
            console.error('Erro:', error);
            mostrarToast('❌ Erro ao emitir nota: ' + error, 'danger');
        }
    });
}

function excluirRascunho(ref, id) {
    if (!ref) {
        mostrarToast('Referência não informada', 'danger');
        return;
    }
    
    if (!confirm('⚠️ Tem certeza que deseja excluir este rascunho?\n\nReferência: ' + ref + '\nEsta ação não pode ser desfeita.')) {
        return;
    }
    
    var btn = $('#btn_excluir_' + id);
    btn.prop('disabled', true).html('<i class="bi bi-hourglass-split"></i>');
    
    $('#loadingOverlay').show();
    $('#loadingMensagem').text('Excluindo rascunho ' + ref + '...');
    
    $.ajax({
        url: window.location.pathname,
        method: 'GET',
        data: { 
            ajax: 'excluir_rascunho', 
            ref: ref 
        },
        dataType: 'json',
        timeout: 15000,
        success: function(response) {
            $('#loadingOverlay').hide();
            btn.prop('disabled', false).html('<i class="bi bi-trash"></i>');
            
            if (response.sucesso) {
                mostrarToast('✅ Rascunho ' + ref + ' excluído com sucesso!', 'success');
                var row = $('#nota_' + id);
                if (row.length) {
                    dataTable.row(row).remove().draw();
                } else {
                    location.reload();
                }
            } else {
                mostrarToast('❌ ' + (response.erro || 'Erro ao excluir rascunho'), 'danger');
            }
        },
        error: function(xhr, status, error) {
            $('#loadingOverlay').hide();
            btn.prop('disabled', false).html('<i class="bi bi-trash"></i>');
            console.error('Erro:', error);
            mostrarToast('❌ Erro ao excluir rascunho: ' + error, 'danger');
        }
    });
}

function atualizarNotaIndividual(ref, id) {
    if (!ref) {
        mostrarToast('Referência não informada', 'danger');
        return;
    }
    
    var btn = $('#btn_individual_' + id);
    btn.prop('disabled', true).html('<i class="bi bi-hourglass-split"></i>');
    
    $('#loadingOverlay').show();
    $('#loadingMensagem').text('Atualizando nota ' + ref + '...');
    mostrarToast('🔄 Atualizando nota ' + ref + '...', 'info');
    
    $.ajax({
        url: window.location.pathname,
        method: 'GET',
        data: { 
            ajax: 'atualizar_individual', 
            ref: ref 
        },
        dataType: 'json',
        timeout: 30000,
        success: function(response) {
            $('#loadingOverlay').hide();
            btn.prop('disabled', false).html('<i class="bi bi-arrow-repeat"></i>');
            
            if (response.sucesso) {
                var linha = $('#nota_' + id);
                if (linha.length) {
                    var statusClass = getStatusClass('autorizado');
                    $('#status_' + id).removeClass().addClass('status-badge ' + statusClass).text('AUTORIZADO');
                    
                    if (response.numero_nfse) {
                        $('#numero_' + id).html('<strong>' + response.numero_nfse + '</strong>');
                    }
                    
                    var botoes = criarBotoesAcoes(ref, id, response.pdf_url, response.xml_url);
                    $('#acoes_' + id).html(botoes);
                    
                    if (response.email_enviado) {
                        var emailCell = linha.find('td:eq(7)');
                        if (emailCell.length) {
                            emailCell.html('<span class="badge badge-enviado"><i class="bi bi-envelope-check"></i> ✅ Enviado</span>');
                        }
                        linha.addClass('email-enviado');
                    }
                }
                
                var msg = '✅ Nota ' + ref + ' atualizada!';
                if (response.email_enviado) msg += ' 📧 E-mail enviado!';
                mostrarToast(msg, 'success');
                setTimeout(function() {
                    location.reload();
                }, 1500);
            } else {
                var msg = response.erro || response.mensagem || 'Erro desconhecido';
                mostrarToast('⚠️ ' + msg, 'warning');
            }
        },
        error: function(xhr, status, error) {
            $('#loadingOverlay').hide();
            btn.prop('disabled', false).html('<i class="bi bi-arrow-repeat"></i>');
            console.error('Erro:', error);
            mostrarToast('❌ Erro ao atualizar nota: ' + error, 'danger');
        }
    });
}

function reenviarEmail(ref, id) {
    if (!ref) {
        mostrarToast('Referência não informada', 'danger');
        return;
    }
    
    var btn = $('#btn_email_' + id);
    btn.prop('disabled', true).html('<i class="bi bi-hourglass-split"></i>');
    
    $('#loadingOverlay').show();
    $('#loadingMensagem').text('Reenviando e-mail para nota ' + ref + '...');
    mostrarToast('📧 Reenviando e-mail...', 'info');
    
    $.ajax({
        url: window.location.pathname,
        method: 'POST',
        data: { 
            ajax: 'reenviar_email', 
            ref: ref 
        },
        dataType: 'json',
        timeout: 60000,
        success: function(response) {
            $('#loadingOverlay').hide();
            btn.prop('disabled', false).html('<i class="bi bi-envelope"></i>');
            
            if (response.sucesso) {
                mostrarToast('✅ ' + response.mensagem, 'success');
                
                var linha = $('#nota_' + id);
                if (linha.length) {
                    var emailCell = linha.find('td:eq(7)');
                    if (emailCell.length) {
                        emailCell.html('<span class="badge badge-enviado" title="Enviado em: ' + new Date().toLocaleString() + '"><i class="bi bi-envelope-check"></i> ✅ Enviado</span>');
                    }
                    linha.removeClass('status-pendente email-erro').addClass('email-enviado');
                }
                
                setTimeout(function() {
                    location.reload();
                }, 2000);
            } else {
                mostrarToast('❌ ' + response.erro, 'danger');
                btn.html('<i class="bi bi-envelope"></i>');
            }
        },
        error: function(xhr, status, error) {
            $('#loadingOverlay').hide();
            btn.prop('disabled', false).html('<i class="bi bi-envelope"></i>');
            
            var erroMsg = 'Erro ao reenviar e-mail: ' + error;
            try {
                var resposta = xhr.responseText;
                if (resposta && resposta.length < 500) {
                    erroMsg = 'Resposta do servidor: ' + resposta;
                }
            } catch(e) {}
            
            console.error('Erro detalhado:', xhr.responseText);
            mostrarToast('❌ ' + erroMsg, 'danger');
        }
    });
}

// =============================================
// FUNÇÕES DE CANCELAMENTO
// =============================================

function abrirModalCancelar(ref, id) {
    if (!ref) {
        mostrarToast('Referência não informada', 'danger');
        return;
    }
    
    // Verificar se a nota pode ser cancelada
    $.ajax({
        url: window.location.pathname,
        method: 'GET',
        data: { 
            ajax: 'verificar_cancelamento', 
            ref: ref 
        },
        dataType: 'json',
        success: function(response) {
            if (response.sucesso && response.pode_cancelar) {
                // Preencher dados no modal
                var nota = response.nota || {};
                $('#modalCancelRef').text(ref);
                $('#modalCancelNumero').text(nota.numero_nfse || '-');
                $('#modalCancelValor').text('R$ ' + (parseFloat(nota.valor_servico || 0).toFixed(2).replace('.', ',')));
                $('#modalCancelData').text(nota.data_emissao ? new Date(nota.data_emissao).toLocaleString() : '-');
                $('#modalCancelEmpresa').text('Empresa #' + (nota.empresa_id || '-'));
                
                // Limpar justificativa
                $('#justificativaCancelamento').val('');
                
                // Mostrar modal
                var modal = new bootstrap.Modal(document.getElementById('modalCancelarNota'));
                modal.show();
                
                // Configurar evento de confirmação
                $('#btnConfirmarCancelamento').off('click').on('click', function() {
                    var justificativa = $('#justificativaCancelamento').val().trim();
                    executarCancelamento(ref, id, justificativa);
                });
                
            } else {
                mostrarToast('❌ ' + (response.erro || 'Nota não pode ser cancelada'), 'danger');
            }
        },
        error: function(xhr, status, error) {
            mostrarToast('❌ Erro ao verificar cancelamento: ' + error, 'danger');
        }
    });
}

function executarCancelamento(ref, id, justificativa) {
    if (!ref) {
        mostrarToast('Referência não informada', 'danger');
        return;
    }
    
    // Validar justificativa (opcional)
    if (justificativa.length > 0 && justificativa.length < 15) {
        mostrarToast('⚠️ A justificativa deve ter pelo menos 15 caracteres', 'warning');
        return;
    }
    
    var btn = $('#btnConfirmarCancelamento');
    btn.prop('disabled', true).html('<i class="bi bi-hourglass-split"></i> Aguarde...');
    
    // Fechar modal
    var modal = bootstrap.Modal.getInstance(document.getElementById('modalCancelarNota'));
    if (modal) modal.hide();
    
    $('#loadingOverlay').show();
    $('#loadingMensagem').text('Cancelando nota ' + ref + '...');
    mostrarToast('🔄 Cancelando nota ' + ref + '...', 'info');
    
    $.ajax({
        url: window.location.pathname,
        method: 'POST',
        data: { 
            ajax: 'cancelar_nota', 
            ref: ref,
            justificativa: justificativa,
            tipo: 'nacional'
        },
        dataType: 'json',
        timeout: 60000,
        success: function(response) {
            $('#loadingOverlay').hide();
            btn.prop('disabled', false).html('<i class="bi bi-check-circle"></i> Confirmar Cancelamento');
            
            if (response.sucesso) {
                var msg = '✅ ' + response.mensagem + ' (Ref: ' + ref + ')';
                mostrarToast(msg, 'success');
                
                // Atualizar linha da tabela
                var linha = $('#nota_' + id);
                if (linha.length) {
                    // Atualizar status
                    $('#status_' + id).removeClass().addClass('status-badge status-cancelado').text('CANCELADO');
                    
                    // Atualizar ações (remover botões de ação e adicionar apenas status)
                    $('#acoes_' + id).html(`
                        <div class="acoes-wrapper">
                            ${criarBotoesAcoes(ref, id, linha.data('pdf_url'), linha.data('xml_url'))}
                        </div>
                    `);
                    
                    // Adicionar classe visual
                    linha.addClass('auto-erro');
                    setTimeout(function() {
                        linha.removeClass('auto-erro');
                    }, 3000);
                }
                
                // Recarregar após 2 segundos para atualizar completamente
                setTimeout(function() {
                    location.reload();
                }, 2000);
                
            } else {
                var msg = response.erro || 'Erro desconhecido';
                if (typeof msg === 'object') msg = msg.mensagem || JSON.stringify(msg);
                mostrarToast('❌ ' + msg, 'danger');
            }
        },
        error: function(xhr, status, error) {
            $('#loadingOverlay').hide();
            btn.prop('disabled', false).html('<i class="bi bi-check-circle"></i> Confirmar Cancelamento');
            
            var erroMsg = 'Erro ao cancelar nota: ' + error;
            try {
                var resposta = xhr.responseText;
                if (resposta && resposta.length < 500) {
                    var json = JSON.parse(resposta);
                    if (json.erro) erroMsg = json.erro;
                }
            } catch(e) {}
            
            console.error('Erro detalhado:', xhr.responseText);
            mostrarToast('❌ ' + erroMsg, 'danger');
        }
    });
}

// =============================================
// AUTO-VERIFICAÇÃO E EMISSÃO AUTOMÁTICA
// =============================================
function verificarNotasAuto() {
    if (autoVerificacaoAtiva && !atualizando) {
        var rascunhosPendentes = $('tr[data-ref] .status-rascunho').length;
        var processando = $('tr[data-ref] .status-processando_autorizacao').length;
        var emailsPendentes = $('tr[data-ref] .badge-pendente').length;
        
        if (rascunhosPendentes > 0 || processando > 0 || emailsPendentes > 0) {
            $.ajax({
                url: window.location.pathname,
                method: 'GET',
                data: { ajax: 'atualizar_todas' },
                dataType: 'json',
                timeout: 30000,
                success: function(response) {
                    if (response.sucesso) {
                        var rascunhosRestantes = response.rascunhos_restantes || 0;
                        $('#rascunhosPendentesCount').text(rascunhosRestantes);
                        $('#totalRascunhosBadge').text(rascunhosRestantes);
                        
                        var temProcessando = $('tr[data-ref] .status-processando_autorizacao').length > 0;
                        var temRascunho = $('tr[data-ref] .status-rascunho').length > 0;
                        
                        if (temProcessando || temRascunho) {
                            console.log('⏳ Ainda há pendências. Recarregando em 3 segundos...');
                            mostrarToast('⏳ Aguardando autorização...', 'info');
                            setTimeout(function() { location.reload(); }, 3000);
                        } else {
                            console.log('✅ Todas as notas foram autorizadas!');
                            mostrarToast('✅ Processamento concluído!', 'success');
                            setTimeout(function() { location.reload(); }, 2000);
                        }
                    }
                },
                error: function(xhr, status, error) {
                    console.error('Erro:', error);
                    setTimeout(function() { location.reload(); }, 5000);
                }
            });
        }
    }
}

function iniciarAutoVerificacao() {
    if (intervaloAutoVerificacao) {
        clearInterval(intervaloAutoVerificacao);
    }
    autoVerificacaoAtiva = true;
    setTimeout(verificarNotasAuto, 1000);
    intervaloAutoVerificacao = setInterval(verificarNotasAuto, 5000);
    $('#btnAutoVerificacao').html('<i class="bi bi-pause-circle"></i> Parar Auto');
    $('#btnAutoVerificacao').removeClass('btn-outline-secondary inactive').addClass('btn-warning active');
}

function pararAutoVerificacao() {
    if (intervaloAutoVerificacao) {
        clearInterval(intervaloAutoVerificacao);
        intervaloAutoVerificacao = null;
    }
    autoVerificacaoAtiva = false;
    $('#btnAutoVerificacao').html('<i class="bi bi-play-circle"></i> Iniciar Auto');
    $('#btnAutoVerificacao').removeClass('btn-warning active').addClass('btn-outline-secondary inactive');
}

function alternarAutoVerificacao() {
    if (autoVerificacaoAtiva) {
        pararAutoVerificacao();
        mostrarToast('⏹️ Auto-verificação desativada', 'info');
    } else {
        iniciarAutoVerificacao();
        mostrarToast('▶️ Auto-verificação ativada (a cada 5s)', 'success');
    }
}

function recarregarTabela() {
    location.reload();
}
</script>

<?php 
ob_end_flush();
include 'includes/footer.php'; 
?>