<?php
// importar_municipios_corrigido.php
error_reporting(E_ALL);
ini_set('display_errors', 1);
ini_set('max_execution_time', 300);
ini_set('memory_limit', '512M');

require_once 'includes/funcoes.php';

// Carregar autoload do Composer
require_once __DIR__ . '/vendor/autoload.php';

use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Shared\Date;

$pdo = conectarBanco();
$mensagem = '';
$erro = '';

// Função segura para limpar valores
function limparValor($valor) {
    if ($valor === null || $valor === '') {
        return '';
    }
    // Se for data do Excel
    if (is_numeric($valor) && $valor > 40000 && $valor < 50000) {
        return '';
    }
    return trim((string)$valor);
}

function limparNumero($valor) {
    $limpo = limparValor($valor);
    if ($limpo === '') return 0;
    return (int)preg_replace('/[^0-9]/', '', $limpo);
}

// Processar upload
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['planilha'])) {
    
    $arquivo = $_FILES['planilha'];
    
    if ($arquivo['error'] !== UPLOAD_ERR_OK) {
        $erro = "Erro no upload do arquivo. Código: " . $arquivo['error'];
    } else {
        $extensao = strtolower(pathinfo($arquivo['name'], PATHINFO_EXTENSION));
        $formatos_permitidos = ['ods', 'xlsx', 'xls', 'csv'];
        
        if (!in_array($extensao, $formatos_permitidos)) {
            $erro = "Formato não suportado. Use: ODS, XLSX, XLS ou CSV";
        } else {
            if ($extensao === 'csv') {
                $resultado = processarCSV($pdo, $arquivo['tmp_name']);
            } else {
                $resultado = processarExcel($pdo, $arquivo['tmp_name'], $extensao);
            }
            
            if ($resultado['sucesso']) {
                $mensagem = $resultado['mensagem'];
            } else {
                $erro = $resultado['mensagem'];
            }
        }
    }
}

