<?php
require_once __DIR__ . '/src/auth.php';
require_once __DIR__ . '/src/db.php';
require_once __DIR__ . '/src/nextcloud.php';
require_once __DIR__ . '/src/contract_file_helper.php';

// Forçar limpeza de cache do navegador para evitar erros antigos
header("Cache-Control: no-cache, no-store, must-revalidate");
header("Pragma: no-cache");
header("Expires: 0");

// Iniciar sessão se não estiver iniciada
if (session_status() === PHP_SESSION_NONE) {
    session_start();
}

// LOG DE DEBUG (Somente para admin)
if (isset($_SESSION['role']) && $_SESSION['role'] === 'admin' && isset($_GET['debug'])) {
    echo "DEBUG INFO:<br>";
    echo "User ID: " . ($_SESSION['user_id'] ?? 'NULL') . "<br>";
    echo "Username: " . ($_SESSION['username'] ?? 'NULL') . "<br>";
    echo "NC Pass: " . (isset($_SESSION['nc_pass']) ? 'SET' : 'NULL') . "<br>";
    exit;
}

$file_path = $_GET['path'] ?? '';
$token = $_GET['token'] ?? '';
$uid = $_GET['uid'] ?? '';
$utoken = $_GET['utoken'] ?? '';

if (empty($file_path)) {
    die("Arquivo não especificado.");
}

cfh_get_backup_dir();
$backup_local_path = cfh_get_backup_absolute_path($file_path, basename($file_path));

// Se existir um arquivo no cache com o mesmo hash do caminho (mesmo que o nome salvo seja diferente), usar como fallback
if (!file_exists($backup_local_path)) {
    $normalized = trim(str_replace('\\', '/', (string)$file_path), '/');
    $cacheDir = dirname(__DIR__) . '/uploads/contracts_cache';
    $pattern = rtrim($cacheDir, "\\/") . '/' . md5($normalized) . '_*';
    $matches = glob($pattern);
    if (is_array($matches) && !empty($matches) && file_exists($matches[0])) {
        $backup_local_path = $matches[0];
    }
}

// Se houver cache local, permitir visualizar sem depender do Nextcloud (usuário logado)
if (isset($_SESSION['user_id']) && file_exists($backup_local_path)) {
    $fileName = basename($file_path);
    $ext = strtolower(pathinfo($fileName, PATHINFO_EXTENSION));
    $mime = 'application/octet-stream';
    if ($ext === 'pdf') $mime = 'application/pdf';
    if ($ext === 'png') $mime = 'image/png';
    if ($ext === 'jpg' || $ext === 'jpeg') $mime = 'image/jpeg';
    if ($ext === 'gif') $mime = 'image/gif';
    if ($ext === 'webp') $mime = 'image/webp';

    header('Content-Type: ' . $mime);
    header('Content-Disposition: inline; filename="' . $fileName . '"');
    header('Content-Length: ' . filesize($backup_local_path));
    readfile($backup_local_path);
    exit;
}

// Se houver um token, validar se ele tem acesso a este arquivo
$can_access = false;
$username = $_SESSION['username'] ?? '';
$password = $_SESSION['nc_pass'] ?? '';

// 1. Prioridade Máxima: Sessão Ativa (Se o administrador estiver logado na mesma sessão)
if (isset($_SESSION['user_id']) && !empty($_SESSION['nc_pass'])) {
    $can_access = true;
    $username = $_SESSION['username'];
    $password = $_SESSION['nc_pass'];
}

// 1.1 Fallback: usuário logado, mas sem nc_pass na sessão (tentar credencial do sistema)
if (!$can_access && isset($_SESSION['user_id'])) {
    try {
        $pdo = get_db_connection();
        $stmt = $pdo->query("SELECT setting_key, setting_value FROM system_settings WHERE setting_key IN ('nc_webdav_user', 'nc_webdav_pass')");
        $rows = $stmt->fetchAll(PDO::FETCH_KEY_PAIR);
        $sysUser = trim((string)($rows['nc_webdav_user'] ?? ''));
        $sysPass = (string)($rows['nc_webdav_pass'] ?? '');
        if ($sysUser !== '' && $sysPass !== '') {
            $can_access = true;
            $username = $sysUser;
            $password = $sysPass;
        }
    } catch (Throwable $e) {
    }
}

// 2. Segundo Nível: Token de Signatário (Acesso Público para Clientes)
if (!$can_access && !empty($token)) {
    try {
        $pdo = get_db_connection();
        // Verificar se o token existe e é válido
        $stmt_token = $pdo->prepare("SELECT contract_id FROM contract_signatures WHERE token = ? LIMIT 1");
        $stmt_token->execute([$token]);
        if ($stmt_token->fetch()) {
            // Token válido! Agora precisamos de QUALQUER credencial de admin para baixar o arquivo
            $stmt_admin = $pdo->query("SELECT username, nc_pass FROM users WHERE role = 'admin' AND nc_pass IS NOT NULL LIMIT 1");
            $admin_data = $stmt_admin->fetch();
            
            if ($admin_data) {
                $can_access = true;
                $username = $admin_data['username'];
                $password = $admin_data['nc_pass'];
            }
        }
    } catch (PDOException $e) {}
}

