<?php
// Arquivo: download-curriculo.php (na pasta raiz)

// --- INCLUSÃO E CONFIGURAÇÃO ---

// Ajuste os requires conforme a localização real dos seus arquivos
require_once 'conexao.php'; 

// Inicia sessão apenas se não existir
if (session_status() == PHP_SESSION_NONE) {
    session_start();
}

// 1. VERIFICAÇÃO DE AUTORIZAÇÃO (Empresa Logada)
if (!isset($_SESSION['id']) || ($_SESSION['role'] ?? '') !== 'Empresas') {
    http_response_code(403); 
    die("Acesso negado. Por favor, faça login como empresa.");
}

// 2. DESCRIPTOGRAFA O TOKEN (ID do Candidato)
// Verifica se o token existe na URL
$token_raw = filter_input(INPUT_GET, 'token', FILTER_SANITIZE_STRING);

if (!$token_raw) {
    http_response_code(400);
    die("Token de download ausente.");
}

// Decodifica (CORREÇÃO: variável agora tem o nome certo)
$candidato_id = base64_decode($token_raw, true);

// Valida se o resultado é um número inteiro válido
if ($candidato_id === false || !filter_var($candidato_id, FILTER_VALIDATE_INT)) {
    http_response_code(400);
    // Log para você saber se alguém está tentando burlar
    error_log("Tentativa de acesso com token inválido: " . $token_raw);
    die("Token inválido ou corrompido.");
}

$empresa_id_sessao = $_SESSION['id'];

try {
    // 3. BUSCA O CAMINHO REAL E VERIFICA PERMISSÃO
    // Verifica se existe conexão
    if (!isset($pdo)) {
        throw new Exception("Conexão com banco de dados não estabelecida.");
    }

    $sql = "
        SELECT 
            cc.caminho_arquivo
        FROM Candidatos AS c
        INNER JOIN CandidatoCurriculos AS cc ON c.id = cc.candidato_id
        WHERE c.id = :candidato_id
        ORDER BY cc.id DESC LIMIT 1
    ";

    $stmt = $pdo->prepare($sql);
    $stmt->bindValue(':candidato_id', $candidato_id, PDO::PARAM_INT);
    $stmt->execute();
    $resultado = $stmt->fetch(PDO::FETCH_ASSOC);

    if (!$resultado || empty($resultado['caminho_arquivo'])) {
        http_response_code(404);
        die("Arquivo não encontrado no banco de dados.");
    }

    $caminho_completo_db = $resultado['caminho_arquivo'];

    // 4. PREPARA O CAMINHO FÍSICO DO ARQUIVO
    
    // Obtém apenas o caminho do arquivo (ignora http://dominio.com se houver)
    $path_parts = parse_url($caminho_completo_db);
    $caminho_relativo = $path_parts['path'] ?? $caminho_completo_db;

    // Constrói o caminho físico absoluto no servidor
    // O uso de realpath ajuda a resolver problemas de ../ ou barras duplicadas
    $document_root = $_SERVER['DOCUMENT_ROOT'];
    
    // Tenta montar o caminho. Se o caminho no BD começar com /, remove para evitar duplicidade com o root
    $caminho_fisico = $document_root . '/' . ltrim($caminho_relativo, '/');
    
    // Fallback: Se o arquivo não existir assim, tenta usar o caminho direto (caso seja um caminho absoluto do servidor)
    if (!file_exists($caminho_fisico) && file_exists($caminho_completo_db)) {
        $caminho_fisico = $caminho_completo_db;
    }

    // 5. VERIFICA A EXISTÊNCIA E FORÇA O DOWNLOAD
    if (!file_exists($caminho_fisico)) {
        http_response_code(404);
        error_log("ERRO DOWNLOAD: Arquivo físico não encontrado em: " . $caminho_fisico);
        die("O arquivo físico não foi encontrado no servidor. Contate o suporte.");
    }

    // Detecta a extensão para enviar o Content-Type correto (PDF, DOCX, etc)
    $extensao = strtolower(pathinfo($caminho_fisico, PATHINFO_EXTENSION));
    $mime_type = 'application/octet-stream'; // Padrão genérico

    switch ($extensao) {
        case 'pdf': $mime_type = 'application/pdf'; break;
        case 'doc': $mime_type = 'application/msword'; break;
        case 'docx': $mime_type = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'; break;
        case 'jpg': case 'jpeg': $mime_type = 'image/jpeg'; break;
        case 'png': $mime_type = 'image/png'; break;
    }

    // Headers para forçar o download
    header('Content-Description: File Transfer');
    header('Content-Type: ' . $mime_type);
    header('Content-Disposition: attachment; filename="' . basename($caminho_fisico) . '"');
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($caminho_fisico));
    
    // Limpa buffer de saída para evitar corromper o arquivo
    ob_clean();
    flush();
    
    readfile($caminho_fisico);
    exit;

} catch (PDOException $e) {
    error_log("Erro de DB no download: " . $e->getMessage());
    http_response_code(500);
    die("Erro interno ao processar a solicitação.");
} catch (Exception $e) {
    error_log("Erro geral no download: " . $e->getMessage());
    http_response_code(500);
    die("Erro inesperado.");
}
?>