<?php
declare(strict_types=1);

/**
 * Self-contained installation wizard for first-run setup on shared hosting.
 *
 * MySQL / MariaDB only — works on any shared host that provides pdo_mysql.
 *
 * Lives at /install.php and is the only entry point until storage/installed.lock
 * is created. After successful installation it disables itself if possible.
 */

define('APP_ROOT', dirname(__DIR__));
define('APP_PATH', APP_ROOT . '/app');
define('CONFIG_PATH', APP_ROOT . '/config');
define('STORAGE_PATH', APP_ROOT . '/storage');
define('PUBLIC_PATH', __DIR__);

mb_internal_encoding('UTF-8');

$lockFile = STORAGE_PATH . '/installed.lock';
$alreadyInstalled = file_exists($lockFile);

// ---- Requirements ----
function ensure_writable(string $path): bool
{
    if (is_dir($path)) return is_writable($path);
    $parent = dirname($path);
    if (!is_dir($parent)) @mkdir($parent, 0775, true);
    return is_writable($parent);
}

$reqs = [
    'PHP 8.1+'                  => version_compare(PHP_VERSION, '8.1.0', '>='),
    'Extension: PDO'            => extension_loaded('pdo'),
    'Extension: pdo_mysql'      => extension_loaded('pdo_mysql'),
    'Extension: mbstring'       => extension_loaded('mbstring'),
    'Extension: gd'             => extension_loaded('gd'),
    'Extension: zip'            => extension_loaded('zip'),
    'پوشهٔ config/ نوشتنی'      => is_writable(CONFIG_PATH),
    'پوشهٔ storage/ نوشتنی'     => ensure_writable(STORAGE_PATH),
    'وجود vendor/autoload.php'  => file_exists(APP_ROOT . '/vendor/autoload.php'),
];
$mandatory = ['PHP 8.1+', 'Extension: PDO', 'Extension: pdo_mysql', 'Extension: mbstring',
              'پوشهٔ config/ نوشتنی', 'پوشهٔ storage/ نوشتنی', 'وجود vendor/autoload.php'];
$reqsOk = true;
foreach ($mandatory as $k) { if (empty($reqs[$k])) { $reqsOk = false; break; } }

// ---- Form processing ----
$errors = [];
$success = false;
$post = $_SERVER['REQUEST_METHOD'] === 'POST';

$siteName  = $post ? trim((string)($_POST['site_name']  ?? '')) : 'سامانه تولید فرم PDF';
$adminName = $post ? trim((string)($_POST['admin_name'] ?? '')) : 'مدیر سامانه';
$adminEmail= $post ? trim((string)($_POST['admin_email']?? '')) : '';
$adminPass = $post ? (string)($_POST['admin_password']  ?? '')  : '';
$adminPass2= $post ? (string)($_POST['admin_password_confirm'] ?? '') : '';
$dbHost    = $post ? trim((string)($_POST['db_host']    ?? '127.0.0.1')) : '127.0.0.1';
$dbPort    = $post ? (int)($_POST['db_port'] ?? 3306) : 3306;
$dbName    = $post ? trim((string)($_POST['db_name']    ?? '')) : '';
$dbUser    = $post ? trim((string)($_POST['db_user']    ?? '')) : '';
$dbPass    = $post ? (string)($_POST['db_pass']         ?? '')  : '';

if ($alreadyInstalled) {
    $errors[] = 'سامانه قبلاً نصب شده است. برای نصب مجدد، فایل storage/installed.lock را حذف کنید.';
}

