<?php
/* ============================================================
   GET  api/session.php   →  حالة الجلسة + رمز الحماية
   POST api/session.php   →  تغيير كلمة المرور  {action:"password"}
   ============================================================ */

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

exp_start_session($CONFIG);

/* ---------- حالة الجلسة ---------- */
if (($_SERVER['REQUEST_METHOD'] ?? 'GET') === 'GET') {
  $u = exp_user();
  exp_json([
    'ok'     => true,
    'authed' => (bool)$u,
    'user'   => $u ? ['user' => $u['user'], 'name' => $u['name']] : null,
    'csrf'   => $u ? exp_csrf_token() : null,
    'expiresInMinutes' => (int)($CONFIG['security']['session_minutes'] ?? 480),
  ]);
}

/* ---------- تغيير كلمة المرور ---------- */
exp_require_post();
exp_check_origin();
$user = exp_require_login();
exp_check_csrf();

$b = exp_body();
if (($b['action'] ?? '') !== 'password') exp_fail('إجراء غير معروف');

$cur = (string)($b['current'] ?? '');
$new = (string)($b['new'] ?? '');

if (mb_strlen($new) < 8) exp_fail('كلمة المرور الجديدة قصيرة — 8 أحرف على الأقل');
if (mb_strlen($new) > 200) exp_fail('كلمة المرور طويلة جدًا');
if (!preg_match('/[A-Za-z]/', $new) || !preg_match('/[0-9]/', $new)) {
  exp_fail('يجب أن تحتوي كلمة المرور على حروف وأرقام');
}
if ($cur === $new) exp_fail('كلمة المرور الجديدة مطابقة للحالية');

$db = exp_db($CONFIG);
$st = $db->prepare("SELECT pass_hash FROM exp_users WHERE id = ? LIMIT 1");
$st->execute([$user['id']]);
$row = $st->fetch();

if (!$row || !password_verify($cur, (string)$row['pass_hash'])) {
  exp_audit($db, $user, 'password_fail', 'كلمة المرور الحالية غير صحيحة');
  exp_fail('كلمة المرور الحالية غير صحيحة', 401);
}

$up = $db->prepare("UPDATE exp_users SET pass_hash = ? WHERE id = ?");
$up->execute([password_hash($new, PASSWORD_DEFAULT), $user['id']]);

/* جلسة جديدة بعد تغيير كلمة المرور */
session_regenerate_id(true);
unset($_SESSION['csrf']);
exp_audit($db, $user, 'password_change', 'تم تغيير كلمة المرور');

exp_json(['ok' => true, 'csrf' => exp_csrf_token()]);
