<?php
// emitir_lote.php
require_once 'includes/funcoes.php';
session_start();

$pdo = conectarBanco();

// Processar emissão em lote
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['notas_ids'])) {
    $notas_ids = $_POST['notas_ids'];
    $resultados = [];
    
    foreach ($notas_ids as $nota_id) {
        // Buscar dados da nota
        $stmt = $pdo->prepare("
            SELECT n.*, e.token, e.ambiente, e.tipo_nfse,
                   em.cnpj as emitente_cnpj, em.inscricao_municipal,
                   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.id = ?
        ");
        $stmt->execute([$nota_id]);
        $nota = $stmt->fetch(PDO::FETCH_ASSOC);
        
        if (!$nota) {
            $resultados[] = [
                'id' => $nota_id,
                'sucesso' => false,
                'erro' => 'Nota não encontrada'
            ];
            continue;
        }
        
        // Enviar para API
        $resultado = enviarParaFocus($nota, $pdo);
        $resultados[] = array_merge(['id' => $nota_id], $resultado);
    }
    
    // Retornar resultados em JSON para AJAX
    if (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] === 'XMLHttpRequest') {
        header('Content-Type: application/json');
        echo json_encode($resultados);
        exit;
    }
    
    // Ou salvar na sessão para exibir
    $_SESSION['resultado_lote'] = $resultados;
    header('Location: emitir_lote.php');
    exit;
}

