<?php
/**
 * registrar_candidatura.php - VERSÃO FINAL PADRONIZADA E CORRIGIDA
 */

if (session_status() === PHP_SESSION_NONE) { session_start(); }

// 1. DEFINIÇÃO DE CAMINHOS BASE
if (!defined('BASE_PATH')) {
    define('BASE_PATH', realpath(__DIR__ . '/')); 
}

// 2. CARREGAMENTO DE DEPENDÊNCIAS
require_once BASE_PATH . '/PHPMailer-master/src/Exception.php';
require_once BASE_PATH . '/PHPMailer-master/src/PHPMailer.php';
require_once BASE_PATH . '/PHPMailer-master/src/SMTP.php';
require_once BASE_PATH . '/conexao.php';
require_once BASE_PATH . '/env.php';

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception as PHPMailerException;
use PHPMailer\PHPMailer\SMTP;

/**
 * Função para registrar logs de erro
 */
function writeLog($message, $logLevel = 'INFO') {
    $logDir = BASE_PATH . '/temp_logs';
    if (!is_dir($logDir)) { @mkdir($logDir, 0777, true); }
    @file_put_contents($logDir . '/registro_candidatura_log.log', date('[d-M-Y H:i:s]') . " --- [$logLevel] --- $message\n", FILE_APPEND);
}

/**
 * CONFIGURAÇÃO DO MAILER
 * Utiliza as chaves exatas do seu arquivo env.php e referência logou.php
 */
function configurarMailerCandidatura() {
    $mail = new PHPMailer(true);
    try {
        $mail->isSMTP();
        $mail->Host       = $_ENV['SMTP_HOST'] ?? '';
        $mail->SMTPAuth   = filter_var(($_ENV['SMTP_AUTH'] ?? true), FILTER_VALIDATE_BOOLEAN);
        $mail->Username   = $_ENV['SMTP_USERNAME'] ?? ''; 
        $mail->Password   = $_ENV['SMTP_PASSWORD'] ?? ''; 
        
        $smtp_secure_env  = strtolower($_ENV['SMTP_SECURE'] ?? 'ssl');
        $mail->SMTPSecure = ($smtp_secure_env === 'tls') ? PHPMailer::ENCRYPTION_STARTTLS : PHPMailer::ENCRYPTION_SMTPS;
        
        $mail->Port       = (int)($_ENV['SMTP_PORT'] ?? 465);
        $mail->CharSet    = 'UTF-8';
        
        // Define o remetente (From) - Crucial para não dar erro de "Invalid Address"
        $fromEmail        = $_ENV['SMTP_FROM_EMAIL'] ?? $_ENV['SMTP_USERNAME'] ?? '';
        $fromName         = $_ENV['SMTP_FROM_NAME'] ?? "Selflix Vagas";
        
        $mail->setFrom($fromEmail, $fromName);
        $mail->SMTPDebug  = SMTP::DEBUG_OFF; 
        
        return $mail;
    } catch (PHPMailerException $e) {
        writeLog("Erro na configuração do Mailer: " . $e->getMessage(), 'ERROR');
        return null;
    }
}

/**
 * BUSCA E PROCESSA O TEMPLATE DO BANCO DE DADOS
 */
function processarTemplateCandidatura($pdo, $slug, $dados) {
    $stmt = $pdo->prepare("SELECT assunto, corpo FROM EmailTemplates WHERE slug = :slug");
    $stmt->execute([':slug' => $slug]);
    $template = $stmt->fetch(PDO::FETCH_ASSOC);

    if (!$template) {
        writeLog("Template não encontrado no banco para o slug: $slug", 'WARNING');
        return null;
    }

    $assunto = $template['assunto'];
    $corpo = $template['corpo'];

    foreach ($dados as $chave => $valor) {
        $placeholder = "{{" . $chave . "}}";
        $assunto = str_replace($placeholder, $valor ?? '', $assunto);
        $corpo = str_replace($placeholder, $valor ?? '', $corpo);
    }
    return ['assunto' => $assunto, 'corpo' => $corpo];
}

// --- LÓGICA PRINCIPAL ---

