<?php
/**
 * Selflix Vagas - Processamento de Candidatura
 * Regra: Máximo 30 candidatos para vagas gratuitas.
 */

// 1. Configurações de Erro (Desativar em produção)
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

// 2. Iniciar Sessão
if (session_status() === PHP_SESSION_NONE) {
    session_start();
}

require_once 'conexao.php';
require_once 'env.php';

/**
 * Função Auxiliar para Redirecionamento com Mensagem
 */
function finalizarProcesso($mensagem, $status, $url = "painel-de-gestao-candidato.php") {
    $_SESSION['mensagem_candidatura'] = $mensagem;
    $_SESSION['status_candidatura'] = $status;
    header("Location: $url");
    exit();
}

// 3. Verificação de Autenticação (Obrigatório Logar)
if (!isset($_SESSION['id'])) {
    // Salva a URL atual para retornar após o login, caso seu login.php suporte redirect_url
    $_SESSION['redirect_url_after_login'] = $_SERVER['REQUEST_URI']; 
    header("Location: login.php?erro=" . urlencode("Você precisa estar logado como candidato para se inscrever."));
    exit();
}

// 4. Verificação de Permissão (Apenas Candidatos)
if (($_SESSION['role'] ?? '') !== 'Candidatos') {
    finalizarProcesso("Acesso negado. Apenas candidatos podem se inscrever em vagas.", "danger", "login.php");
}

// 5. Captura e Validação do ID da Vaga
$vaga_id = filter_input(INPUT_POST, 'vaga_id', FILTER_VALIDATE_INT) ?: filter_input(INPUT_GET, 'vaga_id', FILTER_VALIDATE_INT);
$candidato_id = $_SESSION['id'];

if (!$vaga_id) {
    finalizarProcesso("ID da vaga inválido ou não fornecido.", "danger");
}

if (!$pdo) {
    error_log("Falha de conexão PDO em candidatar_vaga.php");
    finalizarProcesso("Erro interno: Falha na conexão com o banco de dados.", "danger");
}

try {
    // 6. Determinar o tipo de anúncio (Pago ou Gratuito)
    $sqlTipoAnuncio = "SELECT 'pago' as tipo_anuncio_vaga FROM anuncio_pago WHERE id = :vaga_id
                       UNION ALL
                       SELECT 'gratuito' as tipo_anuncio_vaga FROM anuncio_gratuito WHERE id = :vaga_id";
    
    $stmtTipo = $pdo->prepare($sqlTipoAnuncio);
    $stmtTipo->execute([':vaga_id' => $vaga_id]);
    $infoAnuncio = $stmtTipo->fetch(PDO::FETCH_ASSOC);

    if (!$infoAnuncio) {
        finalizarProcesso("Erro: Vaga não encontrada ou não está mais ativa.", "danger");
    }

    $tipo_anuncio_db = $infoAnuncio['tipo_anuncio_vaga'];

    // -------------------------------------------------------------------------
    // 7. REGRA DE NEGÓCIO: LIMITE DE 30 PARA VAGAS GRATUITAS
    // -------------------------------------------------------------------------
    if ($tipo_anuncio_db === 'gratuito') {
        $sqlContagem = "SELECT COUNT(*) FROM candidaturas WHERE vaga_id = :vaga_id AND tipo_anuncio = 'gratuito'";
        $stmtContagem = $pdo->prepare($sqlContagem);
        $stmtContagem->execute([':vaga_id' => $vaga_id]);
        
        if ($stmtContagem->fetchColumn() >= 30) {
            finalizarProcesso("Esta vaga gratuita já atingiu o limite máximo de 30 candidatos.", "warning");
        }
    }
    // -------------------------------------------------------------------------

    // 8. Verificar Duplicidade (Já se candidatou?)
    $sqlVerificar = "SELECT 1 FROM candidaturas 
                     WHERE candidato_id = :candidato_id 
                     AND vaga_id = :vaga_id 
                     AND tipo_anuncio = :tipo_anuncio";
    
    $stmtVerificar = $pdo->prepare($sqlVerificar);
    $stmtVerificar->execute([
        ':candidato_id' => $candidato_id,
        ':vaga_id'      => $vaga_id,
        ':tipo_anuncio' => $tipo_anuncio_db
    ]);

    if ($stmtVerificar->fetch()) {
        finalizarProcesso("Você já se candidatou para esta vaga anteriormente.", "info");
    }

    // 9. Registrar Candidatura
    $sqlInsert = "INSERT INTO candidaturas (candidato_id, vaga_id, data_candidatura, tipo_anuncio, status_leitura) 
                  VALUES (:candidato_id, :vaga_id, NOW(), :tipo_anuncio, 'nao_lido')";
    
    $stmtInsert = $pdo->prepare($sqlInsert);
    $stmtInsert->execute([
        ':candidato_id' => $candidato_id,
        ':vaga_id'      => $vaga_id,
        ':tipo_anuncio' => $tipo_anuncio_db
    ]);

    finalizarProcesso("Candidatura realizada com sucesso! Boa sorte.", "success");

} catch (PDOException $e) {
    error_log("Erro PDO em candidatar_vaga.php: " . $e->getMessage());
    finalizarProcesso("Erro ao processar sua candidatura. Tente novamente mais tarde.", "danger");
}