<?php
/* ============================================================
   POST api/upload.php  →  رفع صورة مرشح
   تُحفظ كملف في uploads/ ولا تُخزَّن داخل قاعدة البيانات
   ============================================================ */

declare(strict_types=1);
require __DIR__ . '/bootstrap.php';
require __DIR__ . '/helpers.php';
require __DIR__ . '/schema.php';

exp_start_session($CONFIG);
exp_require_post();
exp_check_origin();
$user = exp_require_login();
exp_check_csrf();

if (empty($_FILES['photo'])) exp_fail('لم تصل أي صورة');
$f = $_FILES['photo'];

if (($f['error'] ?? UPLOAD_ERR_NO_FILE) !== UPLOAD_ERR_OK) {
  $msg = ((int)$f['error'] === UPLOAD_ERR_INI_SIZE || (int)$f['error'] === UPLOAD_ERR_FORM_SIZE)
    ? 'حجم الصورة أكبر من المسموح' : 'فشل رفع الصورة';
  exp_fail($msg);
}

$maxBytes = (int)($CONFIG['security']['max_upload_mb'] ?? 8) * 1024 * 1024;
if ((int)$f['size'] > $maxBytes) exp_fail('حجم الصورة أكبر من المسموح');
if (!is_uploaded_file($f['tmp_name'])) exp_fail('ملف غير صالح');

/* التحقق من أن الملف صورة فعلًا — لا نثق بالامتداد ولا بنوع المتصفح */
$info = @getimagesize($f['tmp_name']);
if ($info === false) exp_fail('الملف ليس صورة صالحة');

$allowed = [
  IMAGETYPE_JPEG => 'jpg',
  IMAGETYPE_PNG  => 'png',
  IMAGETYPE_WEBP => 'webp',
  IMAGETYPE_GIF  => 'gif',
];
$type = (int)($info[2] ?? 0);
if (!isset($allowed[$type])) exp_fail('صيغة الصورة غير مدعومة — استخدم JPG أو PNG');

if ((int)$info[0] < 32 || (int)$info[1] < 32) exp_fail('أبعاد الصورة صغيرة جدًا');
if ((int)$info[0] > 8000 || (int)$info[1] > 8000) exp_fail('أبعاد الصورة كبيرة جدًا');

$dir = dirname(__DIR__) . '/uploads';
if (!is_dir($dir) && !@mkdir($dir, 0755, true)) exp_fail('تعذّر تجهيز مجلد الصور', 500);
if (!is_writable($dir)) exp_fail('مجلد uploads غير قابل للكتابة — اضبط الصلاحية على 755', 500);

/* اسم عشوائي بامتداد نستنتجه نحن — لا من اسم الملف الأصلي */
$name = bin2hex(random_bytes(16)) . '.' . $allowed[$type];
$dest = $dir . '/' . $name;

if (!move_uploaded_file($f['tmp_name'], $dest)) exp_fail('تعذّر حفظ الصورة', 500);
@chmod($dest, 0644);

try { exp_audit(exp_db($CONFIG), $user, 'upload', $name); } catch (Throwable $e) {}

exp_json(['ok' => true, 'url' => 'uploads/' . $name]);
