<?php
/* ============================================================
   منصة خبرة — التنصيب والفحص
   افتح هذه الصفحة مرة واحدة بعد رفع الملفات
   ============================================================ */

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

exp_start_session($CONFIG);

$locked = empty($CONFIG['allow_install']);
$done = [];
$errs = [];
$notice = '';

/* ---------- الفحوصات ---------- */
$checks = [];
$checks[] = ['إصدار PHP (8.0 أو أحدث)', version_compare(PHP_VERSION, '8.0', '>='), PHP_VERSION];
$checks[] = ['إضافة PDO MySQL', extension_loaded('pdo_mysql'), extension_loaded('pdo_mysql') ? 'موجودة' : 'مفقودة'];
$checks[] = ['إضافة mbstring', extension_loaded('mbstring'), extension_loaded('mbstring') ? 'موجودة' : 'مفقودة'];
$checks[] = ['اتصال آمن HTTPS', exp_is_https(), exp_is_https() ? 'مفعّل' : 'غير مفعّل'];

$uploadDir = dirname(__DIR__) . '/uploads';
if (!is_dir($uploadDir)) @mkdir($uploadDir, 0755, true);
$checks[] = ['مجلد uploads قابل للكتابة', is_dir($uploadDir) && is_writable($uploadDir),
             is_dir($uploadDir) ? (is_writable($uploadDir) ? 'جاهز' : 'غير قابل للكتابة') : 'غير موجود'];

$keyOk = strlen((string)($CONFIG['security']['app_key'] ?? '')) >= 32
         && strpos((string)$CONFIG['security']['app_key'], 'ghyّr-hadha') === false;
$checks[] = ['المفتاح السرّي مُغيَّر', $keyOk, $keyOk ? 'جيد' : 'ما زال الافتراضي'];

$dbOk = false; $dbMsg = '';
try {
  $db = exp_db($CONFIG);
  $db->query("SELECT 1");
  $dbOk = true; $dbMsg = 'ناجح';
} catch (Throwable $e) { $dbMsg = 'فشل'; }
$checks[] = ['الاتصال بقاعدة البيانات', $dbOk, $dbMsg];

$tablesOk = false;
if ($dbOk) {
  try {
    $db->query("SELECT 1 FROM exp_users LIMIT 1");
    $tablesOk = true;
  } catch (Throwable $e) { $tablesOk = false; }
}
$checks[] = ['الجداول منشأة', $tablesOk, $tablesOk ? 'نعم' : 'لم تُنشأ بعد'];

$hasAdmin = false;
if ($tablesOk) {
  try { $hasAdmin = (int)$db->query("SELECT COUNT(*) c FROM exp_users")->fetch()['c'] > 0; }
  catch (Throwable $e) {}
}
$checks[] = ['يوجد حساب مسؤول', $hasAdmin, $hasAdmin ? 'نعم' : 'لا'];

