<?php
/**
 * Pagină de instalare / mutare pe hosting.
 *
 * - Verifică mediul (PHP, pdo_sqlite, openssl, foldere scriibile)
 * - Setează APP_BASE_URL (scrie includes/config.local.php)
 * - Opțional: încarcă un backup .sqlite (din pagina Setări → Backup) și îl restaurează
 * - Rulează migrațiile
 *
 * SECURITATE: după instalare, ȘTERGE acest fișier de pe hosting.
 */
require_once __DIR__ . '/includes/config.php';

$localConf  = __DIR__ . '/includes/config.local.php';
$lockFile   = DATA_PATH . '/.installed';
$installed  = is_file($lockFile);

// Base URL detectat din calea scriptului (install.php e la rădăcina aplicației).
$detectedBase = rtrim(str_replace('\\', '/', dirname($_SERVER['SCRIPT_NAME'] ?? '')), '/');
if ($detectedBase === '' || $detectedBase === '/') $detectedBase = '';

/** Verificări de mediu. */
function chk(bool $ok, string $label, string $hint = ''): array { return ['ok' => $ok, 'label' => $label, 'hint' => $hint]; }
$dataDir = DATA_PATH;
$dataWritable = is_dir($dataDir) ? is_writable($dataDir) : @mkdir($dataDir, 0775, true);
$checks = [
    chk(version_compare(PHP_VERSION, '8.0.0', '>='), 'PHP ≥ 8.0 (ai ' . PHP_VERSION . ')', 'Cere hosting-ului PHP 8+'),
    chk(extension_loaded('pdo_sqlite'), 'Extensia pdo_sqlite', 'Activează pdo_sqlite în PHP'),
    chk(extension_loaded('openssl'), 'Extensia openssl (pentru QZ Tray)', 'Activează openssl'),
    chk((bool)$dataWritable, 'Folderul data/ scriibil', 'Dă permisiuni de scriere pe data/'),
    chk(is_writable(__DIR__ . '/includes') || is_file($localConf), 'includes/ scriibil (pentru config.local.php)', 'Dă scriere pe includes/ sau creează manual config.local.php'),
];
$envOk = array_reduce($checks, fn($c, $x) => $c && $x['ok'], true);

$msgs = [];
$errors = [];
$done = false;

