<?php
/* ============================================================
   POST api/login.php   →  تسجيل الدخول
   كلمات المرور مخزّنة بـ bcrypt · إيقاف تلقائي بعد المحاولات
   ============================================================ */

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();

$b    = exp_body();
$user = exp_str($b['user'] ?? '', 64);
$pass = (string)($b['pass'] ?? '');

if ($user === '' || $pass === '') exp_fail('اكتب اسم المستخدم وكلمة المرور');

$db = exp_db($CONFIG);

/* هل هذا الجهاز موقوف؟ */
$blocked = exp_login_blocked($db, $CONFIG);
if ($blocked > 0) {
  exp_fail("محاولات كثيرة — أعد المحاولة بعد {$blocked} دقيقة", 429);
}

$st = $db->prepare("SELECT * FROM exp_users WHERE username = ? AND is_active = 1 LIMIT 1");
$st->execute([mb_strtolower($user)]);
$row = $st->fetch();

/* التحقق يستغرق نفس الزمن سواء وُجد المستخدم أو لا — يمنع استكشاف الأسماء */
$hash = $row['pass_hash'] ?? '$2y$12$invalidinvalidinvalidinvalidinvalidinvalidinvalidinvalidiu';
$valid = password_verify($pass, $hash) && $row !== false;

if (!$valid) {
  exp_log_attempt($db, $user, false);
  usleep(400000);
  exp_fail('اسم المستخدم أو كلمة المرور غير صحيحة', 401);
}

/* ترقية التشفير تلقائيًا لو تغيّرت إعدادات الخادم */
if (password_needs_rehash($hash, PASSWORD_DEFAULT)) {
  $up = $db->prepare("UPDATE exp_users SET pass_hash = ? WHERE id = ?");
  $up->execute([password_hash($pass, PASSWORD_DEFAULT), (int)$row['id']]);
}

/* جلسة جديدة تمامًا — يمنع تثبيت الجلسة */
session_regenerate_id(true);
$_SESSION['uid']       = (int)$row['id'];
$_SESSION['uname']     = (string)$row['username'];
$_SESSION['dname']     = (string)$row['display'];
$_SESSION['last_seen'] = time();
unset($_SESSION['csrf']);

$db->prepare("UPDATE exp_users SET last_login = NOW() WHERE id = ?")->execute([(int)$row['id']]);
exp_log_attempt($db, $user, true);
exp_audit($db, exp_user(), 'login', 'دخول ناجح');

exp_json([
  'ok'   => true,
  'user' => ['user' => $row['username'], 'name' => $row['display']],
  'csrf' => exp_csrf_token(),
]);