function processarExcel($pdo, $caminho_arquivo, $extensao) {
    try {
        // Carregar planilha
        $spreadsheet = IOFactory::load($caminho_arquivo);
        $worksheet = $spreadsheet->getActiveSheet();
        $rows = $worksheet->toArray();
        
        if (empty($rows) || count($rows) < 2) {
            return ['sucesso' => false, 'mensagem' => 'Planilha vazia ou formato inválido'];
        }
        
        // Remover cabeçalho (primeira linha)
        $cabecalho = array_shift($rows);
        
        // Mapear colunas
        $mapeamento = identificarColunas($cabecalho);
        
        // Preparar statement
        $stmt = $pdo->prepare("
            INSERT INTO municipios 
            (uf, nome_uf, regiao_intermediaria_id, regiao_intermediaria_nome, 
             regiao_imediata_id, regiao_imediata_nome, municipio_codigo_original, 
             codigo_municipio_completo, nome_municipio) 
            VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
            ON DUPLICATE KEY UPDATE 
                nome_municipio = VALUES(nome_municipio),
                nome_uf = VALUES(nome_uf),
                regiao_intermediaria_nome = VALUES(regiao_intermediaria_nome),
                regiao_imediata_nome = VALUES(regiao_imediata_nome),
                updated_at = NOW()
        ");
        
        $linhas = 0;
        $importados = 0;
        $erros = 0;
        $erros_detalhes = [];
        
        foreach ($rows as $linha_num => $dados) {
            $linhas++;
            
            // Obter valores de forma segura
            $codigo_raw = $dados[$mapeamento['codigo']] ?? '';
            $nome_raw = $dados[$mapeamento['nome']] ?? '';
            
            $codigo = limparValor($codigo_raw);
            $nome = limparValor($nome_raw);
            
            // Pular linha vazia
            if (empty($codigo) && empty($nome)) {
                continue;
            }
            
            try {
                $uf = limparNumero($dados[$mapeamento['uf']] ?? '');
                $nome_uf = limparValor($dados[$mapeamento['nome_uf']] ?? '');
                $regiao_intermediaria_id = limparNumero($dados[$mapeamento['regiao_intermediaria_id']] ?? 0);
                $regiao_intermediaria_nome = limparValor($dados[$mapeamento['regiao_intermediaria_nome']] ?? '');
                $regiao_imediata_id = limparNumero($dados[$mapeamento['regiao_imediata_id']] ?? 0);
                $regiao_imediata_nome = limparValor($dados[$mapeamento['regiao_imediata_nome']] ?? '');
                $municipio_codigo_original = limparValor($dados[$mapeamento['codigo_original']] ?? '');
                
                // Limpar código (remover tudo não numérico)
                $codigo_limpo = preg_replace('/[^0-9]/', '', $codigo);
                $codigo_completo = str_pad($codigo_limpo, 7, '0', STR_PAD_LEFT);
                
                // Validar dados
                if (empty($codigo_completo) || strlen($codigo_completo) < 7) {
                    $erros++;
                    if (count($erros_detalhes) < 10) {
                        $erros_detalhes[] = "Linha " . ($linha_num + 2) . ": Código inválido '$codigo'";
                    }
                    continue;
                }
                
                if (empty($nome)) {
                    $erros++;
                    if (count($erros_detalhes) < 10) {
                        $erros_detalhes[] = "Linha " . ($linha_num + 2) . ": Nome do município vazio";
                    }
                    continue;
                }
                
                $stmt->execute([
                    $uf, 
                    $nome_uf, 
                    $regiao_intermediaria_id, 
                    $regiao_intermediaria_nome,
                    $regiao_imediata_id, 
                    $regiao_imediata_nome, 
                    $municipio_codigo_original,
                    $codigo_completo, 
                    $nome
                ]);
                
                $importados++;
                
                // Mostrar progresso a cada 500 registros
                if ($importados % 500 == 0) {
                    echo "<script>console.log('Importados: $importados');</script>";
                    flush();
                }
                
            } catch (PDOException $e) {
                $erros++;
                if (count($erros_detalhes) < 10) {
                    $erros_detalhes[] = "Linha " . ($linha_num + 2) . ": " . $e->getMessage();
                }
            }
        }
        
        $mensagem = "✅ Importação concluída!<br>";
        $mensagem .= "📊 Total de linhas processadas: " . number_format($linhas) . "<br>";
        $mensagem .= "✨ Registros importados/atualizados: " . number_format($importados) . "<br>";
        
        if ($erros > 0) {
            $mensagem .= "⚠️ Registros ignorados/erros: " . number_format($erros) . "<br>";
            if (count($erros_detalhes) > 0) {
                $mensagem .= "<details><summary>📝 Ver detalhes dos erros</summary>";
                $mensagem .= "<pre style='background:#f8d7da; padding:10px; margin-top:10px; overflow:auto; max-height:200px; font-size:12px;'>";
                $mensagem .= implode("\n", array_slice($erros_detalhes, 0, 20));
                $mensagem .= "</pre></details>";
            }
        }
        
        return ['sucesso' => true, 'mensagem' => $mensagem];
        
    } catch (Exception $e) {
        return ['sucesso' => false, 'mensagem' => 'Erro ao processar arquivo: ' . $e->getMessage()];
    }
}

function identificarColunas($cabecalho) {
    // Posições padrão (0-based)
    $mapeamento = [
        'uf' => 0,
        'nome_uf' => 1,
        'regiao_intermediaria_id' => 2,
        'regiao_intermediaria_nome' => 3,
        'regiao_imediata_id' => 4,
        'regiao_imediata_nome' => 5,
        'codigo_original' => 6,
        'codigo' => 7,
        'nome' => 8
    ];
    
    // Tentar identificar pelas palavras-chave (mais flexível)
    foreach ($cabecalho as $index => $coluna) {
        if ($coluna === null) continue;
        $coluna_lower = strtolower(trim((string)$coluna));
        
        if (strpos($coluna_lower, 'uf') !== false && strlen($coluna_lower) <= 5 && $mapeamento['uf'] === 0) {
            $mapeamento['uf'] = $index;
        }
        if (strpos($coluna_lower, 'nome_uf') !== false || strpos($coluna_lower, 'uf_nome') !== false) {
            $mapeamento['nome_uf'] = $index;
        }
        if (strpos($coluna_lower, 'código município completo') !== false || 
            strpos($coluna_lower, 'codigo_municipio_completo') !== false ||
            strpos($coluna_lower, 'código completo') !== false ||
            strpos($coluna_lower, 'codigo_completo') !== false) {
            $mapeamento['codigo'] = $index;
        }
        if (strpos($coluna_lower, 'nome_município') !== false || 
            strpos($coluna_lower, 'nome_municipio') !== false ||
            strpos($coluna_lower, 'município') !== false) {
            $mapeamento['nome'] = $index;
        }
        if (strpos($coluna_lower, 'município') !== false && strpos($coluna_lower, 'código') === false) {
            $mapeamento['codigo_original'] = $index;
        }
    }
    
    return $mapeamento;
}

function processarCSV($pdo, $caminho_arquivo) {
    try {
        $handle = fopen($caminho_arquivo, 'r');
        if (!$handle) {
            return ['sucesso' => false, 'mensagem' => 'Não foi possível abrir o arquivo CSV'];
        }
        
        // Detectar separador
        $primeira_linha = fgets($handle);
        rewind($handle);
        $separador = strpos($primeira_linha, "\t") !== false ? "\t" : ',';
        
        // Pular cabeçalho
        $cabecalho = fgetcsv($handle, 0, $separador);
        
        $stmt = $pdo->prepare("
            INSERT INTO municipios 
            (uf, nome_uf, regiao_intermediaria_id, regiao_intermediaria_nome, 
             regiao_imediata_id, regiao_imediata_nome, municipio_codigo_original, 
             codigo_municipio_completo, nome_municipio) 
            VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
            ON DUPLICATE KEY UPDATE 
                nome_municipio = VALUES(nome_municipio),
                updated_at = NOW()
        ");
        
        $linhas = 0;
        $importados = 0;
        
        while (($dados = fgetcsv($handle, 0, $separador)) !== false) {
            $linhas++;
            if (count($dados) < 9) continue;
            
            $codigo_original = limparValor($dados[6] ?? '');
            $codigo = limparValor($dados[7] ?? '');
            $nome = limparValor($dados[8] ?? '');
            
            if (empty($codigo) && empty($nome)) continue;
            
            try {
                $stmt->execute([
                    limparNumero($dados[0] ?? 0),
                    limparValor($dados[1] ?? ''),
                    limparNumero($dados[2] ?? 0),
                    limparValor($dados[3] ?? ''),
                    limparNumero($dados[4] ?? 0),
                    limparValor($dados[5] ?? ''),
                    $codigo_original,
                    str_pad(preg_replace('/[^0-9]/', '', $codigo), 7, '0', STR_PAD_LEFT),
                    $nome
                ]);
                $importados++;
            } catch (Exception $e) {
                // Ignorar erros individuais
            }
        }
        
        fclose($handle);
        
        return ['sucesso' => true, 'mensagem' => "✅ Importação CSV concluída! $importados registros de $linhas linhas."];
        
    } catch (Exception $e) {
        return ['sucesso' => false, 'mensagem' => 'Erro no CSV: ' . $e->getMessage()];
    }
}

// Estatísticas atuais
$total_municipios = 0;
if ($pdo) {
    $total_municipios = $pdo->query("SELECT COUNT(*) FROM municipios")->fetchColumn();
}
?>

<!DOCTYPE html>
<html lang="pt-br">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Importador de Municípios IBGE</title>
    <style>
        * { margin: 0; padding: 0; box-sizing: border-box; }
        
        body {
            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
            min-height: 100vh;
            padding: 20px;
        }
        
        .container { max-width: 900px; margin: 0 auto; }
        
        .card {
            background: white;
            border-radius: 15px;
            box-shadow: 0 20px 60px rgba(0,0,0,0.3);
            overflow: hidden;
        }
        
        .card-header {
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
            color: white;
            padding: 30px;
            text-align: center;
        }
        
        .card-header h1 { font-size: 28px; margin-bottom: 10px; }
        .card-header p { opacity: 0.9; }
        
        .card-body { padding: 30px; }
        
        .upload-area {
            border: 3px dashed #ddd;
            border-radius: 10px;
            padding: 40px;
            text-align: center;
            cursor: pointer;
            transition: all 0.3s ease;
            margin-bottom: 20px;
        }
        
        .upload-area:hover { border-color: #667eea; background: #f8f9ff; }
        .upload-area.dragover { border-color: #667eea; background: #f0f2ff; }
        .upload-icon { font-size: 48px; margin-bottom: 10px; }
        .file-info { color: #666; font-size: 14px; margin-top: 10px; }
        input[type="file"] { display: none; }
        
        button {
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
            color: white;
            border: none;
            padding: 12px 30px;
            border-radius: 8px;
            font-size: 16px;
            cursor: pointer;
            transition: transform 0.2s;
            width: 100%;
            margin-top: 10px;
        }
        
        button:hover { transform: translateY(-2px); }
        
        .message {
            padding: 15px;
            border-radius: 8px;
            margin-bottom: 20px;
        }
        
        .message.success { background: #d4edda; color: #155724; border: 1px solid #c3e6cb; }
        .message.error { background: #f8d7da; color: #721c24; border: 1px solid #f5c6cb; }
        
        .stats {
            background: #f8f9fa;
            padding: 20px;
            border-radius: 10px;
            text-align: center;
            margin-top: 20px;
        }
        
        .stat-number { font-size: 48px; font-weight: bold; color: #667eea; }
        .stat-label { color: #666; margin-top: 5px; }
        
        .loading {
            display: none;
            text-align: center;
            margin-top: 20px;
        }
        
        .spinner {
            border: 3px solid #f3f3f3;
            border-top: 3px solid #667eea;
            border-radius: 50%;
            width: 40px;
            height: 40px;
            animation: spin 1s linear infinite;
            margin: 0 auto;
        }
        
        @keyframes spin {
            0% { transform: rotate(0deg); }
            100% { transform: rotate(360deg); }
        }
        
        details {
            margin-top: 15px;
        }
        
        summary {
            cursor: pointer;
            color: #856404;
            font-weight: bold;
        }
    </style>
</head>
<body>
    <div class="container">
        <div class="card">
            <div class="card-header">
                <h1>📊 Importador de Municípios IBGE</h1>
                <p>Upload de planilhas ODS, XLSX, XLS e CSV</p>
            </div>
            
            <div class="card-body">
                <?php if ($mensagem): ?>
                    <div class="message success"><?php echo $mensagem; ?></div>
                <?php endif; ?>
                
                <?php if ($erro): ?>
                    <div class="message error"><?php echo $erro; ?></div>
                <?php endif; ?>
                
                <form id="uploadForm" method="POST" enctype="multipart/form-data">
                    <div class="upload-area" id="uploadArea">
                        <div class="upload-icon">📁</div>
                        <div>Clique ou arraste o arquivo aqui</div>
                        <div class="file-info">Suporta: XLSX, ODS, XLS, CSV</div>
                        <input type="file" name="planilha" id="fileInput" accept=".ods,.xlsx,.xls,.csv">
                    </div>
                    
                    <button type="submit" id="submitBtn">🚀 Importar Planilha</button>
                </form>
                
                <div class="stats">
                    <div class="stat-number"><?php echo number_format($total_municipios); ?></div>
                    <div class="stat-label">Municípios Cadastrados</div>
                </div>
                
                <div class="loading" id="loading">
                    <div class="spinner"></div>
                    <p style="margin-top: 10px;">Processando arquivo, aguarde...</p>
                </div>
            </div>
        </div>
    </div>
    
    <script>
        const uploadArea = document.getElementById('uploadArea');
        const fileInput = document.getElementById('fileInput');
        const form = document.getElementById('uploadForm');
        const loading = document.getElementById('loading');
        
        uploadArea.addEventListener('click', () => fileInput.click());
        
        uploadArea.addEventListener('dragover', (e) => {
            e.preventDefault();
            uploadArea.classList.add('dragover');
        });
        
        uploadArea.addEventListener('dragleave', () => uploadArea.classList.remove('dragover'));
        
        uploadArea.addEventListener('drop', (e) => {
            e.preventDefault();
            uploadArea.classList.remove('dragover');
            if (e.dataTransfer.files.length > 0) {
                fileInput.files = e.dataTransfer.files;
                updateFileInfo(e.dataTransfer.files[0]);
            }
        });
        
        fileInput.addEventListener('change', (e) => {
            if (e.target.files.length > 0) updateFileInfo(e.target.files[0]);
        });
        
        function updateFileInfo(file) {
            const fileInfo = document.querySelector('.file-info');
            fileInfo.innerHTML = `📄 Arquivo selecionado: ${file.name} (${formatFileSize(file.size)})`;
            fileInfo.style.color = '#4CAF50';
            fileInfo.style.fontWeight = 'bold';
        }
        
        function formatFileSize(bytes) {
            if (bytes === 0) return '0 Bytes';
            const k = 1024;
            const sizes = ['Bytes', 'KB', 'MB', 'GB'];
            const i = Math.floor(Math.log(bytes) / Math.log(k));
            return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
        }
        
        form.addEventListener('submit', () => {
            if (fileInput.files.length > 0) {
                loading.style.display = 'block';
                document.getElementById('submitBtn').disabled = true;
            }
        });
    </script>
</body>
</html>