<?php
// Garantir codificação UTF-8
ini_set('default_charset', 'UTF-8');
header('Content-Type: text/html; charset=utf-8');

include 'verifica_login.php';
include 'conexao.php';
include 'config/base_utils.php';
$conn = conectar_banco();
garantir_estrutura_bases($conn);

$modo_base = trim($_POST['modo_base'] ?? 'existente');
$idbase_existente = (int)($_POST['idbase_existente'] ?? 0);
$base_nova = trim($_POST['base_nova'] ?? '');

if ($modo_base === 'nova') {
    $idbase_importacao = obter_ou_criar_base($conn, $base_nova);
    $base_importacao = obter_nome_base_por_id($conn, $idbase_importacao);
} else {
    $idbase_importacao = $idbase_existente;
    $base_importacao = obter_nome_base_por_id($conn, $idbase_importacao);
}

if ($idbase_importacao <= 0 || $base_importacao === '') {
    header('Location: importar_empresas.php?msg=erro&detalhe=' . urlencode('Selecione uma base existente ou informe o nome da nova base.'));
    exit;
}

if ($_SERVER['REQUEST_METHOD'] !== 'POST' || !isset($_FILES['arquivo_csv'])) {
    header('Location: importar_empresas.php?msg=erro&detalhe=Nenhum arquivo enviado');
    exit;
}

$arquivo = $_FILES['arquivo_csv'];

// Validar upload
if ($arquivo['error'] !== UPLOAD_ERR_OK) {
    header('Location: importar_empresas.php?msg=erro&detalhe=Erro no upload do arquivo');
    exit;
}

// Validar extensão
$extensao = strtolower(pathinfo($arquivo['name'], PATHINFO_EXTENSION));
if ($extensao !== 'csv') {
    header('Location: importar_empresas.php?msg=erro&detalhe=Formato inválido. Envie um arquivo CSV');
    exit;
}

// Abrir arquivo CSV
$handle = fopen($arquivo['tmp_name'], 'r');
if (!$handle) {
    header('Location: importar_empresas.php?msg=erro&detalhe=Não foi possível abrir o arquivo');
    exit;
}

// Detectar e tratar BOM UTF-8
$primeira_linha = fgets($handle);
if ($primeira_linha === false) {
    fclose($handle);
    header('Location: importar_empresas.php?msg=erro&detalhe=Arquivo CSV vazio');
    exit;
}

rewind($handle);
if (substr($primeira_linha, 0, 3) === "\xEF\xBB\xBF") {
    fseek($handle, 3);
}

function normalizar_cabecalho_csv($texto) {
    $texto = trim((string)$texto);
    if (!mb_check_encoding($texto, 'UTF-8')) {
        $texto = mb_convert_encoding($texto, 'UTF-8', 'ISO-8859-1');
    }

    $texto = mb_strtoupper($texto, 'UTF-8');
    $texto = str_replace(['Á','À','Â','Ã','Ä'], 'A', $texto);
    $texto = str_replace(['É','È','Ê','Ë'], 'E', $texto);
    $texto = str_replace(['Í','Ì','Î','Ï'], 'I', $texto);
    $texto = str_replace(['Ó','Ò','Ô','Õ','Ö'], 'O', $texto);
    $texto = str_replace(['Ú','Ù','Û','Ü'], 'U', $texto);
    $texto = str_replace(['Ç'], 'C', $texto);
    $texto = preg_replace('/[^A-Z0-9]+/', '_', $texto);
    $texto = trim($texto, '_');

    return $texto;
}

function obter_valor_por_alias(array $dados, array $mapaCabecalho, array $aliases, $padrao = '') {
    foreach ($aliases as $alias) {
        if (isset($mapaCabecalho[$alias])) {
            $idx = $mapaCabecalho[$alias];
            return trim((string)($dados[$idx] ?? ''));
        }
    }

    return $padrao;
}

$cabecalhoOriginal = fgetcsv($handle, 0, ';');
if ($cabecalhoOriginal === false) {
    fclose($handle);
    header('Location: importar_empresas.php?msg=erro&detalhe=Não foi possível ler o cabeçalho do CSV');
    exit;
}

$cabecalhoNormalizado = array_map('normalizar_cabecalho_csv', $cabecalhoOriginal);
$mapaCabecalho = [];
foreach ($cabecalhoNormalizado as $i => $nomeColuna) {
    if ($nomeColuna !== '') {
        $mapaCabecalho[$nomeColuna] = $i;
    }
}

if (!isset($mapaCabecalho['ID_EMPRESA']) || !isset($mapaCabecalho['CNPJ'])) {
    fclose($handle);
    $cabecalhosInfo = implode(', ', $cabecalhoOriginal);
    header('Location: importar_empresas.php?msg=erro&detalhe=' . urlencode('Cabeçalho inválido. É obrigatório ter ID_EMPRESA e CNPJ. Cabeçalhos recebidos: ' . $cabecalhosInfo));
    exit;
}

$linhasParaImportar = [];
$linha_num = 1; // cabeçalho
$erros = [];

