<?php
/**
 * processar_registo.php
 * Handler AJAX do modal de registo de Proponente.
 * Recebe POST multipart/form-data, valida, guarda em `usuarios`.
 * Responde com JSON {ok:true|false, msg:'...', email:'...'}
 */

header('Content-Type: application/json; charset=utf-8');
header('X-Content-Type-Options: nosniff');

// Apenas POST
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    http_response_code(405);
    echo json_encode(['ok' => false, 'msg' => 'Método não permitido.']);
    exit;
}

require_once 'db.php';   // $pdo  + site_url()

/* ── 1. Recolher e sanitizar dados ────────────────────── */
function limpar(string $v): string { return trim(htmlspecialchars($v, ENT_QUOTES, 'UTF-8')); }

$nome_empresa    = limpar($_POST['nome_empresa']    ?? '');
$nuit            = limpar($_POST['nuit']            ?? '');
$setor           = limpar($_POST['setor_atividade'] ?? '');
$nome_resp       = limpar($_POST['nome_responsavel'] ?? '');
$telefone        = limpar($_POST['telefone']        ?? '');
$email           = strtolower(limpar($_POST['email'] ?? ''));
$aceita_termos   = !empty($_POST['aceita_termos']);

/* ── 2. Validação ─────────────────────────────────────── */
$erros = [];

if (!$nome_empresa)              $erros[] = 'Nome da empresa obrigatório.';
if (!preg_match('/^\d{9}$/', $nuit)) $erros[] = 'NUIT inválido (9 dígitos).';
if (!$setor)                     $erros[] = 'Sector de actividade obrigatório.';
if (!$nome_resp)                 $erros[] = 'Nome do responsável obrigatório.';
if (!$telefone)                  $erros[] = 'Telefone obrigatório.';
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) $erros[] = 'Email inválido.';
if (!$aceita_termos)             $erros[] = 'Deve aceitar os termos.';

if (!isset($_FILES['nuit_ficheiro']) || $_FILES['nuit_ficheiro']['error'] === UPLOAD_ERR_NO_FILE) {
    $erros[] = 'O comprovativo NUIT (PDF) é obrigatório.';
}

if ($erros) {
    echo json_encode(['ok' => false, 'msg' => implode(' ', $erros)]);
    exit;
}

/* ── 3. Verificar duplicados ─────────────────────────── */
$st = $pdo->prepare('SELECT id FROM usuarios WHERE nuit = ? OR email = ? LIMIT 1');
$st->execute([$nuit, $email]);
if ($st->fetch()) {
    echo json_encode(['ok' => false, 'msg' => 'Este NUIT ou email já se encontra registado no sistema.']);
    exit;
}

/* ── 4. Upload do PDF ────────────────────────────────── */
$nuit_ficheiro = null;
$pdf           = $_FILES['nuit_ficheiro'];

if ($pdf['error'] !== UPLOAD_ERR_OK) {
    echo json_encode(['ok' => false, 'msg' => 'Erro ao receber o ficheiro PDF (código ' . $pdf['error'] . ').']);
    exit;
}
if ($pdf['size'] > 5 * 1024 * 1024) {
    echo json_encode(['ok' => false, 'msg' => 'O PDF excede o tamanho máximo de 5 MB.']);
    exit;
}
// Verificar MIME real
$finfo = new finfo(FILEINFO_MIME_TYPE);
$mime  = $finfo->file($pdf['tmp_name']);
if ($mime !== 'application/pdf') {
    echo json_encode(['ok' => false, 'msg' => 'Apenas ficheiros PDF são aceites.']);
    exit;
}

$upload_dir = __DIR__ . '/uploads/nuit/';
if (!is_dir($upload_dir)) {
    mkdir($upload_dir, 0755, true);
}
$nuit_ficheiro = bin2hex(random_bytes(16)) . '.pdf';
if (!move_uploaded_file($pdf['tmp_name'], $upload_dir . $nuit_ficheiro)) {
    echo json_encode(['ok' => false, 'msg' => 'Erro ao guardar o ficheiro. Contacte o suporte.']);
    exit;
}

/* ── 5. Gerar senha temporária ───────────────────────── */
$chars      = 'ABCDEFGHJKMNPQRSTUVWXYZabcdefghjkmnpqrstuvwxyz23456789@#';
$senha_temp = '';
for ($i = 0; $i < 10; $i++) {
    $senha_temp .= $chars[random_int(0, strlen($chars) - 1)];
}
$hash_senha = password_hash($senha_temp, PASSWORD_BCRYPT);

