<?php
/**
 * MediBook AI — معالج التنصيب (Installation Wizard)
 * ارفع المشروع، افتح هذه الصفحة من المتصفح، عبّئ البيانات، اضغط تثبيت.
 * يحذف نفسه تلقائياً بعد نجاح التنصيب.
 */

error_reporting(E_ALL & ~E_DEPRECATED & ~E_NOTICE);
@set_time_limit(300);

define('BASE', dirname(__DIR__));
$lockFile = BASE . '/storage/installed.lock';

// لو سبق التثبيت، امنع التشغيل مرة أخرى.
if (file_exists($lockFile)) {
    http_response_code(403);
    exit('تم التثبيت مسبقاً. للأمان، احذف ملف install.php من السيرفر. (Already installed — please delete install.php)');
}

$step = $_GET['step'] ?? 'requirements';
$errors = [];
$done = [];

/* ---------- أدوات مساعدة ---------- */
function h($s) { return htmlspecialchars((string)$s, ENT_QUOTES, 'UTF-8'); }

function writeEnv(array $values): bool
{
    $path = BASE . '/.env';
    if (! file_exists($path)) {
        if (file_exists(BASE . '/.env.example')) {
            copy(BASE . '/.env.example', $path);
        } else {
            file_put_contents($path, "");
        }
    }
    $env = file_get_contents($path);
    foreach ($values as $key => $val) {
        // اقتبس القيمة لو فيها مسافات
        if (preg_match('/\s/', $val) && $val[0] !== '"') {
            $val = '"' . $val . '"';
        }
        if (preg_match('/^' . preg_quote($key, '/') . '=.*$/m', $env)) {
            $env = preg_replace('/^' . preg_quote($key, '/') . '=.*$/m', $key . '=' . $val, $env);
        } else {
            $env .= "\n" . $key . '=' . $val;
        }
    }
    return file_put_contents($path, $env) !== false;
}