if ($post && !$alreadyInstalled) {
    if (!$reqsOk)                                       $errors[] = 'پیش‌نیازها برآورده نیست؛ موارد قرمز را برطرف کنید.';
    if ($siteName === '')                               $errors[] = 'عنوان سایت الزامی است.';
    if ($adminName === '')                              $errors[] = 'نام مدیر الزامی است.';
    if (!filter_var($adminEmail, FILTER_VALIDATE_EMAIL))$errors[] = 'ایمیل مدیر معتبر نیست.';
    if (strlen($adminPass) < 6)                         $errors[] = 'رمز عبور باید حداقل ۶ کاراکتر باشد.';
    if ($adminPass !== $adminPass2)                     $errors[] = 'تکرار رمز عبور با رمز اصلی یکسان نیست.';
    if ($dbHost === '')                                 $errors[] = 'میزبان دیتابیس الزامی است.';
    if ($dbPort <= 0)                                   $errors[] = 'پورت دیتابیس نامعتبر است.';
    if ($dbName === '')                                 $errors[] = 'نام دیتابیس الزامی است.';
    if ($dbUser === '')                                 $errors[] = 'نام کاربری دیتابیس الزامی است.';

    // Test DB connection
    $pdo = null;
    if (!$errors) {
        try {
            $dsn = "mysql:host={$dbHost};port={$dbPort};dbname={$dbName};charset=utf8mb4";
            $pdo = new PDO($dsn, $dbUser, $dbPass);
            $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
        } catch (Throwable $e) {
            $errors[] = 'اتصال به دیتابیس برقرار نشد: ' . $e->getMessage();
        }
    }

    if (!$errors && $pdo) {
        try {
            // Write installed.php with the chosen DB config
            $installed = [
                'driver' => 'mysql',
                'mysql'  => [
                    'host' => $dbHost, 'port' => $dbPort, 'database' => $dbName,
                    'username' => $dbUser, 'password' => $dbPass, 'charset' => 'utf8mb4',
                ],
            ];
            $php = "<?php\n// Auto-generated by installer at " . date('c') . "\nreturn " . var_export($installed, true) . ";\n";
            if (file_put_contents(CONFIG_PATH . '/installed.php', $php) === false) {
                throw new RuntimeException('نوشتن config/installed.php ممکن نشد. سطح دسترسی را به 0775 تغییر دهید.');
            }

            // Bootstrap framework so we can reuse Schema class
            require APP_ROOT . '/vendor/autoload.php';
            \App\Core\Config::load();
            \App\Core\Database::boot();
            \App\Core\Schema::ensure();

            $db = \App\Core\Database::pdo();

            // Replace any seed users with the user-provided admin
            $db->prepare("DELETE FROM users WHERE email IN ('admin@example.com','user@example.com')")->execute();

            $existing = $db->prepare("SELECT id FROM users WHERE email = ?");
            $existing->execute([$adminEmail]);
            $row = $existing->fetch();
            $hash = password_hash($adminPass, PASSWORD_BCRYPT, ['cost' => 12]);
            if ($row) {
                $db->prepare("UPDATE users SET full_name=?, password=?, role='admin', status='active' WHERE id=?")
                   ->execute([$adminName, $hash, (int)$row['id']]);
            } else {
                $db->prepare("INSERT INTO users (full_name,email,password,role,status) VALUES (?,?,?,?,?)")
                   ->execute([$adminName, $adminEmail, $hash, 'admin', 'active']);
            }

            // Save site settings
            $kv = [
                'site_name'   => $siteName,
                'admin_email' => $adminEmail,
            ];
            foreach ($kv as $k => $v) {
                $exists = $db->prepare("SELECT setting_key FROM settings WHERE setting_key=?");
                $exists->execute([$k]);
                if ($exists->fetch()) {
                    $db->prepare("UPDATE settings SET setting_value=? WHERE setting_key=?")->execute([$v, $k]);
                } else {
                    $db->prepare("INSERT INTO settings (setting_key,setting_value) VALUES (?,?)")->execute([$k, $v]);
                }
            }

            // Lock the installer
            file_put_contents($lockFile, date('c'));

            // Try to disable installer to prevent accidental re-install
            @rename(__FILE__, __FILE__ . '.disabled-' . date('YmdHis'));

            $success = true;
        } catch (Throwable $e) {
            $errors[] = 'خطا در نصب: ' . $e->getMessage();
        }
    }
}