// 3. Terceiro Nível: Token de Administrador (Bypass de Sessão em Produção)
if (!$can_access && !empty($uid) && !empty($utoken)) {
    try {
        $pdo = get_db_connection();
        $stmt = $pdo->prepare("SELECT username, nc_pass FROM users WHERE id = ? AND temp_token = ? AND token_expires > NOW()");
        $stmt->execute([$uid, $utoken]);
        $admin_data = $stmt->fetch();
        
        if ($admin_data && !empty($admin_data['nc_pass'])) {
            $can_access = true;
            $username = $admin_data['username'];
            $password = $admin_data['nc_pass'];
        }
    } catch (PDOException $e) {}
}

if (!$can_access) {
    header('Content-Type: text/plain');
    $msg = "Acesso negado.\n\n";
    if (!empty($token)) {
        $msg .= "Motivo: O sistema não encontrou uma 'chave' de administrador ativa para liberar este documento para o público.\n\n";
        $msg .= "COMO RESOLVER:\n";
        $msg .= "1. O administrador do sistema deve fazer LOGOUT e LOGIN novamente no painel.\n";
        $msg .= "2. Isso ativará a chave de acesso necessária para que os clientes visualizem os contratos.";
    } else {
        $msg .= "Por favor, faça login no sistema para visualizar este documento.";
    }
    die($msg);
}

// Se o caminho começar com uploads/, talvez ainda existam arquivos antigos no disco local
if (strpos($file_path, 'uploads/') === 0) {
    $full_local_path = __DIR__ . '/' . $file_path;
    if (file_exists($full_local_path)) {
        $ext = strtolower(pathinfo($full_local_path, PATHINFO_EXTENSION));
        $mime = 'application/octet-stream';
        if ($ext === 'pdf') $mime = 'application/pdf';
        if ($ext === 'png') $mime = 'image/png';
        if ($ext === 'jpg' || $ext === 'jpeg') $mime = 'image/jpeg';
        if ($ext === 'gif') $mime = 'image/gif';
        if ($ext === 'webp') $mime = 'image/webp';
        header('Content-Type: ' . $mime);
        header('Content-Disposition: inline; filename="' . basename($file_path) . '"');
        header('Content-Length: ' . filesize($full_local_path));
        readfile($full_local_path);
        exit;
    }
}

// Caso contrário, buscar do Nextcloud via WebDAV
try {
    $nc = new Nextcloud();
    $fileName = basename($file_path);

    // Definir cabeçalhos para o navegador
    $ext = strtolower(pathinfo($fileName, PATHINFO_EXTENSION));
    $mime = 'application/octet-stream';
    if ($ext === 'pdf') $mime = 'application/pdf';
    if ($ext === 'png') $mime = 'image/png';
    if ($ext === 'jpg' || $ext === 'jpeg') $mime = 'image/jpeg';
    if ($ext === 'gif') $mime = 'image/gif';
    if ($ext === 'webp') $mime = 'image/webp';
    header('Content-Type: ' . $mime);
    header('Content-Disposition: inline; filename="' . $fileName . '"');
    
    // Transmitir diretamente do Nextcloud
    $remotePath = ltrim($file_path, '/');
    
    // Codificar partes do caminho para WebDAV (evita erro com espaços e caracteres especiais)
    $pathParts = explode('/', $remotePath);
    $encodedPath = implode('/', array_map('rawurlencode', $pathParts));
    
    $url = rtrim(NC_WEBDAV_URL, '/') . '/' . rawurlencode($username) . '/' . $encodedPath;

    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_USERPWD, $username . ":" . $password);
    curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, false); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_TIMEOUT, 60); // Aumentar timeout para arquivos grandes em produção
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // Primeiro capturamos para tentar salvar localmente
    
    if (ob_get_level()) ob_end_clean();
    
    $result = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    $error = curl_error($ch);
    curl_close($ch);

    if ($httpCode === 200 && !empty($result)) {
        @file_put_contents($backup_local_path, $result);

        // Tentar salvar uma cópia local se for via token público para facilitar próximos acessos
        if (!empty($token)) {
            $temp_dir = __DIR__ . '/temp_view/';
            if (!is_dir($temp_dir)) @mkdir($temp_dir, 0777, true);
            $temp_filename = md5($file_path . $token) . '.pdf';
            @file_put_contents($temp_dir . $temp_filename, $result);
        }
        
        // Transmitir o conteúdo capturado para o navegador
        echo $result;
        exit;
    }

    if ($httpCode !== 200) {
        if (file_exists($backup_local_path)) {
            header('Content-Length: ' . filesize($backup_local_path));
            readfile($backup_local_path);
            exit;
        }

        header_remove('Content-Type');
        header_remove('Content-Disposition');
        die("Erro ao acessar o arquivo no Nextcloud (HTTP $httpCode). " . ($error ? "Detalhes: $error" : "O arquivo pode ter sido movido ou excluído."));
    }
    exit;
} catch (Exception $e) {
    if (file_exists($backup_local_path)) {
        header('Content-Type: application/pdf');
        header('Content-Disposition: inline; filename="' . basename($file_path) . '"');
        header('Content-Length: ' . filesize($backup_local_path));
        readfile($backup_local_path);
        exit;
    }

    die("Erro: " . $e->getMessage());
}
