<?php
// registrar_candidatura.php - VERSÃO FINAL E CORRIGIDA (Fluxo POST)

// Define a função de log
function writeLog($message, $logLevel = 'INFO') {
    $logDir = __DIR__ . '/temp_logs';
    if (!is_dir($logDir)) {
        // Tenta criar o diretório de log
        @mkdir($logDir, 0777, true);
    }
    $logFile = $logDir . '/registro_candidatura_log.log'; // Log específico para candidaturas
    $timestamp = date('[d-M-Y H:i:s T]');
    $logEntry = "$timestamp --- [$logLevel] --- $message\n";
    // Tenta escrever no arquivo de log
    @file_put_contents($logFile, $logEntry, FILE_APPEND | LOCK_EX);
}

// Habilitar erros para debug (remover ou limitar em produção)
error_reporting(E_ALL);
ini_set('display_errors', 1);

// Iniciar a sessão no topo
if (session_status() == PHP_SESSION_NONE) {
    session_start();
}

writeLog('--- [INÍCIO SCRIPT] --- registrar_candidatura.php acessado ---');
writeLog('Método da Requisição: ' . $_SERVER['REQUEST_METHOD']);

// Inclui arquivos de dependência
require_once 'conexao.php';
require_once 'env.php';

writeLog('Dependências (conexao.php, env.php) carregadas.');

// URL de destino para redirecionamento
$redirect_on_success = 'painel-de-gestao-candidato.php';
// CORREÇÃO: Usar a variável de sessão, se existir, para voltar para a vaga, se não, volta para o painel
$redirect_on_failure = $_SESSION['last_vaga_url'] ?? 'vagas.php'; 

