<?php
/* ============================================================
   إدارة المستخدمين — للمسؤول المسجَّل فقط

   GET  api/users.php                    →  قائمة المستخدمين
   POST api/users.php  {action:"create"} →  إضافة مستخدم
   POST api/users.php  {action:"toggle"} →  تفعيل / إيقاف
   POST api/users.php  {action:"reset"}  →  تعيين كلمة مرور جديدة
   POST api/users.php  {action:"delete"} →  حذف مستخدم
   ============================================================ */

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

exp_start_session($CONFIG);
$me = exp_require_login();
$db = exp_db($CONFIG);

/* ---------- القائمة ---------- */
if (($_SERVER['REQUEST_METHOD'] ?? 'GET') === 'GET') {
  $rows = $db->query(
    "SELECT id, username, display, is_active, last_login, created_at
       FROM exp_users ORDER BY id"
  )->fetchAll();

  exp_json(['ok' => true, 'me' => $me['id'], 'users' => array_map(fn($r) => [
    'id'        => (int)$r['id'],
    'username'  => $r['username'],
    'display'   => $r['display'],
    'active'    => (int)$r['is_active'] === 1,
    'lastLogin' => $r['last_login'],
    'createdAt' => $r['created_at'],
  ], $rows)]);
}

/* ---------- العمليات ---------- */
exp_require_post();
exp_check_origin();
exp_check_csrf();

$b      = exp_body();
$action = exp_str($b['action'] ?? '', 20);

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

/* ---------- إضافة ---------- */
if ($action === 'create') {
  $u = mb_strtolower(exp_str($b['username'] ?? '', 64));
  $n = exp_str($b['display'] ?? '', 120);
  $p = (string)($b['password'] ?? '');

  if (!preg_match('/^[a-z0-9._-]{3,64}$/', $u)) {
    exp_fail('اسم المستخدم: حروف لاتينية وأرقام، 3 أحرف فأكثر');
  }
  exp_check_password($p);

  $st = $db->prepare("SELECT COUNT(*) c FROM exp_users WHERE username = ?");
  $st->execute([$u]);
  if ((int)$st->fetch()['c'] > 0) exp_fail('اسم المستخدم مستخدم مسبقًا', 409);

  $st = $db->prepare("INSERT INTO exp_users (username, display, pass_hash) VALUES (?,?,?)");
  $st->execute([$u, $n !== '' ? $n : $u, password_hash($p, PASSWORD_DEFAULT)]);

  exp_audit($db, $me, 'user_create', $u);
  exp_json(['ok' => true, 'id' => (int)$db->lastInsertId()]);
}

/* العمليات التالية تحتاج معرّف مستخدم */
$id = (int)($b['id'] ?? 0);
if ($id <= 0) exp_fail('حدّد المستخدم');

$st = $db->prepare("SELECT id, username, is_active FROM exp_users WHERE id = ? LIMIT 1");
$st->execute([$id]);
$target = $st->fetch();
if (!$target) exp_fail('المستخدم غير موجود', 404);

/* عدد المسؤولين المفعّلين — لا نسمح بإفراغ النظام */
function exp_active_count(PDO $db): int {
  return (int)$db->query("SELECT COUNT(*) c FROM exp_users WHERE is_active = 1")->fetch()['c'];
}

/* ---------- تفعيل / إيقاف ---------- */
if ($action === 'toggle') {
  if ($id === $me['id']) exp_fail('لا يمكنك إيقاف حسابك أنت');
  $now = (int)$target['is_active'] === 1;
  if ($now && exp_active_count($db) <= 1) exp_fail('لا يمكن إيقاف آخر مسؤول مفعّل');

  $db->prepare("UPDATE exp_users SET is_active = ? WHERE id = ?")
     ->execute([$now ? 0 : 1, $id]);
  exp_audit($db, $me, 'user_toggle', $target['username'] . ($now ? ' → موقوف' : ' → مفعّل'));
  exp_json(['ok' => true, 'active' => !$now]);
}

/* ---------- تعيين كلمة مرور ---------- */
if ($action === 'reset') {
  $p = (string)($b['password'] ?? '');
  exp_check_password($p);
  $db->prepare("UPDATE exp_users SET pass_hash = ? WHERE id = ?")
     ->execute([password_hash($p, PASSWORD_DEFAULT), $id]);
  exp_audit($db, $me, 'user_reset', $target['username']);
  exp_json(['ok' => true]);
}

/* ---------- حذف ---------- */
if ($action === 'delete') {
  if ($id === $me['id']) exp_fail('لا يمكنك حذف حسابك أنت');
  if ((int)$target['is_active'] === 1 && exp_active_count($db) <= 1) {
    exp_fail('لا يمكن حذف آخر مسؤول مفعّل');
  }
  $db->prepare("DELETE FROM exp_users WHERE id = ?")->execute([$id]);
  exp_audit($db, $me, 'user_delete', $target['username']);
  exp_json(['ok' => true]);
}

exp_fail('إجراء غير معروف');