/* ---------- تنفيذ التنصيب ---------- */
if (!$locked && ($_SERVER['REQUEST_METHOD'] ?? '') === 'POST' && $dbOk) {
  $u  = exp_str($_POST['user'] ?? '', 64);
  $n  = exp_str($_POST['name'] ?? 'مدير المنصة', 120);
  $p  = (string)($_POST['pass'] ?? '');
  $p2 = (string)($_POST['pass2'] ?? '');
  $seed = !empty($_POST['seed']);

  if ($u === '' || !preg_match('/^[a-z0-9._-]{3,64}$/i', $u)) {
    $errs[] = 'اسم المستخدم يجب أن يكون حروفًا لاتينية وأرقامًا (3 أحرف فأكثر)';
  }
  if (mb_strlen($p) < 8) $errs[] = 'كلمة المرور يجب أن تكون 8 أحرف فأكثر';
  if (!preg_match('/[A-Za-z]/', $p) || !preg_match('/[0-9]/', $p)) {
    $errs[] = 'كلمة المرور يجب أن تحتوي حروفًا وأرقامًا';
  }
  if ($p !== $p2) $errs[] = 'كلمتا المرور غير متطابقتين';

  if (!$errs) {
    try {
      exp_install_schema($db);
      $done[] = 'أُنشئت الجداول';

      $st = $db->prepare("INSERT INTO exp_users (username, display, pass_hash)
                          VALUES (?,?,?)
                          ON DUPLICATE KEY UPDATE display=VALUES(display), pass_hash=VALUES(pass_hash)");
      $st->execute([mb_strtolower($u), $n, password_hash($p, PASSWORD_DEFAULT)]);
      $done[] = 'جُهّز حساب المسؤول «' . $u . '»';   // التهريب يتم عند الإخراج

      if ($seed) {
        $cnt = (int)$db->query("SELECT COUNT(*) c FROM exp_competitions")->fetch()['c'];
        if ($cnt === 0) {
          $seedFile = dirname(__DIR__) . '/data.js';
          $raw = @file_get_contents($seedFile);
          if ($raw !== false && preg_match('/window\.EXP_DATA\s*=\s*(\{.*\});?\s*$/s', $raw, $m)) {
            $json = json_decode($m[1], true);
            if (is_array($json)) {
              exp_save_platform($db, $json);
              $done[] = 'نُقلت البيانات الابتدائية من data.js';
            } else {
              $errs[] = 'تعذّر تحليل data.js — أنشئ المسابقات يدويًا';
            }
          } else {
            $errs[] = 'لم يُعثر على data.js — أنشئ المسابقات يدويًا';
          }
        } else {
          $done[] = 'توجد بيانات مسبقًا — لم تُستبدل';
        }
      }

      $notice = 'اكتمل التنصيب. الآن افتح api/config.php وغيّر allow_install إلى false';
      $tablesOk = true; $hasAdmin = true;
    } catch (Throwable $e) {
      error_log('install: ' . $e->getMessage());
      $errs[] = 'فشل التنصيب: ' . $e->getMessage();   // التهريب يتم عند الإخراج
    }
  }
}

$allOk = $dbOk && $tablesOk && $hasAdmin;
?><!doctype html>
<html lang="ar" dir="rtl">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="robots" content="noindex, nofollow">
<title>تنصيب منصة خبرة</title>
<link rel="stylesheet" href="../brand.css">
<style>
body{background:var(--c-cream);color:var(--c-text);padding:2rem 1.25rem}
.wrap{max-width:44rem;margin:0 auto}
.card{background:#fff;border:1px solid var(--c-line);border-radius:1.5rem;padding:1.8rem;
  margin-bottom:1.1rem;box-shadow:var(--shadow-card)}
h1{margin:0 0 .3rem;font-size:1.6rem;color:var(--c-deep)}
.sub{margin:0 0 1.6rem;color:var(--c-text-soft);font-size:.95rem}
h2{margin:0 0 1rem;font-size:1.1rem;color:var(--c-deep)}
table{width:100%;border-collapse:collapse}
td{padding:.6rem .2rem;border-bottom:1px solid var(--c-soft);font-size:.95rem}
tr:last-child td{border-bottom:0}
td.s{width:2rem;font-size:1.05rem}
td.v{text-align:end;color:var(--c-text-soft);font-size:.9rem;white-space:nowrap}
.ok{color:var(--c-green)} .no{color:#D9534F}
label{display:block;font-size:.88rem;font-weight:700;color:var(--c-text-soft);margin:.9rem 0 .35rem}
input{width:100%;font-family:var(--font-body);font-size:1rem;padding:.7rem .9rem;border-radius:.85rem;
  border:1px solid var(--c-line);background:var(--c-cream);outline:none}
input:focus{border-color:var(--c-bright);background:#fff;box-shadow:0 0 0 3px rgba(0,170,164,.12)}
.chk{display:flex;align-items:center;gap:.6rem;margin:1rem 0;font-size:.95rem}
.chk input{width:1.15rem;height:1.15rem;accent-color:var(--c-bright)}
.msg{padding:.9rem 1.1rem;border-radius:1rem;margin-bottom:1rem;font-size:.95rem;line-height:1.7}
.msg.good{background:rgba(87,188,89,.1);border:1px solid rgba(87,188,89,.35);color:#2C7A38}
.msg.bad{background:rgba(217,83,79,.09);border:1px solid rgba(217,83,79,.32);color:#A33};
.msg.warn{background:rgba(240,180,41,.1);border:1px solid rgba(240,180,41,.35);color:#8A6B22}
ul{margin:.4rem 0 0;padding-inline-start:1.2rem}
li{margin-bottom:.25rem}
</style>
</head>
<body>
<div class="wrap">

  <div class="card">
    <h1>تنصيب منصة خبرة</h1>
    <p class="sub">فحص الخادم وتجهيز قاعدة البيانات وحساب المسؤول.</p>

    <?php if ($notice): ?><div class="msg good"><b>✔</b> <?= htmlspecialchars($notice) ?></div><?php endif; ?>
    <?php if ($done): ?>
      <div class="msg good"><b>تم:</b><ul><?php foreach ($done as $d) echo '<li>' . htmlspecialchars($d) . '</li>'; ?></ul></div>
    <?php endif; ?>
    <?php if ($errs): ?>
      <div class="msg bad"><b>مشاكل:</b><ul><?php foreach ($errs as $e) echo '<li>' . htmlspecialchars($e) . '</li>'; ?></ul></div>
    <?php endif; ?>

    <h2>فحص الخادم</h2>
    <table>
      <?php foreach ($checks as [$label, $pass, $val]): ?>
      <tr>
        <td class="s <?= $pass ? 'ok' : 'no' ?>"><?= $pass ? '✔' : '✘' ?></td>
        <td><?= htmlspecialchars($label) ?></td>
        <td class="v"><?= htmlspecialchars((string)$val) ?></td>
      </tr>
      <?php endforeach; ?>
    </table>
  </div>

  <?php if ($locked): ?>
    <div class="card">
      <div class="msg warn">
        التنصيب مقفل. لإعادة تشغيله افتح <code>api/config.php</code> واجعل
        <code>allow_install</code> يساوي <code>true</code>.
      </div>
      <?php if ($allOk): ?>
        <a class="btn btn-primary" href="../login.html">الذهاب لتسجيل الدخول</a>
      <?php endif; ?>
    </div>

  <?php elseif (!$dbOk): ?>
    <div class="card">
      <div class="msg bad">
        صحّح بيانات الاتصال في <code>api/config.php</code> ثم حدّث هذه الصفحة.<br>
        أنشئ قاعدة البيانات والمستخدم من <b>cPanel ← MySQL® Databases</b>،
        واربطهما بصلاحية <b>ALL PRIVILEGES</b>.
      </div>
    </div>

  <?php else: ?>
    <div class="card">
      <h2>حساب المسؤول</h2>
      <form method="post" autocomplete="off">
        <label>اسم المستخدم (حروف لاتينية وأرقام)</label>
        <input name="user" required pattern="[A-Za-z0-9._-]{3,64}"
               value="<?= htmlspecialchars((string)($_POST['user'] ?? 'admin')) ?>">

        <label>الاسم المعروض</label>
        <input name="name" value="<?= htmlspecialchars((string)($_POST['name'] ?? 'مدير المنصة')) ?>">

        <label>كلمة المرور (8 أحرف فأكثر، حروف وأرقام)</label>
        <input name="pass" type="password" required minlength="8" value="P@ssw0rd">

        <label>تأكيد كلمة المرور</label>
        <input name="pass2" type="password" required minlength="8" value="P@ssw0rd">

        <label class="chk">
          <input type="checkbox" name="seed" value="1" <?= $hasAdmin ? '' : 'checked' ?>>
          نقل البيانات الابتدائية من ملف data.js
        </label>

        <button class="btn btn-primary" type="submit" style="width:100%;margin-top:.6rem">
          تنفيذ التنصيب
        </button>
      </form>
    </div>

    <?php if ($allOk): ?>
    <div class="card">
      <div class="msg warn">
        <b>خطوة أخيرة مهمة:</b> افتح <code>api/config.php</code> واجعل
        <code>'allow_install' => false</code> حتى لا يستطيع أحد إعادة التنصيب.
      </div>
      <a class="btn btn-primary" href="../login.html">الذهاب لتسجيل الدخول</a>
    </div>
    <?php endif; ?>
  <?php endif; ?>

</div>
</body>
</html>