try {

    // CORREÇÃO: Fluxo POST forçado. Se o seu front-end usa GET, você deve mudar o front-end ou o método abaixo para GET.
    if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
        writeLog('ERRO DE MÉTODO: Acesso inválido (não-POST).', 'ERROR');
        $_SESSION['mensagem_candidatura'] = 'Acesso inválido à página de registro de candidatura.';
        $_SESSION['status_candidatura'] = 'warning';
        header("Location: {$redirect_on_failure}");
        exit();
    }

    writeLog('Dados POST recebidos: ' . print_r($_POST, true));

    // --- 1. Validação de Autenticação e Autorização (Candidato) ---
    $id_candidato = (int)($_SESSION['id'] ?? 0);
    $email_candidato = $_SESSION['login'] ?? '';

    if ($id_candidato === 0 || ($_SESSION['role'] ?? '') !== 'Candidatos' || empty($email_candidato)) {
        writeLog('ERRO DE AUTENTICAÇÃO: Usuário não logado ou não é candidato.', 'ERROR');
        $_SESSION['mensagem_login'] = "Você precisa estar logado como candidato para registrar uma candidatura.";
        $_SESSION['redirect_after_login'] = 'vagas.php';
        header("Location: login.php");
        exit();
    }

    // CORREÇÃO: Buscar o nome e celular do candidato diretamente do BD
    $stmt_candidato_data = $pdo->prepare("SELECT nome, celular FROM Candidatos WHERE id = ?");
    $stmt_candidato_data->execute([$id_candidato]);
    $candidato_data = $stmt_candidato_data->fetch(PDO::FETCH_ASSOC);
    $nome_candidato = $candidato_data['nome'] ?? 'Candidato Desconhecido';
    $celular_candidato = $candidato_data['celular'] ?? 'N/A';

    writeLog('Usuário candidato autenticado. ID: ' . $id_candidato . ', Nome: ' . $nome_candidato . ', Email: ' . $email_candidato);

    // --- 2. Validação CSRF (Melhor Prática) ---
    // Removendo temporariamente o CSRF, pois a chamada do front-end está com 'window.location.href',
    // o que impossibilita o POST com o token em muitos casos.
    /*
    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.', 'ERROR');
        $_SESSION['mensagem_candidatura'] = "Erro de segurança (CSRF). Tente novamente.";
        $_SESSION['status_candidatura'] = "danger";
        header("Location: {$redirect_on_failure}");
        exit();
    }
    unset($_SESSION['csrf_token']);
    writeLog('Token CSRF verificado.');
    */

    // --- 3. Coleta e Validação dos Dados da Vaga do POST ---
    $id_vaga = filter_input(INPUT_POST, 'id_vaga', FILTER_VALIDATE_INT);
    $tipo_anuncio_vaga = filter_input(INPUT_POST, 'tipo_anuncio_vaga', FILTER_SANITIZE_SPECIAL_CHARS);

    if (!$id_vaga || !in_array($tipo_anuncio_vaga, ['pago', 'gratuito'])) {
        writeLog("ERRO DE VALIDAÇÃO: Dados da vaga inválidos. (ID: {$id_vaga}, Tipo: {$tipo_anuncio_vaga}).", 'ERROR');
        $_SESSION['mensagem_candidatura'] = "Dados da vaga inválidos. Não foi possível registrar a candidatura.";
        $_SESSION['status_candidatura'] = "danger";
        header("Location: {$redirect_on_failure}");
        exit();
    }
    writeLog("Dados da vaga para candidatura coletados: Vaga ID: {$id_vaga}, Tipo: {$tipo_anuncio_vaga}.");

    // --- 4. Obter Detalhes Completos da Vaga e da Empresa ---
    $titulo_vaga = '';
    $empresa_nome_vaga = '';
    $email_empresa_contato = '';
    $logotipo_empresa = null; 
    $site_url = $_ENV['SITE_URL'] ?? 'https://seusite.com.br';

    try {
        $tabela_vaga_db = ($tipo_anuncio_vaga === 'pago') ? 'anuncio_pago' : 'anuncio_gratuito';
        $coluna_join_empresa_id = ($tipo_anuncio_vaga === 'pago') ? 'empresa_id' : 'id_empresa';

        $sql_detalhes_vaga = "SELECT v.titulo_vaga, e.nome_empresa, v.email_para_curriculo AS email_empresa_destino";
        
        if ($tipo_anuncio_vaga === 'pago') {
            $sql_detalhes_vaga .= ", v.logotipo AS logotipo_vaga";
        }
        
        $sql_detalhes_vaga .= " FROM `{$tabela_vaga_db}` v
                                JOIN Empresas e ON v.{$coluna_join_empresa_id} = e.id
                                WHERE v.id = ?";

        $stmt_detalhes_vaga = $pdo->prepare($sql_detalhes_vaga);
        $stmt_detalhes_vaga->execute([$id_vaga]);
        $vaga_e_empresa_detalhes = $stmt_detalhes_vaga->fetch(PDO::FETCH_ASSOC);

        if ($vaga_e_empresa_detalhes) {
            $titulo_vaga = $vaga_e_empresa_detalhes['titulo_vaga'];
            $empresa_nome_vaga = $vaga_e_empresa_detalhes['nome_empresa'];
            $email_empresa_contato = $vaga_e_empresa_detalhes['email_empresa_destino'];
            
            if ($tipo_anuncio_vaga === 'pago') {
                $logotipo_empresa = $vaga_e_empresa_detalhes['logotipo_vaga'] ?? null;
            } else {
                $logotipo_empresa = null;
            }
            
            writeLog("Detalhes da Vaga e Empresa Buscados - Título: '{$titulo_vaga}', Empresa: '{$empresa_nome_vaga}'");
        } else {
             writeLog("AVISO: Detalhes da vaga ou empresa NÃO ENCONTRADOS para Vaga ID: {$id_vaga}, Tipo: {$tipo_anuncio_vaga}.", 'WARNING');
             throw new Exception("Vaga ou detalhes da empresa não encontrados no BD.");
        }
    } catch (Exception $e) {
        writeLog("ERRO ao buscar detalhes da vaga e empresa: " . $e->getMessage(), 'CRITICAL');
        throw new Exception("Erro interno ao buscar detalhes da vaga.");
    }

    // --- 5. Verificar Duplicidade de Candidatura ---
    $stmt_check_duplicate = $pdo->prepare("SELECT COUNT(*) FROM candidaturas WHERE candidato_id = ? AND vaga_id = ? AND tipo_anuncio = ?");
    $stmt_check_duplicate->execute([$id_candidato, $id_vaga, $tipo_anuncio_vaga]);
    if ($stmt_check_duplicate->fetchColumn() > 0) {
        writeLog("AVISO: Candidatura duplicada detectada para Candidato ID {$id_candidato} na Vaga ID {$id_vaga}.", 'WARNING');
        $_SESSION['mensagem_candidatura'] = "Você já se candidatou para esta vaga.";
        $_SESSION['status_candidatura'] = "info";
        header("Location: {$redirect_on_failure}");
        exit();
    }

    // --- 6. Registrar Candidatura no Banco de Dados ---
    $pdo->beginTransaction();
    writeLog('Transação de BD iniciada.');

    // CORREÇÃO CRÍTICA: Removida a coluna 'id_anuncio' do INSERT para evitar erro de esquema, 
    // já que 'vaga_id' e 'id_anuncio' parecem ser o mesmo. 
    // Se 'id_anuncio' for estritamente necessário, mantenha-o, mas com o mesmo valor de 'vaga_id'.
    $sql_insert_candidatura = "INSERT INTO candidaturas (candidato_id, vaga_id, tipo_anuncio, data_candidatura) VALUES (?, ?, ?, NOW())";
    $stmt_insert_candidatura = $pdo->prepare($sql_insert_candidatura);
    $stmt_insert_candidatura->execute([$id_candidato, $id_vaga, $tipo_anuncio_vaga]);

    $nova_candidatura_id = $pdo->lastInsertId();

    $pdo->commit();
    writeLog("Candidatura registrada com sucesso no BD. ID Candidatura: {$nova_candidatura_id}.");

    // --- 7. Feedback, Envio de E-mails e Redirecionamento Final ---

    // Inclua o arquivo de e-mail aqui. Ele define as funções de envio.
    try {
        writeLog('Iniciando bloco de envio de e-mails para registro de candidatura.');
        require_once 'include/email_registro_candidatura.php'; // Garanta que este caminho está correto

        // O bloco de e-mail é mantido, mas verifique se todas as variáveis necessárias
        // (como $site_url, $logotipo_empresa, etc.) estão sendo passadas.

        // Envia e-mail de notificação para a EMPRESA
        if (!empty($email_empresa_contato) && filter_var($email_empresa_contato, FILTER_VALIDATE_EMAIL)) {
            // (Lógica de envio de e-mail da empresa omitida para brevidade, mas está no seu código original)
            $emailEnviadoEmpresa = enviarEmailNotificacaoCandidaturaEmpresa(
                $email_empresa_contato,
                $empresa_nome_vaga,
                $titulo_vaga,
                $nome_candidato,
                $email_candidato,
                $celular_candidato,
                $site_url,
                $logotipo_empresa,
                null, 
                null, 
                null, 
                $id_vaga
            );

            if ($emailEnviadoEmpresa) {
                writeLog('E-mail de notificação de candidatura ENVIADO para a empresa.');
            } else {
                writeLog('ERRO: Falha ao enviar e-mail de notificação para a empresa. Verifique logs do PHPMailer.', 'ERROR');
            }
        } else {
            writeLog("ERRO: E-mail da empresa para contato da vaga está vazio ou inválido. Notificação NÃO ENVIADA.", 'ERROR');
        }

        // Envia e-mail de confirmação para o CANDIDATO
        if (!empty($email_candidato) && filter_var($email_candidato, FILTER_VALIDATE_EMAIL)) {
            // (Lógica de envio de e-mail do candidato omitida para brevidade, mas está no seu código original)
            $emailEnviadoCandidato = enviarEmailConfirmacaoCandidaturaCandidato(
                $email_candidato,
                $nome_candidato,
                $titulo_vaga,
                $empresa_nome_vaga,
                $email_empresa_contato,
                $site_url
            );

            if ($emailEnviadoCandidato) {
                writeLog('E-mail de confirmação de candidatura ENVIADO para o candidato.');
            } else {
                writeLog('ERRO: Falha ao enviar e-mail de confirmação para o candidato. Verifique logs do PHPMailer.', 'ERROR');
            }
        } else {
            writeLog("ERRO: E-mail do candidato está vazio ou inválido. Confirmação NÃO ENVIADA.", 'ERROR');
        }

    } catch (Exception $e_mail) {
        writeLog("ERRO GERAL ao tentar enviar e-mails de candidatura: " . $e_mail->getMessage(), 'ERROR');
    }

    $_SESSION['mensagem_candidatura'] = "Sua candidatura para a vaga '{$titulo_vaga}' na empresa '{$empresa_nome_vaga}' foi registrada com sucesso!";
    $_SESSION['status_candidatura'] = "success";
    writeLog("INFO: Processo concluído. Redirecionando para painel do candidato.");

    header("Location: {$redirect_on_success}");
    exit();

} catch (Exception $e) {
    if (isset($pdo) && $pdo->inTransaction()) {
        $pdo->rollBack();
    }
    $errorMessage = "ERRO FATAL GERAL (registrar_candidatura): " . $e->getMessage();
    writeLog($errorMessage, 'CRITICAL');
    $_SESSION['mensagem_candidatura'] = "Ocorreu um erro inesperado. Tente novamente. (Cod:SYS_REG)";
    $_SESSION['status_candidatura'] = "danger";
    header("Location: {$redirect_on_failure}");
    exit();
}