/* ── 6. Inserir em usuarios ──────────────────────────── */
try {
    $ins = $pdo->prepare('
        INSERT INTO usuarios
          (username, nome, password, email, telefone,
           nuit, setor_atividade, nuit_ficheiro, nome_responsavel,
           nivel, status, ip_registo, data_criacao)
        VALUES
          (?, ?, ?, ?, ?,
           ?, ?, ?, ?,
           ?, 0, ?, NOW())
    ');
    $ins->execute([
        $email,          // username = email
        $nome_empresa,
        $hash_senha,
        $email,
        $telefone,
        $nuit,
        $setor,
        $nuit_ficheiro,
        $nome_resp,
        'PROPONENTE',
        $_SERVER['REMOTE_ADDR'] ?? '',
    ]);
    $novo_id = (int) $pdo->lastInsertId();
} catch (PDOException $e) {
    // Duplicado (race condition)
    if ($e->getCode() === '23000') {
        echo json_encode(['ok' => false, 'msg' => 'Este NUIT ou email já está registado.']);
    } else {
        error_log('[SGLA registo] ' . $e->getMessage());
        echo json_encode(['ok' => false, 'msg' => 'Erro interno. Tente novamente mais tarde.']);
    }
    exit;
}

/* ── 7. Log ──────────────────────────────────────────── */
try {
    $pdo->prepare('
        INSERT INTO system_logs
          (user_id, username, user_nivel, user_ip,
           acao, modulo, descricao, tipo, registro_id, registro_tabela, created_at)
        VALUES (0, ?, "PROPONENTE", ?, "Registo", "Proponentes", ?, "INFO", ?, "usuarios", NOW())
    ')->execute([
        $email,
        $_SERVER['REMOTE_ADDR'] ?? '',
        'Auto-registo de proponente: ' . $nome_empresa,
        $novo_id,
    ]);
} catch (PDOException $e) { /* silencioso — log não é crítico */ }

/* ── 8. Email ao proponente ──────────────────────────── */
$assunto = '[SGLA] Pedido de Registo Recebido — ' . $nome_empresa;
$corpo   = "Exmo(a) $nome_resp,\n\n"
         . "O pedido de registo da empresa \"$nome_empresa\" foi recebido com sucesso.\n\n"
         . "O registo encontra-se PENDENTE de aprovação pela equipa técnica do MAAP.\n"
         . "Após aprovação, receberá uma notificação e poderá aceder ao SGLA com:\n\n"
         . "  Utilizador: $email\n"
         . "  Senha temporária: $senha_temp\n\n"
         . "(Altere a senha no primeiro acesso)\n\n"
         . "Portal: " . site_url('admin/login') . "\n\n"
         . "Com os melhores cumprimentos,\nEquipa SGLA — MAAP\n"
         . "Direcção Nacional do Ambiente e Mudanças Climáticas";

@mail($email, $assunto, $corpo,
    "From: noreply@ambiente.gov.mz\r\nContent-Type: text/plain; charset=UTF-8\r\n");

/* ── 9. Email ao admin ───────────────────────────────── */
try {
    $admins = $pdo->query(
        'SELECT email FROM usuarios WHERE nivel="ADMIN" AND status=1 AND email IS NOT NULL LIMIT 5'
    )->fetchAll(PDO::FETCH_COLUMN);
    if ($admins) {
        $subj_adm = '[SGLA] Novo Registo Pendente — ' . $nome_empresa;
        $body_adm = "Novo pedido de registo de Proponente:\n\n"
                  . "Empresa:     $nome_empresa\nNUIT:        $nuit\n"
                  . "Sector:      $setor\nResponsável: $nome_resp\n"
                  . "Telefone:    $telefone\nEmail:       $email\n"
                  . "IP:          " . ($_SERVER['REMOTE_ADDR'] ?? '') . "\n\n"
                  . "Aprovar em: " . site_url('admin/usuarios');
        @mail(implode(',', $admins), $subj_adm, $body_adm,
            "From: noreply@ambiente.gov.mz\r\nContent-Type: text/plain; charset=UTF-8\r\n");
    }
} catch (PDOException $e) { /* silencioso */ }

/* ── 10. Resposta de sucesso ─────────────────────────── */
echo json_encode([
    'ok'    => true,
    'email' => $email,
    'msg'   => 'Pedido submetido com sucesso.',
]);
