<?php
// Arquivo: processar_cadastro_adm.php
// Responsável por processar o formulário de cadastro de administradores

// ===================================================================
// Bloco 1: Funções de Suporte e Configurações Iniciais
// ===================================================================

/**
 * Escreve mensagens em um arquivo de log para depuração.
 * @param string $message A mensagem a ser logada.
 * @param string $logLevel O nível do log (ex: INFO, ERROR, WARNING).
 */
function writeLog($message, $logLevel = 'INFO') {
    $logDir = __DIR__ . '/temp_logs';
    if (!is_dir($logDir)) {
        @mkdir($logDir, 0777, true);
    }
    $logFile = $logDir . '/cadastro_adm_log.log';
    $timestamp = date('[d-M-Y H:i:s T]');
    $logEntry = "$timestamp --- [$logLevel] --- $message\n";
    file_put_contents($logFile, $logEntry, FILE_APPEND | LOCK_EX);
}

// Inicia a sessão se ainda não estiver iniciada
if (session_status() == PHP_SESSION_NONE) {
    session_start();
    writeLog('Sessão iniciada.');
}

require_once 'middleware-auth.php';
authAdministrador();
writeLog('Middleware de autenticação verificado.');

require_once 'conexao.php';
require_once 'env.php';
writeLog('Arquivos de dependência (conexao.php, env.php) carregados.');

// ===================================================================
// Bloco 2: Verificação de Requisição e CSRF
// ===================================================================

writeLog('Verificando método da requisição...');
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    $_SESSION['mensagem_erro'] = "Acesso inválido à página de processamento.";
    header("Location: cadastro_administrador.php");
    exit();
}

writeLog('Verificando token CSRF...');
if (!isset($_POST['csrf_token']) || !isset($_SESSION['csrf_token']) || !hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'])) {
    writeLog('ERRO DE SEGURANÇA: Token CSRF inválido ou ausente.', 'ERROR');
    $_SESSION['mensagem_erro'] = "Erro de validação de segurança (CSRF). Tente novamente.";
    header("Location: cadastro_administrador.php");
    exit();
}
writeLog('Token CSRF verificado com sucesso.');

// ===================================================================
// Bloco 3: Validação dos Dados do Formulário
// ===================================================================

$erro_cadastro = '';
$nome  = trim($_POST['nome'] ?? '');
$login = filter_var(trim($_POST['login'] ?? ''), FILTER_SANITIZE_EMAIL);
$senha = $_POST['senha'] ?? '';
writeLog("Dados do formulário recebidos. Nome: {$nome}, Login: {$login}");

// Validações
if (empty($nome)) {
    $erro_cadastro = "O campo Nome é obrigatório.";
} elseif (empty($login)) {
    $erro_cadastro = "O campo Login (E-mail) é obrigatório.";
} elseif (!filter_var($login, FILTER_VALIDATE_EMAIL)) {
    $erro_cadastro = "Formato de e-mail inválido para o Login.";
} elseif (empty($senha)) {
    $erro_cadastro = "O campo Senha é obrigatório.";
} elseif (strlen($senha) < 8) {
    $erro_cadastro = "A senha deve ter no mínimo 8 caracteres.";
} elseif (!preg_match("/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,}$/", $senha)) {
    $erro_cadastro = "A senha deve conter pelo menos uma letra maiúscula, uma minúscula e um número.";
}

if (empty($erro_cadastro)) {
    writeLog("Validação de formulário bem-sucedida.");
    if (!$pdo) {
        $erro_cadastro = "Erro crítico de sistema (DB). Não foi possível processar o cadastro.";
        writeLog("Falha: Conexão PDO não disponível.", 'CRITICAL');
    } else {
        try {
            // --- VERIFICAÇÃO DE DUPLICIDADE (CORRIGIDA) ---
            writeLog("Iniciando verificação de duplicidade de login.");
            $sql_check_login = "
                SELECT id FROM Administradores WHERE login = :login_admin
                UNION ALL
                SELECT id FROM Empresas WHERE login = :login_empresa
                UNION ALL
                SELECT id FROM Candidatos WHERE login = :login_candidato
            ";
            $stmt_check_login = $pdo->prepare($sql_check_login);
            $stmt_check_login->execute([
                ':login_admin' => $login,
                ':login_empresa' => $login,
                ':login_candidato' => $login
            ]);
            
            if ($stmt_check_login->fetch()) {
                $erro_cadastro = "Este login (e-mail) já está cadastrado no sistema.";
                writeLog("ERRO: Login já cadastrado.", 'WARNING');
            } else {
                writeLog("Login não duplicado. Prosseguindo com a inserção.");
                // Hash da senha e inserção no banco de dados
                $senha_hash = password_hash($senha, PASSWORD_DEFAULT);

                $sql_insert = "INSERT INTO Administradores (nome, login, senha, role) VALUES (:nome, :login, :senha, 'Administradores')";
                $stmt_insert = $pdo->prepare($sql_insert);
                $resultado = $stmt_insert->execute([
                    ':nome'  => $nome,
                    ':login' => $login,
                    ':senha' => $senha_hash
                ]);
                
                if ($resultado) {
                    $novo_admin_id = $pdo->lastInsertId();
                    $admin_que_cadastrou_id = $_SESSION['id'] ?? 0;
                    $admin_que_cadastrou_nome = $_SESSION['usuario_nome'] ?? 'Admin Desconhecido';

                    writeLog("Novo administrador (ID: {$novo_admin_id}) cadastrado por {$admin_que_cadastrou_nome} (ID: {$admin_que_cadastrou_id}).", 'SUCCESS');

                    // Registrar ação no histórico de acessos
                    $sql_hist_action = "INSERT INTO historico_acessos (usuario_id, tipo_usuario, pagina_acessada, data_acesso) VALUES (?, ?, ?, NOW())";
                    $stmt_hist_action = $pdo->prepare($sql_hist_action);
                    $stmt_hist_action->execute([$admin_que_cadastrou_id, 'admin', "processar_cadastro_adm.php (Novo Admin ID: {$novo_admin_id})"]);

                    $_SESSION['mensagem_sucesso'] = "Administrador '{$nome}' cadastrado com sucesso!";
                    writeLog("Mensagem de sucesso definida. Redirecionando para cadastro_administrador.php.", 'INFO');
                    header("Location: cadastro_administrador.php");
                    exit();
                } else {
                    $erro_cadastro = "Erro ao cadastrar o administrador no banco de dados.";
                    writeLog("Falha ao executar INSERT para novo administrador. Resultado: " . print_r($stmt_insert->errorInfo(), true), 'ERROR');
                }
            }
        } catch (PDOException $e) {
            $erro_cadastro = "Erro no sistema ao tentar cadastrar. Tente novamente mais tarde.";
            writeLog('Erro PDO no cadastro de administrador: ' . $e->getMessage(), 'CRITICAL');
        }
    }
}

// Se houver erro, redirecionar de volta ao formulário com a mensagem
if (!empty($erro_cadastro)) {
    $_SESSION['mensagem_erro'] = $erro_cadastro;
    $_SESSION['form_data_adm_cadastro'] = ['nome' => $nome, 'login' => $login];
    writeLog("Mensagem de erro definida. Redirecionando para cadastro_administrador.php.", 'INFO');
    header("Location: cadastro_administrador.php");
    exit();
}