if ($_SERVER['REQUEST_METHOD'] === 'POST' && ($_POST['action'] ?? '') === 'install') {
    $reinstallOk = !$installed || ($_POST['reinstall'] ?? '') === '1';
    if (!$reinstallOk) {
        $errors[] = 'Aplicația pare deja instalată. Bifează „Reinstalează" ca să continui.';
    }

    if ($reinstallOk) {
        // 1) Base URL
        $base = trim((string)($_POST['base_url'] ?? ''));
        $base = rtrim(str_replace('\\', '/', $base), '/');
        if ($base !== '' && $base[0] !== '/') $base = '/' . $base;

        // 2) Backup opțional
        if (!empty($_FILES['backup']['tmp_name']) && is_uploaded_file($_FILES['backup']['tmp_name'])) {
            $tmp = $_FILES['backup']['tmp_name'];
            $head = (string)@file_get_contents($tmp, false, null, 0, 16);
            if (strpos($head, 'SQLite format 3') !== 0) {
                $errors[] = 'Fișierul încărcat nu pare o bază SQLite validă.';
            } else {
                // backup la DB-ul existent + curăță WAL/SHM
                if (is_file(SQLITE_PATH)) {
                    @rename(SQLITE_PATH, SQLITE_PATH . '.bak-' . date('Ymd-His'));
                }
                @unlink(SQLITE_PATH . '-wal');
                @unlink(SQLITE_PATH . '-shm');
                if (!@move_uploaded_file($tmp, SQLITE_PATH)) {
                    $errors[] = 'Nu am putut salva fișierul de backup în data/.';
                } else {
                    $msgs[] = 'Backup restaurat în data/app.sqlite.';
                }
            }
        }

        // 3) Scrie config.local.php
        if (!$errors) {
            $conf = "<?php\n"
                . "// Generat de install.php — config specific hosting-ului.\n"
                . "define('APP_BASE_URL', " . var_export($base, true) . ");\n"
                . "define('APP_DISPLAY_ERRORS', '0');\n";
            if (@file_put_contents($localConf, $conf) === false) {
                $errors[] = 'Nu am putut scrie includes/config.local.php. Creează-l manual cu conținutul afișat mai jos.';
                $msgs['manual_conf'] = $conf;
            } else {
                $msgs[] = 'config.local.php scris (APP_BASE_URL = "' . htmlspecialchars($base) . '").';
            }
        }

        // 4) Migrații
        if (!$errors) {
            try {
                require_once __DIR__ . '/includes/db.php';
                db(); // conectează + rulează migrațiile pe DB-ul (eventual restaurat)
                $msgs[] = 'Migrațiile au rulat cu succes.';

                // 5) Certificat QZ partajat (opțional) — același cert pe toate domeniile
                if (!empty($_FILES['qzidentity']['tmp_name']) && is_uploaded_file($_FILES['qzidentity']['tmp_name'])) {
                    require_once __DIR__ . '/includes/qz.php';
                    [$qc, $qk] = qz_parse_identity((string)@file_get_contents($_FILES['qzidentity']['tmp_name']));
                    if ($qc && $qk && @openssl_x509_check_private_key($qc, $qk)) {
                        qz_set_identity($qc, $qk);
                        $msgs[] = 'Certificat QZ importat (partajat între domenii).';
                    } else {
                        $msgs[] = 'Fișierul de certificat QZ a fost ignorat (format invalid).';
                    }
                }

                @file_put_contents($lockFile, date('c'));
                $done = true;
            } catch (Throwable $e) {
                $errors[] = 'Migrații eșuate: ' . $e->getMessage();
            }
        }
    }
}
?>
<!DOCTYPE html>
<html lang="ro">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Instalare · <?= htmlspecialchars(APP_NAME) ?></title>
<script src="https://cdn.tailwindcss.com"></script>
</head>
<body class="bg-slate-100 text-slate-800 min-h-screen">
<div class="max-w-2xl mx-auto p-6">
  <div class="bg-white rounded-2xl shadow-lg p-6 mt-8">
    <h1 class="text-2xl font-bold text-slate-900 mb-1">Instalare pe hosting</h1>
    <p class="text-sm text-slate-500 mb-5"><?= htmlspecialchars(APP_NAME) ?> · SQLite (un singur fișier)</p>

    <?php if ($done): ?>
      <div class="bg-emerald-50 border border-emerald-200 text-emerald-800 rounded-lg p-4 mb-4">
        <div class="font-semibold mb-1">✓ Instalare finalizată</div>
        <ul class="list-disc ml-5 text-sm space-y-0.5">
          <?php foreach ($msgs as $k => $m) if ($k !== 'manual_conf') echo '<li>' . htmlspecialchars($m) . '</li>'; ?>
        </ul>
        <div class="mt-3 text-sm">
          <a href="<?= htmlspecialchars(($detectedBase ?: '') . '/index.php') ?>" class="inline-block px-4 py-2 bg-emerald-600 text-white rounded-lg font-medium">Deschide aplicația →</a>
        </div>
        <p class="mt-3 text-sm font-semibold text-rose-700">⚠️ Acum șterge fișierul <code>install.php</code> de pe hosting!</p>
      </div>
    <?php else: ?>

      <?php foreach ($errors as $e): ?>
        <div class="bg-rose-50 border border-rose-200 text-rose-800 rounded-lg p-3 mb-3 text-sm"><?= htmlspecialchars($e) ?></div>
      <?php endforeach; ?>
      <?php foreach ($msgs as $k => $m): if ($k !== 'manual_conf'): ?>
        <div class="bg-emerald-50 border border-emerald-200 text-emerald-800 rounded-lg p-3 mb-3 text-sm"><?= htmlspecialchars($m) ?></div>
      <?php endif; endforeach; ?>
      <?php if (!empty($msgs['manual_conf'])): ?>
        <div class="bg-amber-50 border border-amber-200 rounded-lg p-3 mb-3 text-xs">
          Creează manual <code>includes/config.local.php</code> cu:
          <pre class="mt-2 bg-white p-2 rounded border overflow-x-auto"><?= htmlspecialchars($msgs['manual_conf']) ?></pre>
        </div>
      <?php endif; ?>

      <!-- Verificări mediu -->
      <div class="border border-slate-100 rounded-lg p-4 mb-5">
        <div class="text-sm font-semibold text-slate-700 mb-2">Verificare mediu</div>
        <ul class="space-y-1.5">
          <?php foreach ($checks as $c): ?>
            <li class="flex items-start gap-2 text-sm">
              <span class="<?= $c['ok'] ? 'text-emerald-600' : 'text-rose-600' ?> font-bold"><?= $c['ok'] ? '✓' : '✗' ?></span>
              <span class="<?= $c['ok'] ? 'text-slate-700' : 'text-rose-700' ?>">
                <?= htmlspecialchars($c['label']) ?>
                <?php if (!$c['ok'] && $c['hint']): ?><span class="block text-xs text-slate-500"><?= htmlspecialchars($c['hint']) ?></span><?php endif; ?>
              </span>
            </li>
          <?php endforeach; ?>
        </ul>
      </div>

      <?php if ($installed): ?>
        <div class="bg-amber-50 border border-amber-200 text-amber-800 rounded-lg p-3 mb-4 text-sm">
          Aplicația pare deja instalată (<code>data/.installed</code> există). Bifează „Reinstalează" mai jos doar dacă vrei să suprascrii.
        </div>
      <?php endif; ?>

      <form method="post" enctype="multipart/form-data" class="space-y-4">
        <input type="hidden" name="action" value="install">

        <div>
          <label class="block text-sm font-medium text-slate-700 mb-1">Base URL (calea sub care rulează aplicația)</label>
          <input type="text" name="base_url" value="<?= htmlspecialchars($detectedBase) ?>"
            placeholder="ex: /GestionareNumeProduse  sau gol pentru rădăcina domeniului"
            class="w-full px-3 py-2 text-sm border border-slate-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-indigo-500">
          <p class="text-xs text-slate-500 mt-1">Detectat automat: <code><?= htmlspecialchars($detectedBase === '' ? '(rădăcina domeniului)' : $detectedBase) ?></code>. Lasă gol dacă aplicația e direct pe domeniu.</p>
        </div>

        <div>
          <label class="block text-sm font-medium text-slate-700 mb-1">Baza de date veche (.sqlite) — opțional</label>
          <input type="file" name="backup" accept=".sqlite,application/x-sqlite3"
            class="w-full text-sm border border-slate-300 rounded-lg p-2">
          <p class="text-xs text-slate-500 mt-1">Backup-ul descărcat din Setări → Backup pe instalarea veche. Dacă îl lași gol, pornește cu o bază nouă, goală.</p>
        </div>

        <div>
          <label class="block text-sm font-medium text-slate-700 mb-1">Certificat QZ (.qzkey / .pem) — opțional</label>
          <input type="file" name="qzidentity" accept=".qzkey,.pem,.crt,application/json"
            class="w-full text-sm border border-slate-300 rounded-lg p-2">
          <p class="text-xs text-slate-500 mt-1">Identitatea QZ de pe alt domeniu (Setări → „Descarcă cheia QZ"), ca toate site-urile să folosească <strong>același certificat</strong> și un singur <code>override.crt</code>.</p>
        </div>

        <?php if ($installed): ?>
          <label class="flex items-center gap-2 text-sm text-rose-700">
            <input type="checkbox" name="reinstall" value="1" class="rounded border-slate-300">
            Reinstalează (suprascrie configurarea / baza de date existentă)
          </label>
        <?php endif; ?>

        <button type="submit" <?= $envOk ? '' : 'disabled' ?>
          class="w-full px-4 py-2.5 text-sm font-medium text-white bg-indigo-600 hover:bg-indigo-700 rounded-lg transition disabled:opacity-50 disabled:cursor-not-allowed">
          Instalează
        </button>
        <?php if (!$envOk): ?>
          <p class="text-xs text-rose-600 text-center">Rezolvă întâi verificările de mediu de mai sus.</p>
        <?php endif; ?>
      </form>
    <?php endif; ?>
  </div>
  <p class="text-center text-xs text-slate-400 mt-4">După instalare, șterge <code>install.php</code> din motive de securitate.</p>
</div>
</body>
</html>