/* ---------- معالجة الإرسال ---------- */
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $db_host = trim($_POST['db_host'] ?? 'localhost');
    $db_port = trim($_POST['db_port'] ?? '3306');
    $db_name = trim($_POST['db_name'] ?? '');
    $db_user = trim($_POST['db_user'] ?? '');
    $db_pass = $_POST['db_pass'] ?? '';
    $app_url = rtrim(trim($_POST['app_url'] ?? ''), '/');
    $admin_name = trim($_POST['admin_name'] ?? '');
    $admin_email = trim($_POST['admin_email'] ?? '');
    $admin_pass = $_POST['admin_pass'] ?? '';

    // تحقق مبدئي
    if ($db_name === '' || $db_user === '') $errors[] = 'اسم قاعدة البيانات واسم المستخدم مطلوبان.';
    if ($app_url === '') $errors[] = 'رابط الموقع مطلوب.';
    if ($admin_name === '' || $admin_email === '' || strlen($admin_pass) < 8) {
        $errors[] = 'بيانات حساب المدير مطلوبة وكلمة السر ٨ أحرف على الأقل.';
    }

    // جرّب الاتصال بقاعدة البيانات
    $pdo = null;
    if (! $errors) {
        try {
            $pdo = new PDO("mysql:host=$db_host;port=$db_port;dbname=$db_name;charset=utf8mb4",
                $db_user, $db_pass, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);
        } catch (Throwable $e) {
            $errors[] = 'فشل الاتصال بقاعدة البيانات: ' . $e->getMessage();
        }
    }

    if (! $errors) {
        // النطاق المركزي = الدومين بدون البروتوكول
        $central = preg_replace('#^https?://#', '', $app_url);

        // ١) اكتب .env
        writeEnv([
            'APP_ENV' => 'production',
            'APP_DEBUG' => 'false',
            'APP_URL' => $app_url,
            'MEDIBOOK_CENTRAL_DOMAIN' => $central,
            'DB_CONNECTION' => 'mysql',
            'DB_HOST' => $db_host,
            'DB_PORT' => $db_port,
            'DB_DATABASE' => $db_name,
            'DB_USERNAME' => $db_user,
            'DB_PASSWORD' => $db_pass,
            'SESSION_DRIVER' => 'database',
            'QUEUE_CONNECTION' => 'database',
            'CACHE_STORE' => 'database',
        ]);
        $done[] = 'تم إنشاء ملف الإعدادات (.env).';

        // ٢) حمّل لارافيل
        require BASE . '/vendor/autoload.php';
        $app = require BASE . '/bootstrap/app.php';
        $kernel = $app->make(Illuminate\Contracts\Console\Kernel::class);
        $kernel->bootstrap();

        // ٣) ولّد مفتاح التطبيق إن لم يكن موجوداً
        if (empty(env('APP_KEY'))) {
            $key = 'base64:' . base64_encode(random_bytes(32));
            writeEnv(['APP_KEY' => $key]);
            $done[] = 'تم توليد مفتاح التطبيق.';
        }

        // ٤) شغّل الهجرات (إنشاء الجداول)
        try {
            Illuminate\Support\Facades\Artisan::call('migrate', ['--force' => true]);
            $done[] = 'تم إنشاء جداول قاعدة البيانات.';
        } catch (Throwable $e) {
            $errors[] = 'فشل إنشاء الجداول: ' . $e->getMessage();
        }

        // ٥) أدخل الأدوار والباقة
        if (! $errors) {
            try {
                Illuminate\Support\Facades\Artisan::call('db:seed', ['--class' => 'RoleSeeder', '--force' => true]);
                Illuminate\Support\Facades\Artisan::call('db:seed', ['--class' => 'PlanSeeder', '--force' => true]);
                $done[] = 'تم إدخال الأدوار والباقة الأساسية.';
            } catch (Throwable $e) {
                $errors[] = 'فشل إدخال البيانات الأولية: ' . $e->getMessage();
            }
        }

        // ٦) أنشئ حساب المدير العام (super_admin)
        if (! $errors) {
            try {
                $exists = App\Models\User::withoutGlobalScope('tenant')
                    ->where('email', $admin_email)->first();
                if (! $exists) {
                    $user = App\Models\User::withoutEvents(function () use ($admin_name, $admin_email, $admin_pass) {
                        return App\Models\User::create([
                            'tenant_id' => null,
                            'name' => $admin_name,
                            'email' => $admin_email,
                            'password' => Illuminate\Support\Facades\Hash::make($admin_pass),
                            'locale' => 'ar',
                            'email_verified_at' => now(),
                        ]);
                    });
                    $user->assignRole('super_admin');
                    $done[] = 'تم إنشاء حساب المدير العام.';
                } else {
                    $done[] = 'حساب المدير موجود مسبقاً — تم تخطيه.';
                }
            } catch (Throwable $e) {
                $errors[] = 'فشل إنشاء حساب المدير: ' . $e->getMessage();
            }
        }

        // ٧) ربط مجلد التخزين (للصور والملفات)
        if (! $errors) {
            try {
                Illuminate\Support\Facades\Artisan::call('storage:link');
                $done[] = 'تم ربط مجلد التخزين.';
            } catch (Throwable $e) {
                // ليست حرجة
            }
        }

        // ٨) أقفل التثبيت واحذف المعالج
        if (! $errors) {
            @file_put_contents($lockFile, date('c'));
            $done[] = 'اكتمل التثبيت بنجاح ✅';
            $step = 'finished';
            // احذف هذا الملف
            @unlink(__FILE__);
        }
    }
}