$id_vaga = filter_input(INPUT_POST, 'id_vaga', FILTER_VALIDATE_INT);
$tipo_vaga = filter_input(INPUT_POST, 'tipo_anuncio_vaga', FILTER_SANITIZE_SPECIAL_CHARS);

try {
    if (!isset($_SESSION['id'])) { 
        header("Location: login.php"); 
        exit(); 
    }
    $id_candidato = (int)$_SESSION['id'];

    if (!$id_vaga) {
        throw new Exception("ID da vaga inválido ou não fornecido.");
    }

    $pdo->beginTransaction();
    
    // 1. Registra a candidatura no banco
    $sql = "INSERT INTO candidaturas (candidato_id, vaga_id, tipo_anuncio, data_candidatura, status_leitura) 
            VALUES (?, ?, ?, NOW(), 'nao_lido')";
    $pdo->prepare($sql)->execute([$id_candidato, $id_vaga, $tipo_vaga]);

    // 2. Busca dados para preencher os templates (Nome do candidato, título da vaga, email da empresa)
    $tabela = ($tipo_vaga === 'pago') ? 'anuncio_pago' : 'anuncio_gratuito';
    $stInfo = $pdo->prepare("
        SELECT c.nome as n_cand, c.email as e_cand, v.titulo_vaga, e.nome_empresa, e.email as e_emp 
        FROM Candidatos c 
        JOIN $tabela v ON v.id = ?
        LEFT JOIN Empresas e ON v.id_empresa = e.id 
        WHERE c.id = ? 
        LIMIT 1
    ");
    $stInfo->execute([$id_vaga, $id_candidato]);
    $dados_db = $stInfo->fetch(PDO::FETCH_ASSOC);

    if ($dados_db) {
        $mapeamento = [
            'nome_candidato'      => $dados_db['n_cand'],
            'titulo_vaga'         => $dados_db['titulo_vaga'],
            'nome_empresa'        => $dados_db['nome_empresa'] ?? 'Empresa Parceira',
            'email_candidato'     => $dados_db['e_cand'],
            'link_painel_empresa' => ($_ENV['SITE_URL'] ?? '') . '/painel-empresa.php',
            'site_url'            => $_ENV['SITE_URL'] ?? ''
        ];

        // ENVIO A: Para o Candidato (Slug: confirmacao_candidatura)
        $email_cand = processarTemplateCandidatura($pdo, 'confirmacao_candidatura', $mapeamento);
        if ($email_cand) {
            $mail = configurarMailerCandidatura();
            if ($mail) {
                try {
                    $mail->addAddress($dados_db['e_cand'], $dados_db['n_cand']);
                    $mail->Subject = $email_cand['assunto'];
                    $mail->Body    = $email_cand['corpo'];
                    $mail->isHTML(true);
                    $mail->send();
                } catch (Exception $e) {
                    writeLog("Erro ao enviar para candidato: " . $mail->ErrorInfo, 'ERROR');
                }
            }
        }

        // ENVIO B: Para a Empresa (Slug: notificacao_vaga_novo_candidato)
        if (!empty($dados_db['e_emp'])) {
            $email_emp = processarTemplateCandidatura($pdo, 'notificacao_vaga_novo_candidato', $mapeamento);
            if ($email_emp) {
                $mail = configurarMailerCandidatura();
                if ($mail) {
                    try {
                        $mail->addAddress($dados_db['e_emp'], $dados_db['nome_empresa']);
                        $mail->Subject = $email_emp['assunto'];
                        $mail->Body    = $email_emp['corpo'];
                        $mail->isHTML(true);
                        $mail->send();
                    } catch (Exception $e) {
                        writeLog("Erro ao enviar para empresa: " . $mail->ErrorInfo, 'ERROR');
                    }
                }
            }
        }
    }

    $pdo->commit();
    $_SESSION['mensagem_candidatura'] = "Candidatura enviada com sucesso!";
    header("Location: painel-de-gestao-candidato.php"); 
    exit();

} catch (Exception $e) {
    if (isset($pdo) && $pdo->inTransaction()) $pdo->rollBack();
    writeLog("Erro no processo de candidatura: " . $e->getMessage(), 'ERROR');
    $_SESSION['mensagem_candidatura_erro'] = "Erro ao processar candidatura.";
    header("Location: painel-de-gestao-candidato.php"); 
    exit();
}