function h(?string $v): string { return htmlspecialchars((string)$v, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); }
?>
<!doctype html>
<html lang="fa" dir="rtl">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>نصب سامانه فرم‌ساز PDF</title>
<style>
* { box-sizing: border-box }
body { margin:0; padding:24px 12px; background:linear-gradient(135deg,#eef2ff,#f5f3ff); font-family: 'Tahoma','Vazirmatn',sans-serif; color:#1f2937; min-height:100vh; }
.wrap { max-width: 880px; margin:0 auto; }
.card { background:#fff; border-radius:18px; padding:28px; box-shadow:0 20px 50px rgba(76,29,149,.08); margin-bottom:18px; }
h1 { margin:0 0 8px; font-size:24px; color:#4c1d95; }
h2 { margin:0 0 16px; font-size:18px; color:#1f2937; }
.brand { display:flex; align-items:center; gap:12px; margin-bottom:6px; }
.logo { width:46px; height:46px; border-radius:12px; background:linear-gradient(135deg,#6366f1,#8b5cf6); color:#fff; display:flex; align-items:center; justify-content:center; font-weight:700; }
p.lead { color:#6b7280; margin:0 0 18px; }
.req { display:grid; grid-template-columns:1fr auto; gap:6px 14px; }
.req .ok  { color:#15803d; font-weight:600; }
.req .bad { color:#b91c1c; font-weight:600; }
label { display:block; font-weight:600; margin:14px 0 6px; font-size:14px; }
input, select, textarea { width:100%; padding:11px 13px; border:1px solid #d1d5db; border-radius:10px; font:inherit; }
input:focus, select:focus { outline:none; border-color:#6366f1; box-shadow:0 0 0 3px rgba(99,102,241,.15); }
.row { display:grid; grid-template-columns:1fr 1fr; gap:14px; }
@media(max-width:640px){ .row { grid-template-columns:1fr; } }
.btn { display:inline-block; padding:12px 22px; border-radius:10px; border:none; font:inherit; font-weight:700; cursor:pointer; }
.btn-primary { background:linear-gradient(135deg,#6366f1,#8b5cf6); color:#fff; box-shadow:0 8px 18px rgba(99,102,241,.35); }
.btn-light { background:#f3f4f6; color:#1f2937; }
.alert { padding:12px 14px; border-radius:10px; margin-bottom:14px; font-size:14px; }
.alert-error { background:#fef2f2; color:#991b1b; border:1px solid #fecaca; }
.alert-success { background:#ecfdf5; color:#065f46; border:1px solid #a7f3d0; }
.help { font-size:12px; color:#6b7280; margin-top:4px; }
.section { border-top:1px dashed #e5e7eb; margin-top:22px; padding-top:18px; }
hr.soft { border:none; border-top:1px dashed #e5e7eb; margin:18px 0; }
ul.next { line-height:1.9; padding-right:18px; color:#374151; }
.creds { background:#f9fafb; padding:12px; border-radius:10px; font-family:monospace; direction:ltr; text-align:left; }
</style>
</head>
<body>
<div class="wrap">
    <div class="card">
        <div class="brand">
            <div class="logo">PDF</div>
            <div>
                <h1>نصب سامانه فرم‌ساز PDF</h1>
                <p class="lead">تنظیمات اولیه را وارد کنید تا سامانه آماده شود. این کار فقط یک‌بار انجام می‌شود.</p>
            </div>
        </div>
    </div>

    <?php if ($success): ?>
        <div class="card">
            <div class="alert alert-success">
                <b>✓ نصب با موفقیت انجام شد.</b><br>
                می‌توانید وارد سامانه شوید.
            </div>
            <h2>اطلاعات ورود</h2>
            <div class="creds">
                Email:    <?= h($adminEmail) ?><br>
                Password: <i>[رمزی که وارد کردید]</i>
            </div>
            <hr class="soft">
            <h2>گام‌های بعدی</h2>
            <ul class="next">
                <li>به صفحهٔ ورود بروید و با حساب مدیر وارد شوید.</li>
                <li>از منوی «<b>تنظیمات سایت</b>» می‌توانید عنوان، شعار و سایر گزینه‌ها را هر زمان تغییر دهید.</li>
                <li>از منوی «<b>پروفایل و رمز عبور</b>» می‌توانید رمز یا ایمیل خود را عوض کنید.</li>
                <li>برای ایمنی بیشتر، اگر نصاب به‌صورت خودکار غیرفعال نشد، فایل <code>public/install.php</code> را دستی حذف کنید.</li>
            </ul>
            <hr class="soft">
            <a class="btn btn-primary" href="/login">ورود به سامانه</a>
        </div>
    <?php else: ?>

    <div class="card">
        <h2>۱) بررسی پیش‌نیازها</h2>
        <div class="req">
            <?php foreach ($reqs as $name => $ok): ?>
                <div><?= h($name) ?></div>
                <div class="<?= $ok ? 'ok' : 'bad' ?>"><?= $ok ? '✓ آماده' : '✗ ناموجود' ?></div>
            <?php endforeach; ?>
        </div>
        <?php if (!$reqsOk): ?>
            <div class="alert alert-error" style="margin-top:14px">
                لطفاً ابتدا موارد قرمز رنگ را برطرف کنید (افزایش سطح دسترسی پوشه‌ها به 0775 یا 0777، یا فعال‌سازی اکستنشن‌های PHP لازم).
            </div>
        <?php endif; ?>
    </div>

    <?php if ($errors): ?>
        <div class="alert alert-error">
            <b>اشکال در نصب:</b>
            <ul style="margin:6px 0 0; padding-right:18px">
                <?php foreach ($errors as $e): ?><li><?= h($e) ?></li><?php endforeach; ?>
            </ul>
        </div>
    <?php endif; ?>

    <form method="post" autocomplete="off">
        <div class="card">
            <h2>۲) اطلاعات سایت</h2>
            <label>عنوان سایت</label>
            <input name="site_name" value="<?= h($siteName) ?>" required>
            <div class="help">مثلاً «سامانه ثبت‌نام شرکت آذرپارس» یا «فرم‌ساز رسمی»</div>
        </div>

        <div class="card">
            <h2>۳) حساب مدیر سامانه</h2>
            <label>نام و نام خانوادگی</label>
            <input name="admin_name" value="<?= h($adminName) ?>" required>

            <label>ایمیل مدیر</label>
            <input type="email" name="admin_email" value="<?= h($adminEmail) ?>" dir="ltr" required>
            <div class="help">از این ایمیل برای ورود به سامانه استفاده می‌کنید.</div>

            <div class="row">
                <div>
                    <label>رمز عبور</label>
                    <input type="password" name="admin_password" dir="ltr" minlength="6" required>
                    <div class="help">حداقل ۶ کاراکتر.</div>
                </div>
                <div>
                    <label>تکرار رمز عبور</label>
                    <input type="password" name="admin_password_confirm" dir="ltr" minlength="6" required>
                </div>
            </div>
        </div>

        <div class="card">
            <h2>۴) دیتابیس MySQL / MariaDB</h2>
            <div class="help" style="margin-bottom:6px">
                اطلاعات اتصال دیتابیس را از پنل میزبانی خود (cPanel / DirectAdmin / Plesk) دریافت کنید.
                دیتابیس و کاربر را از پنل بسازید و سپس مقادیر را اینجا وارد کنید.
            </div>

            <div class="row">
                <div>
                    <label>میزبان (Host)</label>
                    <input name="db_host" value="<?= h($dbHost) ?>" dir="ltr" required>
                    <div class="help">معمولاً <code>localhost</code> یا <code>127.0.0.1</code></div>
                </div>
                <div>
                    <label>پورت</label>
                    <input name="db_port" value="<?= h((string)$dbPort) ?>" dir="ltr" required>
                    <div class="help">پیش‌فرض <code>3306</code></div>
                </div>
            </div>
            <label>نام دیتابیس</label>
            <input name="db_name" value="<?= h($dbName) ?>" dir="ltr" required>
            <div class="row">
                <div>
                    <label>نام کاربری</label>
                    <input name="db_user" value="<?= h($dbUser) ?>" dir="ltr" required>
                </div>
                <div>
                    <label>رمز عبور</label>
                    <input type="password" name="db_pass" value="<?= h($dbPass) ?>" dir="ltr">
                </div>
            </div>
        </div>

        <div class="card" style="text-align:center">
            <button class="btn btn-primary" type="submit" <?= $alreadyInstalled ? 'disabled' : '' ?>>شروع نصب</button>
        </div>
    </form>

    <?php endif; ?>
</div>
</body>
</html>