while (($dados = fgetcsv($handle, 0, ';')) !== false) {
    $linha_num++;

    if (count($dados) === 1 && trim((string)($dados[0] ?? '')) === '') {
        continue;
    }

    $dados = array_map(function($item) {
        $item = (string)$item;
        if (!mb_check_encoding($item, 'UTF-8')) {
            return mb_convert_encoding($item, 'UTF-8', 'ISO-8859-1');
        }
        return $item;
    }, $dados);

    $id_empresa = obter_valor_por_alias($dados, $mapaCabecalho, ['ID_EMPRESA', 'IDEMPRESA']);
    $cnpj = obter_valor_por_alias($dados, $mapaCabecalho, ['CNPJ']);
    $nome_fantasia = obter_valor_por_alias($dados, $mapaCabecalho, ['NOME_FANTASIA', 'NOMEFANTASIA']);
    $empresa = obter_valor_por_alias($dados, $mapaCabecalho, ['EMPRESA', 'RAZAO_SOCIAL', 'RAZAOSOCIAL']);
    $rua = obter_valor_por_alias($dados, $mapaCabecalho, ['RUA', 'ENDERECO']);
    $numero = obter_valor_por_alias($dados, $mapaCabecalho, ['NUMERO']);
    $compl_num = obter_valor_por_alias($dados, $mapaCabecalho, ['COMPL_NUM', 'COMPLEMENTO', 'COMPL']);
    $bairro = obter_valor_por_alias($dados, $mapaCabecalho, ['BAIRRO']);
    $cidade = obter_valor_por_alias($dados, $mapaCabecalho, ['CIDADE']);
    $uf = obter_valor_por_alias($dados, $mapaCabecalho, ['UF']);
    $cep = obter_valor_por_alias($dados, $mapaCabecalho, ['CEP']);
    $ddd = obter_valor_por_alias($dados, $mapaCabecalho, ['DDD']);
    $tel = obter_valor_por_alias($dados, $mapaCabecalho, ['TEL', 'TELEFONE']);
    $cnae = obter_valor_por_alias($dados, $mapaCabecalho, ['CNAE']);
    $funcionarios = obter_valor_por_alias($dados, $mapaCabecalho, ['FUNCIONARIOS', 'FUNCIONARIO']);
    $site = obter_valor_por_alias($dados, $mapaCabecalho, ['SITE']);
    $base = obter_valor_por_alias($dados, $mapaCabecalho, ['BASE']);
    $porte = obter_valor_por_alias($dados, $mapaCabecalho, ['PORTE']);

    if ($id_empresa === '') {
        $erros[] = "Linha $linha_num: ID_EMPRESA vazio";
        continue;
    }
    if ($cnpj === '') {
        $erros[] = "Linha $linha_num: CNPJ vazio";
        continue;
    }

    $linhasParaImportar[] = [
        'id_empresa' => (int)$id_empresa,
        'cnpj' => $cnpj,
        'nome_fantasia' => $nome_fantasia,
        'empresa' => $empresa,
        'rua' => $rua,
        'numero' => $numero,
        'compl_num' => $compl_num,
        'bairro' => $bairro,
        'cidade' => $cidade,
        'uf' => $uf,
        'cep' => $cep,
        'ddd' => $ddd,
        'tel' => $tel,
        'cnae' => $cnae,
        'funcionarios' => $funcionarios,
        'site' => $site,
        'base' => $base_importacao,
        'idbase' => $idbase_importacao,
        'porte' => $porte,
        'ativa' => 'S'
    ];
}

fclose($handle);

if (count($linhasParaImportar) === 0) {
    $msg_erro = count($erros) > 0
        ? implode('; ', array_slice($erros, 0, 3))
        : 'Nenhuma linha válida encontrada para importação';
    header('Location: empresas.php?msg=erro_importacao&detalhe=' . urlencode($msg_erro) . '&total=0');
    exit;
}

$total_importados = 0;