function enviarParaFocus($nota, $pdo) {
    try {
        // Montar payload igual ao seu emitir_nota_focus.php
        $cnpjPrestador = preg_replace('/[^0-9]/', '', $nota['emitente_cnpj']);
        $valorServico = (float)$nota['valor_servico'];
        $aliquotaISS = (float)$nota['aliquota'];
        $valorISS = ($valorServico * $aliquotaISS) / 100;
        
        // Definir endpoint e payload baseado na empresa
        $payload = [
            "data_emissao" => date('Y-m-d\TH:i:sP'),
            "data_competencia" => $nota['data_competencia'] ?? date('Y-m-d'),
            "codigo_municipio_emissora" => 4304606,
            "cnpj_prestador" => $cnpjPrestador,
            "codigo_opcao_simples_nacional" => $nota['optante_simples_nacional'] == 1 ? 3 : 1,
            "regime_especial_tributacao" => 0,
            "cnpj_tomador" => preg_replace('/[^0-9]/', '', $nota['tomador_cnpj']),
            "razao_social_tomador" => substr($nota['tomador_razao'], 0, 100),
            "codigo_municipio_tomador" => 4304606,
            "codigo_tributacao_nacional_iss" => $nota['codigo_servico'],
            "descricao_servico" => $nota['discriminacao_servico'],
            "valor_servico" => $valorServico,
            "valor_iss" => $valorISS,
            "tributacao_iss" => 1,
            "tipo_retencao_iss" => $nota['iss_retido'] == 1 ? 1 : 2
        ];
        
        // Enviar para Focus
        $baseUrl = $nota['ambiente'] == 'producao' 
            ? 'https://api.focusnfe.com.br/v2' 
            : 'https://homologacao.focusnfe.com.br/v2';
        
        $url = $baseUrl . '/nfsen?ref=' . urlencode($nota['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($payload));
        curl_setopt($ch, CURLOPT_HTTPHEADER, [
            'Content-Type: application/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);
        
        // Atualizar nota no banco
        $stmt = $pdo->prepare("UPDATE notas_fiscais SET resposta_api = ?, atualizado_em = NOW() WHERE id = ?");
        $stmt->execute([$resposta, $nota['id']]);
        
        if ($curlError) {
            $pdo->prepare("UPDATE notas_fiscais SET status = 'erro_comunicacao', mensagem_erro = ? WHERE id = ?")
                ->execute([$curlError, $nota['id']]);
            return ['sucesso' => false, 'erro' => 'Erro de comunicação: ' . $curlError];
        }
        
        $respostaJson = json_decode($resposta, true);
        
        if ($httpCode == 200 || $httpCode == 201 || $httpCode == 202) {
            $numeroNfse = $respostaJson['numero'] ?? $respostaJson['nfse']['numero'] ?? null;
            $pdo->prepare("UPDATE notas_fiscais SET numero_nfse = ?, status = 'autorizada', data_autorizacao = NOW() WHERE id = ?")
                ->execute([$numeroNfse, $nota['id']]);
            return ['sucesso' => true, 'numero_nfse' => $numeroNfse];
        }
        
        $mensagemErro = $respostaJson['erros'][0]['Descricao'] ?? $respostaJson['mensagem'] ?? $respostaJson['error'] ?? 'Erro na API';
        $pdo->prepare("UPDATE notas_fiscais SET status = 'erro_validacao', mensagem_erro = ? WHERE id = ?")
            ->execute([$mensagemErro, $nota['id']]);
        
        return ['sucesso' => false, 'erro' => $mensagemErro];
        
    } catch (Exception $e) {
        $pdo->prepare("UPDATE notas_fiscais SET status = 'erro_validacao', mensagem_erro = ? WHERE id = ?")
            ->execute([$e->getMessage(), $nota['id']]);
        return ['sucesso' => false, 'erro' => $e->getMessage()];
    }
}

// Buscar notas com erro para exibir
$notas_erro = $pdo->query("
    SELECT n.*, e.nome as empresa_nome, t.razao_social as tomador_nome
    FROM notas_fiscais n
    JOIN empresas e ON n.empresa_id = e.id
    JOIN tomadores t ON n.tomador_id = t.id
    WHERE n.status IN ('erro_validacao', 'erro_comunicacao', 'pendente')
    ORDER BY n.id DESC
    LIMIT 100
")->fetchAll(PDO::FETCH_ASSOC);
?>

<!DOCTYPE html>
<html lang="pt-br">
<head>
    <meta charset="UTF-8">
    <title>Emissão em Lote</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet">
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</head>
<body>
<div class="container mt-4">
    <h2>Emissão em Lote</h2>
    
    <form id="formLote" method="post">
        <div class="card">
            <div class="card-header">
                <input type="checkbox" id="selecionarTodos"> Selecionar Todas
            </div>
            <div class="card-body">
                <table class="table table-bordered">
                    <thead>
                        <tr>
                            <th></th>
                            <th>ID</th>
                            <th>Empresa</th>
                            <th>Tomador</th>
                            <th>Valor</th>
                            <th>Status</th>
                            <th>Ref</th>
                        </tr>
                    </thead>
                    <tbody>
                        <?php foreach ($notas_erro as $nota): ?>
                        <tr>
                            <td>
                                <input type="checkbox" name="notas_ids[]" value="<?php echo $nota['id']; ?>" class="selecionar">
                            </td>
                            <td><?php echo $nota['id']; ?></td>
                            <td><?php echo htmlspecialchars($nota['empresa_nome']); ?></td>
                            <td><?php echo htmlspecialchars($nota['tomador_nome']); ?></td>
                            <td>R$ <?php echo number_format($nota['valor_servico'], 2, ',', '.'); ?></td>
                            <td>
                                <?php
                                $badge = 'secondary';
                                if ($nota['status'] == 'erro_validacao') $badge = 'danger';
                                if ($nota['status'] == 'erro_comunicacao') $badge = 'warning';
                                ?>
                                <span class="badge bg-<?php echo $badge; ?>"><?php echo $nota['status']; ?></span>
                            </td>
                            <td><?php echo htmlspecialchars($nota['ref']); ?></td>
                        </tr>
                        <?php endforeach; ?>
                    </tbody>
                </table>
            </div>
            <div class="card-footer">
                <button type="submit" class="btn btn-primary" id="btnEmitir">Emitir Selecionadas</button>
                <span id="contador">0 selecionada(s)</span>
            </div>
        </div>
    </form>
    
    <div id="resultado" class="mt-4" style="display:none;">
        <div class="card">
            <div class="card-header bg-info text-white">Resultado da Emissão</div>
            <div class="card-body" id="resultadoLista"></div>
        </div>
    </div>
</div>

<script>
$(document).ready(function() {
    // Contador de selecionados
    function atualizarContador() {
        var total = $('.selecionar:checked').length;
        $('#contador').text(total + ' selecionada(s)');
    }
    
    $('#selecionarTodos').change(function() {
        $('.selecionar').prop('checked', $(this).prop('checked'));
        atualizarContador();
    });
    
    $('.selecionar').change(atualizarContador);
    
    // Envio do formulário via AJAX
    $('#formLote').submit(function(e) {
        e.preventDefault();
        
        var notasSelecionadas = [];
        $('.selecionar:checked').each(function() {
            notasSelecionadas.push($(this).val());
        });
        
        if (notasSelecionadas.length === 0) {
            alert('Selecione pelo menos uma nota');
            return;
        }
        
        $('#btnEmitir').prop('disabled', true).text('Processando...');
        
        $.ajax({
            url: 'emitir_lote.php',
            method: 'POST',
            data: {
                notas_ids: notasSelecionadas,
                ajax: true
            },
            dataType: 'json',
            success: function(response) {
                $('#resultado').show();
                var html = '';
                for (var i = 0; i < response.length; i++) {
                    var r = response[i];
                    if (r.sucesso) {
                        html += '<div class="alert alert-success">✅ Nota ' + r.id + ': Emitida com sucesso! Número: ' + (r.numero_nfse || 'N/A') + '</div>';
                    } else {
                        html += '<div class="alert alert-danger">❌ Nota ' + r.id + ': ' + r.erro + '</div>';
                    }
                }
                $('#resultadoLista').html(html);
                $('#btnEmitir').prop('disabled', false).text('Emitir Selecionadas');
                
                // Recarregar a página após 3 segundos
                setTimeout(function() {
                    location.reload();
                }, 3000);
            },
            error: function(xhr, status, error) {
                $('#resultado').show();
                $('#resultadoLista').html('<div class="alert alert-danger">Erro ao processar: ' + error + '</div>');
                $('#btnEmitir').prop('disabled', false).text('Emitir Selecionadas');
            }
        });
    });
    
    atualizarContador();
});
</script>
</body>
</html>