<?php
// view_case_file.php (FIXED: resolves paths inside /HLG-Justice-Hub/uploads/* reliably)
declare(strict_types=1);
session_start();

require_once __DIR__ . '/db.php';

if (empty($_SESSION['user_id'])) {
  header("Location: index.html?e=1");
  exit;
}

$pdo = function_exists('db') ? db() : null;
if (!$pdo instanceof PDO) {
  http_response_code(500);
  exit('DB not ready');
}
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$fileId = (int)($_GET['id'] ?? 0);
if ($fileId <= 0) { http_response_code(400); exit('Missing id'); }

/* جلب الملف */
$st = $pdo->prepare("
  SELECT cf.id, cf.case_id, cf.file_name, cf.file_path, cf.file_type, cf.file_size,
         c.branch_id
  FROM case_files cf
  JOIN cases c ON c.id = cf.case_id
  WHERE cf.id = ?
  LIMIT 1
");
$st->execute([$fileId]);
$f = $st->fetch(PDO::FETCH_ASSOC);
if (!$f) { http_response_code(404); exit('File not found'); }

/* صلاحيات بسيطة */
$sessionBranch = (int)($_SESSION['branch_id'] ?? 0);
$fileBranch    = (int)($f['branch_id'] ?? 0);
$role          = strtoupper((string)($_SESSION['role'] ?? 'STAFF'));
if (!in_array($role, ['ADMIN','OWNER'], true)) {
  if ($sessionBranch && $fileBranch && $sessionBranch !== $fileBranch) {
    http_response_code(403);
    exit('Forbidden');
  }
}

/* مسارات المشروع */
$projectDir = realpath(__DIR__);                 // .../public_html/HLG-Justice-Hub
$uploadsDir = realpath(__DIR__ . '/uploads');    // .../public_html/HLG-Justice-Hub/uploads

if (!$projectDir || !$uploadsDir) {
  http_response_code(500);
  exit('Project/Uploads dir not found');
}

/* المسار المخزن */
$raw = (string)($f['file_path'] ?? '');
$raw = trim(str_replace('\\', '/', $raw));
if ($raw === '') { http_response_code(404); exit('Missing path'); }

/* إذا كان رابط كامل، استخرج منه الجزء بعد /uploads/ */
if (preg_match('~^https?://~i', $raw)) {
  $uPath = (string)(parse_url($raw, PHP_URL_PATH) ?? '');
  $uPath = str_replace('\\','/',$uPath);
  $pos = stripos($uPath, '/uploads/');
  if ($pos !== false) {
    $raw = ltrim(substr($uPath, $pos + 1), '/'); // uploads/...
  } else {
    // لو الرابط ما فيه uploads، خليه كما هو وسنحاول لاحقاً
    $raw = ltrim($uPath, '/');
  }
}

/* نظّف مقدمات شائعة */
$rawNoSlash = ltrim($raw, '/'); // remove leading /
$rawNoSlash = preg_replace('~^\./+~', '', $rawNoSlash);

/* إذا المخزن فيه HLG-Justice-Hub/uploads/... احذف HLG-Justice-Hub/ */
$rawNoSlash = preg_replace('~^HLG-Justice-Hub/+~i', '', $rawNoSlash);

/* حضّر قائمة محاولات */
$candidates = [];

/* 1) إذا كان داخل uploads مباشرة */
$candidates[] = $projectDir . '/' . $rawNoSlash;

/* 2) لو المخزن بدأ بـ uploads/... فهذا ممتاز */
if (stripos($rawNoSlash, 'uploads/') === 0) {
  $candidates[] = $projectDir . '/' . $rawNoSlash; // نفس (1) لكن نتركها
}

/* 3) لو المخزن بدأ بـ uploads/cases/... */
if (stripos($rawNoSlash, 'uploads/cases/') === 0) {
  $candidates[] = $projectDir . '/' . $rawNoSlash;
}

/* 4) لو المخزن كان cases/... فقط */
if (stripos($rawNoSlash, 'cases/') === 0) {
  $candidates[] = $uploadsDir . '/' . $rawNoSlash;
}

/* 5) لو المخزن كان uploads فقط بدون المشروع */
if (stripos($rawNoSlash, 'uploads/') !== 0 && stripos($rawNoSlash, 'cases/') !== 0) {
  // جرب أنه ملف داخل uploads/cases/
  $candidates[] = $uploadsDir . '/cases/' . basename($rawNoSlash);
}

/* ابحث عن أول ملف موجود */
$real = null;
foreach ($candidates as $c) {
  $rp = realpath($c);
  if ($rp && is_file($rp)) { $real = $rp; break; }
}

if (!$real) {
  http_response_code(404);
  // رسالة واضحة تساعدك تعرف أين الخلل
  echo "File missing on disk\n";
  echo "db.file_path: " . $raw . "\n";
  echo "tried:\n";
  foreach ($candidates as $c) echo "- " . $c . "\n";
  exit;
}

/* حماية: لازم الملف داخل uploads داخل المشروع */
if (strpos($real, $uploadsDir) !== 0) {
  http_response_code(403);
  exit('Blocked path');
}

/* MIME */
$mime = (string)($f['file_type'] ?? '');
if ($mime === '' && function_exists('mime_content_type')) {
  $mime = (string)@mime_content_type($real);
}
if ($mime === '') $mime = 'application/octet-stream';

$filename = (string)($f['file_name'] ?? 'file');
$filename = preg_replace('/[\r\n"]/','', $filename);

header('Content-Type: ' . $mime);
header('Content-Length: ' . (string)filesize($real));
header('X-Content-Type-Options: nosniff');
header('Content-Disposition: inline; filename="' . $filename . '"');

readfile($real);
exit;