try {
    $conn->begin_transaction();

    // Limpar somente dados da base escolhida (mantém demais bases)
    $stmt_delete = $conn->prepare("DELETE FROM empresas WHERE idbase = ?");
    if (!$stmt_delete) {
        throw new Exception('Falha ao preparar limpeza da base: ' . $conn->error);
    }
    $stmt_delete->bind_param('i', $idbase_importacao);
    if (!$stmt_delete->execute()) {
        throw new Exception('Falha ao limpar dados da base selecionada: ' . $stmt_delete->error);
    }
    $stmt_delete->close();

    $stmt_insert = $conn->prepare("INSERT INTO empresas (ID_EMPRESA, CNPJ, NOME_FANTASIA, EMPRESA, RUA, NUMERO, COMPL_NUM, BAIRRO, CIDADE, UF, CEP, DDD, TEL, CNAE, FUNCIONARIOS, SITE, BASE, idbase, PORTE, ATIVA) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
        ON DUPLICATE KEY UPDATE
            CNPJ = VALUES(CNPJ),
            NOME_FANTASIA = VALUES(NOME_FANTASIA),
            EMPRESA = VALUES(EMPRESA),
            RUA = VALUES(RUA),
            NUMERO = VALUES(NUMERO),
            COMPL_NUM = VALUES(COMPL_NUM),
            BAIRRO = VALUES(BAIRRO),
            CIDADE = VALUES(CIDADE),
            UF = VALUES(UF),
            CEP = VALUES(CEP),
            DDD = VALUES(DDD),
            TEL = VALUES(TEL),
            CNAE = VALUES(CNAE),
            FUNCIONARIOS = VALUES(FUNCIONARIOS),
            SITE = VALUES(SITE),
            BASE = VALUES(BASE),
            idbase = VALUES(idbase),
            PORTE = VALUES(PORTE),
            ATIVA = VALUES(ATIVA)");
    if (!$stmt_insert) {
        throw new Exception('Falha ao preparar INSERT: ' . $conn->error);
    }

    $types_insert = 'i' . str_repeat('s', 16) . 'i' . str_repeat('s', 2);

    $id_empresa_i = 0;
    $cnpj_i = '';
    $nome_fantasia_i = '';
    $empresa_i = '';
    $rua_i = '';
    $numero_i = '';
    $compl_num_i = '';
    $bairro_i = '';
    $cidade_i = '';
    $uf_i = '';
    $cep_i = '';
    $ddd_i = '';
    $tel_i = '';
    $cnae_i = '';
    $funcionarios_i = '';
    $site_i = '';
    $base_i = '';
    $idbase_i = 0;
    $porte_i = '';
    $ativa_i = 'S';

    $stmt_insert->bind_param(
        $types_insert,
        $id_empresa_i,
        $cnpj_i,
        $nome_fantasia_i,
        $empresa_i,
        $rua_i,
        $numero_i,
        $compl_num_i,
        $bairro_i,
        $cidade_i,
        $uf_i,
        $cep_i,
        $ddd_i,
        $tel_i,
        $cnae_i,
        $funcionarios_i,
        $site_i,
        $base_i,
        $idbase_i,
        $porte_i,
        $ativa_i
    );

    foreach ($linhasParaImportar as $linha) {
        $id_empresa_i = (int)$linha['id_empresa'];
        $cnpj_i = (string)$linha['cnpj'];
        $nome_fantasia_i = (string)$linha['nome_fantasia'];
        $empresa_i = (string)$linha['empresa'];
        $rua_i = (string)$linha['rua'];
        $numero_i = (string)$linha['numero'];
        $compl_num_i = (string)$linha['compl_num'];
        $bairro_i = (string)$linha['bairro'];
        $cidade_i = (string)$linha['cidade'];
        $uf_i = (string)$linha['uf'];
        $cep_i = (string)$linha['cep'];
        $ddd_i = (string)$linha['ddd'];
        $tel_i = (string)$linha['tel'];
        $cnae_i = (string)$linha['cnae'];
        $funcionarios_i = (string)$linha['funcionarios'];
        $site_i = (string)$linha['site'];
        $base_i = (string)$linha['base'];
        $idbase_i = (int)$linha['idbase'];
        $porte_i = (string)$linha['porte'];
        $ativa_i = (string)$linha['ativa'];

        if (!$stmt_insert->execute()) {
            throw new Exception('Erro ao inserir registro ID ' . $id_empresa_i . ': ' . $stmt_insert->error);
        }

        $total_importados++;
    }

    $stmt_insert->close();

    // Segurança extra: garante idbase/base para todos os IDs importados,
    // inclusive quando registros antigos estavam com BASE vazia.
    $ids_importados = [];
    foreach ($linhasParaImportar as $linha) {
        $ids_importados[] = (int)$linha['id_empresa'];
    }
    $ids_importados = array_values(array_unique($ids_importados));

    if (count($ids_importados) > 0) {
        $base_esc = $conn->real_escape_string($base_importacao);
        $chunks = array_chunk($ids_importados, 500);

        foreach ($chunks as $chunk_ids) {
            $ids_csv = implode(',', array_map('intval', $chunk_ids));
            $sql_fix = "UPDATE empresas SET idbase = " . (int)$idbase_importacao . ", BASE = '" . $base_esc . "' WHERE ID_EMPRESA IN (" . $ids_csv . ")";

            if (!$conn->query($sql_fix)) {
                throw new Exception('Falha ao ajustar idbase/base após importação: ' . $conn->error);
            }
        }
    }

    $conn->commit();
} catch (Exception $e) {
    $conn->rollback();
    $conn->close();
    header('Location: empresas.php?msg=erro_importacao&detalhe=' . urlencode($e->getMessage()) . '&total=' . $total_importados);
    exit;
}

$conn->close();

// Redirecionar com resultado
// Redirecionar com resultado para a tela de empresas
if (count($erros) > 0) {
    $msg_erro = implode('; ', array_slice($erros, 0, 3)); // Mostrar até 3 erros
    header('Location: empresas.php?msg=erro_importacao&detalhe=' . urlencode($msg_erro) . '&total=' . $total_importados . '&base=' . urlencode($base_importacao));
} else {
    header('Location: empresas.php?msg=importacao_sucesso&total=' . $total_importados . '&base=' . urlencode($base_importacao));
}
exit;