/* ---------- فحص المتطلبات ---------- */
function checkRequirements(): array
{
    $checks = [];
    $checks[] = ['PHP 8.3 أو أحدث', version_compare(PHP_VERSION, '8.3.0', '>='), PHP_VERSION];
    foreach (['pdo_mysql','mbstring','openssl','tokenizer','xml','ctype','json','bcmath','curl','fileinfo'] as $ext) {
        $checks[] = ["إضافة $ext", extension_loaded($ext), extension_loaded($ext) ? 'موجودة' : 'مفقودة'];
    }
    $checks[] = ['مجلد storage قابل للكتابة', is_writable(BASE . '/storage'), is_writable(BASE.'/storage') ? 'نعم' : 'لا'];
    $checks[] = ['مجلد bootstrap/cache قابل للكتابة', is_writable(BASE . '/bootstrap/cache'), is_writable(BASE.'/bootstrap/cache') ? 'نعم' : 'لا'];
    $checks[] = ['مجلد vendor موجود', is_dir(BASE . '/vendor'), is_dir(BASE.'/vendor') ? 'نعم' : 'لا — ارفع النسخة الكاملة'];
    return $checks;
}
$reqs = ($step === 'requirements') ? checkRequirements() : [];
$reqsOk = true;
foreach ($reqs as $r) { if (! $r[1]) $reqsOk = false; }
?>
<!doctype html>
<html lang="ar" dir="rtl">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>تثبيت MediBook AI</title>
<style>
  :root { --p:#0EA5E9; --d:#0B3142; --ok:#22C55E; --no:#EF4444; --line:#E2E8F0; }
  * { box-sizing:border-box; }
  body { font-family:system-ui,-apple-system,'Segoe UI',Tahoma,sans-serif; background:#F1F5F9; color:var(--d); margin:0; padding:24px; }
  .card { max-width:640px; margin:24px auto; background:#fff; border:1px solid var(--line); border-radius:18px; padding:28px 26px; box-shadow:0 10px 30px rgba(11,49,66,.06); }
  h1 { font-size:1.4rem; margin:0 0 4px; } .sub { color:#64748B; margin:0 0 22px; font-size:.92rem; }
  .logo { font-size:2rem; }
  label { display:block; font-weight:600; font-size:.85rem; margin:14px 0 5px; }
  input { width:100%; padding:10px 12px; border:1px solid var(--line); border-radius:10px; font-size:.95rem; }
  input:focus { outline:none; border-color:var(--p); }
  .row { display:flex; gap:12px; } .row > div { flex:1; }
  .btn { display:block; width:100%; margin-top:22px; padding:13px; background:var(--p); color:#fff; border:0; border-radius:12px; font-size:1rem; font-weight:700; cursor:pointer; }
  .btn:hover { background:#0284C7; }
  .sec { margin-top:22px; padding-top:18px; border-top:1px dashed var(--line); }
  .sec h2 { font-size:1rem; margin:0 0 6px; }
  table { width:100%; border-collapse:collapse; }
  td { padding:8px 6px; border-bottom:1px solid var(--line); font-size:.9rem; }
  .yes { color:var(--ok); font-weight:700; } .nope { color:var(--no); font-weight:700; }
  .err { background:#FEF2F2; border:1px solid #FECACA; color:#991B1B; padding:12px 14px; border-radius:10px; margin-bottom:14px; font-size:.9rem; }
  .ok  { background:#F0FDF4; border:1px solid #BBF7D0; color:#166534; padding:8px 12px; border-radius:8px; margin:6px 0; font-size:.9rem; }
  .hint { color:#64748B; font-size:.8rem; margin-top:4px; }
  .big-ok { text-align:center; padding:20px 0; }
  .big-ok .ico { font-size:3rem; } code { background:#F1F5F9; padding:2px 6px; border-radius:6px; }
  a.lnk { color:var(--p); font-weight:700; text-decoration:none; }
</style>
</head>
<body>
<div class="card">
  <div class="logo">🦷</div>
  <h1>تثبيت MediBook AI</h1>
  <p class="sub">معالج التنصيب — عبّئ البيانات التالية ليتم إعداد النظام تلقائياً.</p>

  <?php if ($step === 'finished'): ?>
    <div class="big-ok">
      <div class="ico">✅</div>
      <h2>تم التثبيت بنجاح!</h2>
      <?php foreach ($done as $d): ?><div class="ok"><?= h($d) ?></div><?php endforeach; ?>
      <p style="margin-top:18px">سجّل الدخول كمدير عام عبر الرابط:</p>
      <p><a class="lnk" href="<?= h(($_POST['app_url'] ?? '') . '/admin') ?>"><?= h(($_POST['app_url'] ?? '') . '/admin') ?></a></p>
      <p class="hint">لأسباب أمنية تم حذف ملف install.php تلقائياً. إن بقي، احذفه يدوياً.</p>
    </div>

  <?php elseif ($step === 'requirements'): ?>
    <div class="sec" style="border:0;margin:0;padding:0">
      <h2>١. فحص المتطلبات</h2>
      <table>
        <?php foreach ($reqs as $r): ?>
          <tr><td><?= h($r[0]) ?></td>
            <td style="text-align:left"><?= h($r[2]) ?></td>
            <td style="width:30px;text-align:center"><?= $r[1] ? '<span class="yes">✔</span>' : '<span class="nope">✕</span>' ?></td></tr>
        <?php endforeach; ?>
      </table>
      <?php if ($reqsOk): ?>
        <a href="?step=form"><button class="btn">المتطلبات مكتملة — متابعة ←</button></a>
      <?php else: ?>
        <div class="err" style="margin-top:16px">بعض المتطلبات غير مكتملة. صحّحها من لوحة الاستضافة (اختر PHP 8.3، فعّل الإضافات الناقصة، واضبط صلاحيات المجلدات إلى 755)، ثم حدّث الصفحة.</div>
        <a href="?step=requirements"><button class="btn">إعادة الفحص</button></a>
      <?php endif; ?>
    </div>

  <?php else: ?>
    <?php foreach ($errors as $e): ?><div class="err"><?= h($e) ?></div><?php endforeach; ?>
    <form method="post" action="?step=form">
      <div class="sec" style="border:0;margin:0;padding:0">
        <h2>٢. قاعدة البيانات</h2>
        <div class="row">
          <div><label>المضيف (Host)</label><input name="db_host" value="<?= h($_POST['db_host'] ?? 'localhost') ?>"></div>
          <div style="max-width:120px"><label>المنفذ</label><input name="db_port" value="<?= h($_POST['db_port'] ?? '3306') ?>"></div>
        </div>
        <label>اسم قاعدة البيانات</label><input name="db_name" value="<?= h($_POST['db_name'] ?? '') ?>" required>
        <label>اسم المستخدم</label><input name="db_user" value="<?= h($_POST['db_user'] ?? '') ?>" required>
        <label>كلمة سر القاعدة</label><input name="db_pass" type="password" value="">
        <p class="hint">أنشئ قاعدة البيانات والمستخدم من cPanel → MySQL Databases أولاً.</p>
      </div>

      <div class="sec">
        <h2>٣. رابط الموقع</h2>
        <label>عنوان الموقع الكامل</label>
        <input name="app_url" placeholder="https://yourdomain.com" value="<?= h($_POST['app_url'] ?? '') ?>" required>
        <p class="hint">مثال: <code>https://medibook.com</code> — بدون شرطة في النهاية.</p>
      </div>

      <div class="sec">
        <h2>٤. حساب المدير العام</h2>
        <label>الاسم</label><input name="admin_name" value="<?= h($_POST['admin_name'] ?? '') ?>" required>
        <label>البريد الإلكتروني</label><input name="admin_email" type="email" value="<?= h($_POST['admin_email'] ?? '') ?>" required>
        <label>كلمة المرور (٨ أحرف فأكثر)</label><input name="admin_pass" type="password" required>
      </div>

      <button class="btn" type="submit">🚀 تثبيت النظام الآن</button>
    </form>
  <?php endif; ?>
</div>
</body>
</html>
