<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

require_once 'includes/funcoes.php';

$pdo = conectarBanco();

// ============================================================
// PROCESSAR REPROCESSAMENTO (quando enviado via POST)
// ============================================================
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['reprocessar'])) {
    header('Content-Type: application/json');
    
    $nota_id = (int)$_POST['nota_id'];
    $resultado = [];
    
    // Buscar dados da nota
    $stmt = $pdo->prepare("
        SELECT n.*, 
               e.id as empresa_id, e.nome as empresa_nome, e.token, e.ambiente, e.optante_simples,
               em.id as emitente_id, em.cnpj as emitente_cnpj, em.inscricao_municipal,
               t.id as tomador_id, t.cnpj as tomador_cnpj, t.cpf as tomador_cpf, 
               t.razao_social as tomador_razao, t.email as tomador_email
        FROM notas_fiscais n
        JOIN empresas e ON n.empresa_id = e.id
        JOIN emitentes em ON n.emitente_id = em.id
        JOIN tomadores t ON n.tomador_id = t.id
        WHERE n.id = ?
    ");
    $stmt->execute([$nota_id]);
    $nota = $stmt->fetch(PDO::FETCH_ASSOC);
    
    if (!$nota) {
        echo json_encode(['sucesso' => false, 'erro' => 'Nota não encontrada']);
        exit;
    }
    
    // Buscar código municipal do emitente
    $stmt = $pdo->prepare("
        SELECT end.codigo_municipio 
        FROM emitentes em 
        LEFT JOIN enderecos end ON em.endereco_id = end.id 
        WHERE em.id = ?
    ");
    $stmt->execute([$nota['emitente_id']]);
    $endereco = $stmt->fetch(PDO::FETCH_ASSOC);
    $codigo_municipio_emitente = $endereco['codigo_municipio'] ?? 4304606;
    
    // Buscar endereço do tomador
    $stmt = $pdo->prepare("
        SELECT end.logradouro, end.numero, end.bairro, end.cidade, end.uf, end.cep, end.codigo_municipio
        FROM tomadores t 
        LEFT JOIN enderecos end ON t.endereco_id = end.id 
        WHERE t.id = ?
    ");
    $stmt->execute([$nota['tomador_id']]);
    $endereco_tomador = $stmt->fetch(PDO::FETCH_ASSOC);
    
    // Limpar documentos
    $cnpjPrestador = preg_replace('/[^0-9]/', '', $nota['emitente_cnpj']);
    $cnpjTomador = !empty($nota['tomador_cnpj']) ? preg_replace('/[^0-9]/', '', $nota['tomador_cnpj']) : null;
    $cpfTomador = !empty($nota['tomador_cpf']) ? preg_replace('/[^0-9]/', '', $nota['tomador_cpf']) : null;
    
    // Dados da nota
    $valorServico = (float)$nota['valor_servico'];
    $aliquotaISS = (float)$nota['aliquota'];
    $valorISS = round(($valorServico * $aliquotaISS) / 100, 2);
    $issRetido = $nota['iss_retido'] == 1;
    $dataEmissao = date('Y-m-d\TH:i:sP');
    $dataCompetencia = date('Y-m-d');
    
    // Código do serviço (6 dígitos)
    $codigoServicoNumerico = preg_replace('/[^0-9]/', '', $nota['codigo_servico']);
    $codigoServico = str_pad(substr($codigoServicoNumerico, 0, 6), 6, '0', STR_PAD_RIGHT);
    
    // Nova referência única
    $novaRef = $nota['ref'] . '_reprocess_' . time() . '_' . $nota['id'];
    
    // ============================================================
    // MONTAR PAYLOAD CONFORME O emitir.php QUE FUNCIONA
    // ============================================================
    $empresaId = $nota['empresa_id'];
    
    if ($empresaId == 2) {
        // Payload para empresa TR (ID 2)
        $codigoOpcaoSimplesNacional = 1;
        $tipoRetencaoIss = 2;
        $codigoTributarioMunicipal = "001";
        $codigoNBS = "124032200";
        
        $payload = [
            "data_emissao" => $dataEmissao,
            "data_competencia" => $dataCompetencia,
            "codigo_municipio_emissora" => 4304606,
            "cnpj_prestador" => $cnpjPrestador,
            "inscricao_municipal_prestador" => $nota['inscricao_municipal'] ?? '',
            "codigo_opcao_simples_nacional" => $codigoOpcaoSimplesNacional,
            "regime_especial_tributacao" => 0,
            "cnpj_tomador" => $cnpjTomador,
            "razao_social_tomador" => substr($nota['tomador_razao'], 0, 100),
            "codigo_municipio_tomador" => (int)($endereco_tomador['codigo_municipio'] ?? 4304606),
            "cep_tomador" => preg_replace('/[^0-9]/', '', $endereco_tomador['cep'] ?? ''),
            "logradouro_tomador" => substr($endereco_tomador['logradouro'] ?? '', 0, 100),
            "numero_tomador" => substr($endereco_tomador['numero'] ?? 'S/N', 0, 10),
            "complemento_tomador" => '',
            "bairro_tomador" => substr($endereco_tomador['bairro'] ?? 'CENTRO', 0, 50),
            "telefone_tomador" => '',
            "email_tomador" => $nota['tomador_email'] ?? '',
            "codigo_municipio_prestacao" => 4304606,
            "codigo_tributacao_nacional_iss" => $codigoServico,
            "codigo_tributacao_municipal_iss" => $codigoTributarioMunicipal,
            "descricao_servico" => $nota['discriminacao_servico'],
            "valor_servico" => $valorServico,
            "tributacao_iss" => 1,
            "tpRetISSQN" => (string)$tipoRetencaoIss,
            "indicador_total_tributacao" => "0",
            "codigo_nbs" => $codigoNBS
        ];
        
        if ($valorISS > 0) {
            $payload["valor_iss"] = $valorISS;
        }
        
    } else {
        // Payload para empresas 1 e 3
        $codigoOpcaoSimplesNacional = ($nota['optante_simples'] == 1) ? 3 : 1;
        $tipoRetencaoIss = $issRetido ? 1 : 2;
        $codigoNBS = "121012200";
        
        $payload = [
            "data_emissao" => $dataEmissao,
            "data_competencia" => $dataCompetencia,
            "codigo_municipio_emissora" => $codigo_municipio_emitente,
            "cnpj_prestador" => $cnpjPrestador,
            "codigo_opcao_simples_nacional" => $codigoOpcaoSimplesNacional,
            "regime_especial_tributacao" => 0,
            "regime_tributario_simples_nacional" => 1,
            "razao_social_tomador" => substr($nota['tomador_razao'], 0, 100),
            "codigo_municipio_tomador" => (int)($endereco_tomador['codigo_municipio'] ?? 4304606),
            "cep_tomador" => preg_replace('/[^0-9]/', '', $endereco_tomador['cep'] ?? ''),
            "logradouro_tomador" => substr($endereco_tomador['logradouro'] ?? '', 0, 100),
            "numero_tomador" => substr($endereco_tomador['numero'] ?? 'S/N', 0, 10),
            "complemento_tomador" => '',
            "bairro_tomador" => substr($endereco_tomador['bairro'] ?? '', 0, 50),
            "telefone_tomador" => '',
            "email_tomador" => $nota['tomador_email'] ?? '',
            "codigo_municipio_prestacao" => $codigo_municipio_emitente,
            "codigo_tributacao_nacional_iss" => $codigoServico,
            "codigo_nbs" => $codigoNBS,
            "descricao_servico" => $nota['discriminacao_servico'],
            "valor_servico" => $valorServico,
            "valor_iss" => $valorISS,
            "tributacao_iss" => 1,
            "tipo_retencao_iss" => $tipoRetencaoIss,
            "percentual_total_tributos_federais" => "0.00",
            "percentual_total_tributos_estaduais" => "0.00",
            "percentual_total_tributos_municipais" => number_format($aliquotaISS, 2, '.', ''),
            "situacao_tributaria_pis_cofins" => "00",
            "indicador_total_tributacao" => null
        ];
        
        if ($cnpjTomador && strlen($cnpjTomador) == 14) {
            $payload['cnpj_tomador'] = $cnpjTomador;
        } elseif ($cpfTomador && strlen($cpfTomador) == 11) {
            $payload['cpf_tomador'] = $cpfTomador;
        }
    }
    
    // ============================================================
    // SALVAR NOVA NOTA NO BANCO
    // ============================================================
    $stmt = $pdo->prepare("
        INSERT INTO notas_fiscais 
        (empresa_id, emitente_id, tomador_id, ref, codigo_servico, discriminacao_servico, 
         valor_servico, aliquota, valor_iss, iss_retido, status, payload_enviado, 
         data_emissao, data_competencia, criado_em)
        VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'processando_autorizacao', ?, ?, ?, NOW())
    ");
    
    $stmt->execute([
        $nota['empresa_id'], $nota['emitente_id'], $nota['tomador_id'], $novaRef, 
        $codigoServico, $nota['discriminacao_servico'],
        $valorServico, $aliquotaISS, $valorISS, $issRetido ? 1 : 0,
        json_encode($payload, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE),
        $dataEmissao, $dataCompetencia
    ]);
    
    $nova_nota_id = $pdo->lastInsertId();
    
    // ============================================================
    // ENVIAR PARA FOCUS NFe
    // ============================================================
    $baseUrl = $nota['ambiente'] == 'producao' 
        ? 'https://api.focusnfe.com.br/v2' 
        : 'https://homologacao.focusnfe.com.br/v2';
    
    $url = $baseUrl . '/nfsen?ref=' . urlencode($novaRef);
    
    $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($payload));
    curl_setopt($ch, CURLOPT_HTTPHEADER, [
        'Content-Type: json',
        'Accept: application/json',
        'Authorization: Basic ' . base64_encode($nota['token'] . ':')
    ]);
    curl_setopt($ch, CURLOPT_TIMEOUT, 60);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    
    $resposta = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    $curlError = curl_error($ch);
    curl_close($ch);
    
    if ($curlError) {
        echo json_encode(['sucesso' => false, 'erro' => 'Erro de conexão: ' . $curlError]);
        exit;
    }
    
    $respostaJson = json_decode($resposta, true);
    
    if ($httpCode == 200 || $httpCode == 201 || $httpCode == 202) {
        $numeroNfse = $respostaJson['numero'] ?? $respostaJson['nfse']['numero'] ?? null;
        if ($numeroNfse) {
            $pdo->prepare("UPDATE notas_fiscais SET numero_nfse = ?, status = 'autorizada', data_autorizacao = NOW() WHERE id = ?")
                ->execute([$numeroNfse, $nova_nota_id]);
        }
        echo json_encode(['sucesso' => true, 'numero_nfse' => $numeroNfse, 'ref' => $novaRef]);
        exit;
    }
    
    $mensagemErro = '';
    if (isset($respostaJson['erros']) && is_array($respostaJson['erros'])) {
        foreach ($respostaJson['erros'] as $erro) {
            $mensagemErro .= ($erro['Descricao'] ?? $erro['mensagem'] ?? '') . "\n";
        }
    } else {
        $mensagemErro = $respostaJson['mensagem'] ?? $respostaJson['error'] ?? "Erro HTTP $httpCode";
    }
    
    $pdo->prepare("UPDATE notas_fiscais SET status = 'erro_validacao' WHERE id = ?")->execute([$nova_nota_id]);
    echo json_encode(['sucesso' => false, 'erro' => trim($mensagemErro)]);
    exit;
}

// ============================================================
// EXIBIR LISTA DE NOTAS (se não for POST)
// ============================================================
echo "<!DOCTYPE html>
<html lang='pt-br'>
<head>
    <meta charset='UTF-8'>
    <title>Reprocessar Notas com Erro</title>
    <style>
        body { font-family: Arial, sans-serif; margin: 20px; }
        table { border-collapse: collapse; width: 100%; margin-top: 20px; }
        th, td { border: 1px solid #ddd; padding: 10px; text-align: left; }
        th { background: #4CAF50; color: white; }
        button { background: #2196F3; color: white; padding: 8px 16px; border: none; border-radius: 4px; cursor: pointer; }
        button:hover { background: #0b7dda; }
        .btn-reprocessar { background: #ff9800; }
        .btn-reprocessar:hover { background: #e68900; }
        .btn-todas { background: #4CAF50; padding: 12px 24px; font-size: 16px; margin-bottom: 20px; }
        .sucesso { color: green; }
        .erro { color: red; }
        #resultado { margin-top: 20px; padding: 15px; border: 1px solid #ddd; background: #f9f9f9; max-height: 500px; overflow-y: auto; display: none; }
        .loading { display: inline-block; width: 20px; height: 20px; border: 2px solid #f3f3f3; border-top: 2px solid #3498db; border-radius: 50%; animation: spin 1s linear infinite; margin-right: 10px; }
        @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }
    </style>
</head>
<body>
    <h2>📦 Reprocessar Notas com Erro</h2>";

// Buscar notas com erro
$notas = $pdo->query("
    SELECT n.id, n.ref, n.valor_servico, n.codigo_servico, n.discriminacao_servico,
           n.aliquota, n.iss_retido, n.status,
           e.id as empresa_id, e.nome as empresa_nome,
           em.id as emitente_id, em.cnpj as emitente_cnpj,
           t.id as tomador_id, t.cnpj as tomador_cnpj, t.cpf as tomador_cpf, 
           t.razao_social as tomador_razao
    FROM notas_fiscais n
    JOIN empresas e ON n.empresa_id = e.id
    JOIN emitentes em ON n.emitente_id = em.id
    JOIN tomadores t ON n.tomador_id = t.id
    WHERE n.status IN ('erro_validacao', 'erro_comunicacao')
    ORDER BY n.id DESC
");

$notas_lista = $notas->fetchAll(PDO::FETCH_ASSOC);
$total_notas = count($notas_lista);

if ($total_notas == 0) {
    echo "<div style='color: orange; padding: 20px; background: #fff3cd; border-radius: 5px;'>
            ⚠️ Nenhuma nota com erro encontrada!<br><br>
            <a href='nova_nota.php' style='background: #4CAF50; color: white; padding: 10px 20px; text-decoration: none; border-radius: 5px;'>➕ Criar Nova Nota</a>
          </div>";
    exit;
}

echo "<p>Total de notas com erro: <strong style='color: red;'>$total_notas</strong></p>";
echo "<button class='btn-todas' onclick='reprocessarTodas()'>🔄 Reprocessar TODAS as Notas ($total_notas)</button>";
echo "<button onclick='selecionarTodas()'>✅ Selecionar Todas</button> ";
echo "<button onclick='limparSelecao()'>❌ Limpar Seleção</button>";
echo "<button class='btn-reprocessar' onclick='reprocessarSelecionadas()'>🔄 Reprocessar Selecionadas</button>";

echo "<table>
        <thead>
            <tr><th><input type='checkbox' id='checkboxTodas' onclick='toggleTodos(this)'></th><th>ID</th><th>Empresa</th><th>Tomador</th><th>Valor</th><th>Status</th><th>Ref</th><th>Ação</th</tr>
        </thead>
        <tbody>";

foreach ($notas_lista as $nota) {
    $status_badge = $nota['status'] == 'erro_validacao' ? 'red' : 'orange';
    echo "<tr id='nota_{$nota['id']}'>
            <td><input type='checkbox' class='selecionar' value='{$nota['id']}'></td>
            <td>{$nota['id']}</td>
            <td>" . htmlspecialchars($nota['empresa_nome']) . "</td>
            <td>" . htmlspecialchars($nota['tomador_razao']) . "</td>
            <td>R$ " . number_format($nota['valor_servico'], 2, ',', '.') . "</td>
            <td style='color: $status_badge;'>{$nota['status']}</td>
            <td><code>{$nota['ref']}</code></td>
            <td><button class='btn-reprocessar' onclick='reprocessarNota({$nota['id']})'>Reprocessar</button></td>
          </tr>";
}

echo "</tbody></table>";
echo "<div id='resultado'></div>";

echo "
<script>
function toggleTodos(source) {
    var checkboxes = document.querySelectorAll('.selecionar');
    for(var i = 0; i < checkboxes.length; i++) {
        checkboxes[i].checked = source.checked;
    }
}

function selecionarTodas() {
    var checkboxes = document.querySelectorAll('.selecionar');
    for(var i = 0; i < checkboxes.length; i++) {
        checkboxes[i].checked = true;
    }
}

function limparSelecao() {
    var checkboxes = document.querySelectorAll('.selecionar');
    for(var i = 0; i < checkboxes.length; i++) {
        checkboxes[i].checked = false;
    }
}

async function reprocessarNota(id) {
    const resultadoDiv = document.getElementById('resultado');
    resultadoDiv.style.display = 'block';
    resultadoDiv.innerHTML += '<div><span class=\"loading\"></span> Reprocessando nota ' + id + '...</div>';
    
    try {
        const formData = new FormData();
        formData.append('reprocessar', '1');
        formData.append('nota_id', id);
        
        const response = await fetch(window.location.href, {
            method: 'POST',
            body: formData
        });
        
        const data = await response.json();
        
        if (data.sucesso) {
            resultadoDiv.innerHTML += '<div class=\"sucesso\">✅ Nota ' + id + ': Emitida! NFSe: ' + (data.numero_nfse || 'N/A') + '</div>';
            document.getElementById('nota_' + id).style.opacity = '0.5';
        } else {
            resultadoDiv.innerHTML += '<div class=\"erro\">❌ Nota ' + id + ': ' + data.erro + '</div>';
        }
    } catch(error) {
        resultadoDiv.innerHTML += '<div class=\"erro\">❌ Nota ' + id + ': Erro - ' + error.message + '</div>';
    }
}

async function reprocessarSelecionadas() {
    const checkboxes = document.querySelectorAll('.selecionar:checked');
    const ids = Array.from(checkboxes).map(cb => cb.value);
    
    if(ids.length === 0) {
        alert('Selecione pelo menos uma nota!');
        return;
    }
    
    const resultadoDiv = document.getElementById('resultado');
    resultadoDiv.style.display = 'block';
    resultadoDiv.innerHTML = '<div style=\"background: #fff3cd; padding: 10px;\">⏳ Reprocessando ' + ids.length + ' notas...</div>';
    
    for(const id of ids) {
        resultadoDiv.innerHTML += '<div><span class=\"loading\"></span> Reprocessando nota ' + id + '...</div>';
        
        try {
            const formData = new FormData();
            formData.append('reprocessar', '1');
            formData.append('nota_id', id);
            
            const response = await fetch(window.location.href, {
                method: 'POST',
                body: formData
            });
            
            const data = await response.json();
            
            if (data.sucesso) {
                resultadoDiv.innerHTML += '<div class=\"sucesso\">✅ Nota ' + id + ': Emitida! NFSe: ' + (data.numero_nfse || 'N/A') + '</div>';
                document.getElementById('nota_' + id).style.opacity = '0.5';
            } else {
                resultadoDiv.innerHTML += '<div class=\"erro\">❌ Nota ' + id + ': ' + data.erro + '</div>';
            }
        } catch(error) {
            resultadoDiv.innerHTML += '<div class=\"erro\">❌ Nota ' + id + ': Erro - ' + error.message + '</div>';
        }
    }
    
    resultadoDiv.innerHTML += '<hr><div style=\"background: #e8f5e9; padding: 10px;\"><strong>📊 Processamento concluído!</strong><br><a href=\"consultar_notas.php\">📋 Ver Notas Emitidas</a> | <a href=\"reprocessar_lote.php\">🔄 Voltar</a></div>';
}

async function reprocessarTodas() {
    const checkboxes = document.querySelectorAll('.selecionar');
    for(var i = 0; i < checkboxes.length; i++) {
        checkboxes[i].checked = true;
    }
    await reprocessarSelecionadas();
}
</script>
</body>
</html>";
?>