<?php
/**
 * CryptoGate - One-Page Installer
 * File: /home/cryshcje/public_html/cgate/install.php
 * Version: 1.5.2
 *
 * Runs a 3-step guided setup:
 *   Step 1  Requirements check
 *   Step 2  Admin account + payment settings
 *   Step 3  Done  (writes inc/installed.lock)
 *
 * Security: install-key ownership proof, CSRF on every form, PRG redirects,
 * self-locking after success, security headers, session regeneration.
 */

declare(strict_types=1);

require_once __DIR__ . '/inc/db.php';
require_once __DIR__ . '/inc/schema.php';

/* ------------------------------------------------------------
   Security headers
   ------------------------------------------------------------ */
header('X-Frame-Options: DENY');
header('X-Content-Type-Options: nosniff');
header('Referrer-Policy: no-referrer');
header('Cache-Control: no-store');

cg_session_start();

/* ------------------------------------------------------------
   Install key - proves the person running the installer owns
   the server (they must read a file only the server owner can).
   ------------------------------------------------------------ */
define('CG_INSTALL_KEY_FILE', CG_ROOT . '/inc/install.key');

function cg_install_key(): string
{
    if (is_file(CG_INSTALL_KEY_FILE)) {
        $k = trim((string)file_get_contents(CG_INSTALL_KEY_FILE));
        if (preg_match('/^[a-f0-9]{48}$/', $k)) {
            return $k;
        }
    }
    $k = bin2hex(random_bytes(24));
    file_put_contents(CG_INSTALL_KEY_FILE, $k . PHP_EOL, LOCK_EX);
    @chmod(CG_INSTALL_KEY_FILE, 0600);
    return $k;
}

function cg_install_verified(): bool
{
    return !empty($_SESSION['cg_install_ok']);
}

$justInstalled = !empty($_SESSION['cg_just_installed']) && (int)($_GET['step'] ?? 0) === 3;

if (cg_is_installed() && !$justInstalled) {
    cg_page_top('Already installed', 3);
    echo '<div class="sheet done">
            <div class="big"><svg width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M20 6 9 17l-5-5"/></svg></div>
            <h2>CryptoGate is already installed</h2>
            <p class="lead">Delete <code>install.php</code> from your server to keep it locked.</p>
            <a class="btn" href="admin/">Open dashboard</a>
          </div>';
    cg_page_bottom();
    exit;
}

$step   = (int)($_GET['step'] ?? 1);
$errors = [];

$selfLocked = false;
if ($step === 3) {
    if (!$justInstalled) {
        cg_redirect('install.php?step=1');
    }
    unset($_SESSION['cg_just_installed']);
    // Disable this installer automatically (the current request keeps running).
    $selfLocked = @rename(__FILE__, __FILE__ . '.locked');
}
if ($step < 1 || $step > 3) {
    $step = 1;
}
if ($step === 2 && !cg_install_verified()) {
    cg_redirect('install.php?step=1');
}

/* ============================================================
   HANDLE STEP 1 SUBMIT  (install key)
   ============================================================ */
$keyError = null;
if ($_SERVER['REQUEST_METHOD'] === 'POST' && ($_POST['action'] ?? '') === 'verify_key') {
    if (!cg_csrf_check()) {
        $keyError = 'Your session expired. Please try again.';
    } else {
        $given = is_string($_POST['install_key'] ?? null) ? trim($_POST['install_key']) : '';
        if ($given !== '' && hash_equals(cg_install_key(), $given)) {
            session_regenerate_id(true);
            $_SESSION['cg_install_ok'] = 1;
            cg_redirect('install.php?step=2');
        }
        $keyError = 'That key does not match the one in inc/install.key.';
        usleep(400000); // slow down guessing
    }
    $step = 1;
}

/* ============================================================
   REQUIREMENTS
   ============================================================ */
function cg_requirements(): array
{
    $lockDir = CG_ROOT . '/inc';

    return [
        ['label' => 'PHP 8.0 or newer',      'ok' => PHP_VERSION_ID >= 80000, 'value' => PHP_VERSION],
        ['label' => 'PDO MySQL extension',   'ok' => extension_loaded('pdo_mysql'), 'value' => extension_loaded('pdo_mysql') ? 'loaded' : 'missing'],
        ['label' => 'cURL extension',        'ok' => extension_loaded('curl'), 'value' => extension_loaded('curl') ? 'loaded' : 'missing'],
        ['label' => 'JSON extension',        'ok' => extension_loaded('json'), 'value' => extension_loaded('json') ? 'loaded' : 'missing'],
        ['label' => 'BCMath or GMP',         'ok' => extension_loaded('bcmath') || extension_loaded('gmp'), 'value' => extension_loaded('bcmath') ? 'bcmath' : (extension_loaded('gmp') ? 'gmp' : 'missing')],
        ['label' => 'inc/ folder writable',  'ok' => is_writable($lockDir), 'value' => is_writable($lockDir) ? 'writable' : 'not writable'],
    ];
}

function cg_requirements_pass(array $reqs): bool
{
    foreach ($reqs as $r) {
        if (!$r['ok']) {
            return false;
        }
    }
    return true;
}

/* ============================================================
   DATABASE CONNECTION TEST
   ============================================================ */
function cg_test_db(): ?string
{
    // Deliberately NOT using cg_db(): that helper exits on failure,
    // which would break the installer's friendly error display.
    try {
        $dsn = sprintf('mysql:host=%s;dbname=%s;charset=%s', CG_DB_HOST, CG_DB_NAME, CG_DB_CHARSET);
        $pdo = new PDO($dsn, CG_DB_USER, CG_DB_PASS, [
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_TIMEOUT => 5,
        ]);
        $pdo->query('SELECT 1');
        return null;
    } catch (Throwable $e) {
        return 'Cannot connect to the database. Check CG_DB_NAME / CG_DB_USER / CG_DB_PASS in inc/db.php';
    }
}

/* ============================================================
   HANDLE STEP 2 SUBMIT
   ============================================================ */
if ($_SERVER['REQUEST_METHOD'] === 'POST' && ($_POST['action'] ?? '') === 'install') {

    if (!cg_install_verified()) {
        cg_redirect('install.php?step=1');
    }
    if (!cg_csrf_check()) {
        $errors[] = 'Your session expired. Please submit the form again.';
    }

    $str = static function (string $key, string $default = ''): string {
        $v = $_POST[$key] ?? $default;
        return is_string($v) ? trim($v) : $default;
    };

    $username    = $str('username');
    $password    = is_string($_POST['password']  ?? null) ? (string)$_POST['password']  : '';
    $password2   = is_string($_POST['password2'] ?? null) ? (string)$_POST['password2'] : '';
    $email       = $str('email');
    $mode        = $str('address_mode', 'shared') === 'hd' ? 'hd' : 'shared';
    $walletValue = $str('wallet');
    $tronKey     = $str('tron_api_key');
    $brand       = $str('brand_name', 'CryptoGate');

    /* -------- validation -------- */
    if ($username === '' || !preg_match('/^[A-Za-z0-9_]{3,64}$/', $username)) {
        $errors[] = 'Username must be 3-64 characters (letters, numbers, underscore).';
    }
    if (strlen($password) < 8) {
        $errors[] = 'Password must be at least 8 characters.';
    }
    if ($password !== $password2) {
        $errors[] = 'The two passwords do not match.';
    }
    if ($username !== '' && strcasecmp($password, $username) === 0) {
        $errors[] = 'Password must be different from the username.';
    }
    if ($email !== '' && !filter_var($email, FILTER_VALIDATE_EMAIL)) {
        $errors[] = 'Invalid email address.';
    }
    if ($walletValue === '') {
        $errors[] = $mode === 'hd'
            ? 'Please enter your extended public key (xpub).'
            : 'Please enter your USDT (TRC20) wallet address.';
    }
    if ($mode === 'shared' && $walletValue !== '' && !preg_match('/^T[A-Za-z0-9]{33}$/', $walletValue)) {
        $errors[] = 'That does not look like a valid TRON (TRC20) address. It should start with T and be 34 characters long.';
    }
    if ($mode === 'hd' && $walletValue !== '' && !preg_match('/^xpub[1-9A-HJ-NP-Za-km-z]{100,115}$/', $walletValue)) {
        $errors[] = 'That does not look like a valid extended public key. It should start with "xpub" (about 111 characters).';
    }

    if ($dbErr = cg_test_db()) {
        $errors[] = $dbErr;
    }

    /* -------- run the install -------- */
    if (!$errors) {
        try {
            $pdo = cg_db();

            foreach (cg_schema_sql() as $sql) {
                $pdo->exec($sql);
            }

            $defaults = cg_schema_defaults();
            $defaults['brand_name']   = $brand !== '' ? $brand : 'CryptoGate';
            $defaults['address_mode'] = $mode;
            $defaults['tron_api_key'] = $tronKey;
            $defaults['ipn_secret']   = cg_token(24);
            $defaults['installed_at'] = cg_now();

            if ($mode === 'hd') {
                $defaults['xpub'] = $walletValue;
            } else {
                $defaults['shared_address'] = $walletValue;
            }

            foreach ($defaults as $k => $v) {
                cg_query(
                    'INSERT INTO cg_settings (k, v) VALUES (?, ?)
                     ON DUPLICATE KEY UPDATE v = VALUES(v)',
                    [$k, (string)$v]
                );
            }

            cg_query(
                'INSERT INTO cg_admins (username, password_hash, email, created_at)
                 VALUES (?, ?, ?, ?)',
                [
                    $username,
                    password_hash($password, PASSWORD_DEFAULT),
                    $email !== '' ? $email : null,
                    cg_now(),
                ]
            );

            // First API key, ready to use straight away.
            cg_query(
                'INSERT INTO cg_api_keys (label, api_key, api_secret, created_at)
                 VALUES (?, ?, ?, ?)',
                ['Default key', 'cg_' . cg_token(16), cg_token(24), cg_now()]
            );

            file_put_contents(
                CG_ROOT . '/inc/installed.lock',
                'installed ' . cg_now() . PHP_EOL
            );

            @unlink(CG_INSTALL_KEY_FILE);

            session_regenerate_id(true);
            unset($_SESSION['cg_install_ok']);
            $_SESSION['cg_just_installed'] = 1;

            cg_redirect('install.php?step=3');

        } catch (Throwable $e) {
            cg_log('Install failed: ' . $e->getMessage());
            $errors[] = 'Installation failed: ' . $e->getMessage();
        }
    }

    if ($errors) {
        $step = 2;
    }
}

/* ============================================================
   PAGE CHROME
   ============================================================ */
function cg_page_top(string $title, int $step = 1): void
{
    $steps = [
        1 => ['Server check',  'Requirements & database'],
        2 => ['Your details',  'Admin account & wallet'],
        3 => ['Ready',         'Sign in and start'],
    ];
    ?><!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title><?= cg_e($title) ?> - CryptoGate setup</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=Manrope:wght@500;600;700;800&display=swap" rel="stylesheet">
<style>
  :root{
    --paper:#F2F4F7; --sheet:#FFFFFF; --ink:#12202E; --ink-2:#4B5A6B; --ink-3:#8593A3;
    --rule:#DDE3EA; --rule-2:#EEF1F5;
    --green:#0E7C5B; --green-2:#0A6349; --green-soft:#E3F3EC;
    --amber:#B7791F; --amber-soft:#FBF1DF;
    --red:#B42318;  --red-soft:#FBEAE8;
    --r:14px;
  }
  *{box-sizing:border-box;margin:0;padding:0}
  html{-webkit-text-size-adjust:100%}
  body{
    background:var(--paper);color:var(--ink);
    font-family:"Manrope",ui-sans-serif,system-ui,-apple-system,"Segoe UI",Roboto,sans-serif;
    font-size:15px;line-height:1.55;min-height:100vh;
  }
  a{color:inherit}
  .shell{max-width:980px;margin:0 auto;padding:28px 18px 48px}

   /* header */
  .brand{display:flex;align-items:center;gap:12px;margin-bottom:26px}
  .brand .mark{width:38px;height:38px;border-radius:10px;background:var(--ink);
    display:grid;place-items:center;flex:none}
  .brand .mark svg{width:20px;height:20px}
  .brand h1{font-size:19px;font-weight:800;letter-spacing:-.01em;line-height:1.1}
  .brand p{font-size:13px;color:var(--ink-3);margin-top:2px}

  /* layout */
  .grid{display:grid;grid-template-columns:250px 1fr;gap:22px;align-items:start}
  @media (max-width:740px){.grid{grid-template-columns:1fr}}

  /* ledger rail */
  .rail{background:var(--sheet);border:1px solid var(--rule);border-radius:var(--r);
    padding:6px 0;position:sticky;top:18px}
  .rail .row{display:flex;gap:14px;padding:16px 18px;border-bottom:1px solid var(--rule-2);
    position:relative}
  .rail .row:last-child{border-bottom:0}
  .rail .n{width:30px;height:30px;border-radius:50%;border:1.5px solid var(--rule);
    display:grid;place-items:center;font-weight:800;font-size:13px;color:var(--ink-3);flex:none;
    background:var(--sheet)}
  .rail .row.done .n{background:var(--green);border-color:var(--green);color:#fff}
  .rail .row.on .n{border-color:var(--ink);color:var(--ink)}
  .rail .t{font-weight:700;font-size:14px;color:var(--ink-3)}
  .rail .row.on .t,.rail .row.done .t{color:var(--ink)}
  .rail .s{font-size:12.5px;color:var(--ink-3);margin-top:1px}
  .rail .row.on::before{content:"";position:absolute;left:0;top:14px;bottom:14px;width:3px;
    background:var(--green);border-radius:0 3px 3px 0}
  @media (max-width:740px){
    .rail{position:static;display:flex;padding:0;overflow:hidden}
    .rail .row{flex:1;flex-direction:column;align-items:center;text-align:center;gap:8px;
      padding:14px 8px;border-bottom:0;border-right:1px solid var(--rule-2)}
    .rail .row:last-child{border-right:0}
    .rail .s{display:none}
    .rail .row.on::before{left:12%;right:12%;top:auto;bottom:0;width:auto;height:3px;
      border-radius:3px 3px 0 0}
  }

  /* sheet */
  .sheet{background:var(--sheet);border:1px solid var(--rule);border-radius:var(--r);
    padding:26px 26px 24px;margin-bottom:16px}
  @media (max-width:740px){.sheet{padding:20px 18px 18px}}
  .sheet h2{font-size:21px;font-weight:800;letter-spacing:-.015em;margin-bottom:4px}
  .sheet .lead{color:var(--ink-2);font-size:14px;margin-bottom:18px}

  /* checklist */
  .checks{border-top:1px solid var(--rule);}
  .checks .c{display:flex;align-items:center;gap:12px;padding:12px 0;border-bottom:1px solid var(--rule-2)}
  .checks .ic{width:22px;height:22px;border-radius:50%;display:grid;place-items:center;flex:none}
  .checks .ic svg{width:12px;height:12px}
  .checks .ok .ic{background:var(--green-soft);color:var(--green)}
  .checks .bad .ic{background:var(--red-soft);color:var(--red)}
  .checks .lbl{flex:1;font-weight:600;font-size:14px}
  .checks .val{font-size:13px;color:var(--ink-3);font-variant-numeric:tabular-nums}
  .checks .bad .val{color:var(--red);font-weight:600}

  .stamp{display:inline-flex;align-items:center;gap:8px;margin-top:18px;padding:8px 12px;
    border-radius:8px;background:var(--green-soft);color:var(--green-2);font-weight:800;
    font-size:13px;letter-spacing:.02em}
  .stamp svg{width:14px;height:14px}

  /* forms */
  .field{margin-top:16px}
  label.lbl{display:block;font-size:13px;font-weight:700;color:var(--ink-2);margin-bottom:6px}
  .in{width:100%;padding:12px 13px;border-radius:10px;border:1.5px solid var(--rule);
    background:#fff;color:var(--ink);font:inherit;font-size:15px;transition:border-color .15s}
  .in:focus{outline:none;border-color:var(--ink)}
  .in::placeholder{color:#B7C0CB}
  .help{font-size:12.5px;color:var(--ink-3);margin-top:6px}

  .choice{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-top:6px}
  @media (max-width:480px){.choice{grid-template-columns:1fr}}
  .opt{border:1.5px solid var(--rule);border-radius:12px;padding:14px;cursor:pointer;
    background:#fff;transition:border-color .15s,background .15s}
  .opt.sel{border-color:var(--green);background:var(--green-soft)}
  .opt b{display:block;font-size:14px;margin-bottom:3px}
  .opt small{display:block;font-size:12.5px;color:var(--ink-2);line-height:1.45}
  .opt .tag{display:inline-block;font-size:11px;font-weight:800;color:var(--green-2);
    margin-left:6px;vertical-align:1px}

  .trust{display:flex;gap:12px;align-items:flex-start;background:var(--amber-soft);
    border-radius:10px;padding:12px 14px;margin-top:18px;font-size:13px;color:#6B4A0E}
  .trust svg{width:18px;height:18px;flex:none;margin-top:1px}

  .btn{display:block;width:100%;padding:14px;border:0;border-radius:11px;background:var(--ink);
    color:#fff;font:inherit;font-weight:800;font-size:15px;cursor:pointer;text-align:center;
    text-decoration:none;margin-top:22px;transition:background .15s}
  .btn:hover{background:#0B1622}
  .btn:focus-visible{outline:3px solid rgba(14,124,91,.35);outline-offset:2px}
  .btn.ghost{background:transparent;color:var(--ink);border:1.5px solid var(--rule)}
  .btn.ghost:hover{background:var(--paper)}

  .alert{border-radius:10px;padding:12px 14px;margin-bottom:16px;font-size:13.5px}
  .alert.err{background:var(--red-soft);color:#7A1C14;border:1px solid #F1C4BF}
  .alert ul{margin:6px 0 0 18px}

  .done{text-align:center;padding:36px 20px}
  .done .big{width:72px;height:72px;border-radius:50%;background:var(--green);color:#fff;
    display:grid;place-items:center;margin:0 auto 18px}
  .done .big svg{width:32px;height:32px}
  .done h2{margin-bottom:6px}
  .note{background:var(--paper);border:1px solid var(--rule);border-radius:10px;padding:12px 14px;
    margin:18px auto 0;max-width:420px;text-align:left;font-size:13px;color:var(--ink-2);
    overflow-wrap:anywhere;word-break:break-all}
  code{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12.5px;background:var(--rule-2);
    padding:2px 6px;border-radius:5px;color:var(--ink);white-space:normal;overflow-wrap:anywhere;word-break:break-all}
  .grid>*{min-width:0}
  html,body{overflow-x:hidden}
  .foot{margin-top:14px;font-size:12px;color:var(--ink-3);text-align:center}
  @media (prefers-reduced-motion:reduce){*{transition:none!important}}
</style>
</head>
<body><div class="shell">
  <div class="brand" style="display:flex;align-items:center;gap:12px;margin-bottom:26px">
    <div class="mark" style="width:38px;height:38px;border-radius:10px;background:#12202E;display:flex;align-items:center;justify-content:center;flex:none"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="#fff" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="width:20px;height:20px;display:block"><rect x="3" y="7" width="18" height="12" rx="2.5"/><path d="M3 11h18"/><path d="M8 15h3"/></svg></div>
    <div><h1 style="font-size:19px;font-weight:800;letter-spacing:-.01em;line-height:1.1;margin:0">CryptoGate</h1><p style="font-size:13px;color:#8593A3;margin:2px 0 0">Self-hosted crypto payment gateway</p></div>
  </div>

  <div class="grid">
    <aside class="rail">
      <?php foreach ($steps as $i => [$t, $sub]): ?>
        <div class="row <?= $i < $step ? 'done' : ($i === $step ? 'on' : '') ?>">
          <div class="n"><?= $i < $step ? '&#10003;' : $i ?></div>
          <div><div class="t"><?= cg_e($t) ?></div><div class="s"><?= cg_e($sub) ?></div></div>
        </div>
      <?php endforeach; ?>
    </aside>
    <main>
<?php
}

function cg_page_bottom(): void
{
    echo '</main></div><div class="foot">CryptoGate ' . cg_e(CG_APP_VERSION) . ' &middot; Your keys stay with you.</div></div></body></html>';
}

/* ============================================================
   RENDER
   ============================================================ */
cg_page_top('Install', $step);

$ok_svg  = '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"><path d="M20 6 9 17l-5-5"/></svg>';
$bad_svg = '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"><path d="M18 6 6 18M6 6l12 12"/></svg>';
?>

<?php if ($step === 1): ?>

  <?php
    $reqs  = cg_requirements();
    $pass  = cg_requirements_pass($reqs);
    $dbErr = cg_test_db();
    $reqs[] = ['label' => 'Database connection', 'ok' => $dbErr === null, 'value' => $dbErr ? 'failed' : 'connected'];
    $allOk = $pass && $dbErr === null;
  ?>
  <div class="sheet">
    <h2>Server check</h2>
    <p class="lead">Making sure this hosting can run CryptoGate before anything is written.</p>

    <div class="checks">
      <?php foreach ($reqs as $r): ?>
      <div class="c <?= $r['ok'] ? 'ok' : 'bad' ?>">
        <div class="ic"><?= $r['ok'] ? $ok_svg : $bad_svg ?></div>
        <div class="lbl"><?= cg_e($r['label']) ?></div>
        <div class="val"><?= cg_e($r['value']) ?></div>
      </div>
      <?php endforeach; ?>
    </div>

    <?php if ($allOk): ?>
      <div class="stamp"><?= $ok_svg ?> All checks passed</div>
      <?php $installKey = cg_install_key(); ?>
      <form method="post" action="install.php" novalidate>
        <input type="hidden" name="action" value="verify_key">
        <?= cg_csrf_field() ?>
        <div class="field" style="margin-top:22px">
          <label class="lbl" for="f-key">Install key</label>
          <input class="in" id="f-key" type="text" name="install_key" placeholder="Paste the key here" autocomplete="off" spellcheck="false" required>
          <div class="help">To confirm you own this server, open the file below and paste its contents. This stops anyone else from running the installer.</div>
          <div class="note" style="margin:10px 0 0;max-width:none"><code><?= cg_e(CG_INSTALL_KEY_FILE) ?></code></div>
          <?php if ($keyError): ?><div class="alert err" style="margin:12px 0 0"><?= cg_e($keyError) ?></div><?php endif; ?>
        </div>
        <button class="btn" type="submit">Verify and continue</button>
      </form>
    <?php else: ?>
      <?php if ($dbErr): ?><div class="alert err" style="margin-top:16px"><?= cg_e($dbErr) ?></div><?php endif; ?>
      <a class="btn ghost" href="?step=1">Run the check again</a>
    <?php endif; ?>
  </div>

<?php elseif ($step === 2): ?>

  <?php if ($errors): ?>
    <div class="alert err">
      <b>Fix these to continue</b>
      <ul><?php foreach ($errors as $e) echo '<li>' . cg_e($e) . '</li>'; ?></ul>
    </div>
  <?php endif; ?>

  <form method="post" action="install.php" novalidate>
    <input type="hidden" name="action" value="install">
    <?= cg_csrf_field() ?>

    <div class="sheet">
      <h2>Your admin account</h2>
      <p class="lead">This is how you sign in to the dashboard.</p>

      <div class="field"><label class="lbl" for="f-user">Username</label>
        <input class="in" id="f-user" type="text" name="username" value="<?= cg_e(is_string($_POST['username'] ?? null) ? $_POST['username'] : '') ?>" autocomplete="off" required></div>
      <div class="field"><label class="lbl" for="f-pass">Password</label>
        <input class="in" id="f-pass" type="password" name="password" autocomplete="new-password" required>
        <div class="help">At least 8 characters.</div></div>
      <div class="field"><label class="lbl" for="f-pass2">Repeat password</label>
        <input class="in" id="f-pass2" type="password" name="password2" autocomplete="new-password" required></div>
      <div class="field"><label class="lbl" for="f-mail">Email <span style="font-weight:500;color:var(--ink-3)">(optional)</span></label>
        <input class="in" id="f-mail" type="email" name="email" value="<?= cg_e(is_string($_POST['email'] ?? null) ? $_POST['email'] : '') ?>"></div>
    </div>

    <div class="sheet">
      <h2>Where payments go</h2>
      <p class="lead">Customers pay straight into your wallet. Nothing is held by this server.</p>

      <div class="choice">
        <label class="opt sel" id="m-shared">
          <input type="radio" name="address_mode" value="shared" checked hidden>
          <b>Simple<span class="tag">Recommended</span></b>
          <small>Paste your wallet address. Every order gets its own unique amount so payments are matched automatically.</small>
        </label>
        <label class="opt" id="m-hd">
          <input type="radio" name="address_mode" value="hd" hidden>
          <b>Advanced</b>
          <small>Use an extended public key (xpub). A fresh address is generated for every order.</small>
        </label>
      </div>

      <div class="field"><label class="lbl" id="lbl-wallet" for="wallet">Your USDT (TRC20) wallet address</label>
        <input class="in" id="wallet" type="text" name="wallet" value="<?= cg_e(is_string($_POST['wallet'] ?? null) ? $_POST['wallet'] : '') ?>" placeholder="T..." spellcheck="false" required>
        <div class="help" id="hint-wallet">Starts with T and is 34 characters long.</div></div>

      <div class="field"><label class="lbl" for="f-tron">TronGrid API key <span style="font-weight:500;color:var(--ink-3)">(optional, recommended)</span></label>
        <input class="in" id="f-tron" type="text" name="tron_api_key" value="<?= cg_e(is_string($_POST['tron_api_key'] ?? null) ? $_POST['tron_api_key'] : '') ?>" placeholder="Free at trongrid.io" spellcheck="false">
        <div class="help">Lets the gateway check the blockchain more often.</div></div>

      <div class="field"><label class="lbl" for="f-brand">Name shown on the payment page</label>
        <input class="in" id="f-brand" type="text" name="brand_name" value="<?= cg_e(is_string($_POST['brand_name'] ?? null) ? $_POST['brand_name'] : 'CryptoGate') ?>"></div>

      <div class="trust">
        <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="4" y="10" width="16" height="11" rx="2"/><path d="M8 10V7a4 4 0 0 1 8 0v3"/></svg>
        <div>Your private keys are never entered here and never stored on this server. CryptoGate can only watch for incoming payments - it cannot spend.</div>
      </div>

      <button class="btn" type="submit">Install CryptoGate</button>
    </div>
  </form>

  <script>
    (function () {
      var shared = document.getElementById('m-shared');
      var hd     = document.getElementById('m-hd');
      var lbl    = document.getElementById('lbl-wallet');
      var inp    = document.getElementById('wallet');
      var hint   = document.getElementById('hint-wallet');
      function pick(isHd) {
        hd.classList.toggle('sel', isHd);
        shared.classList.toggle('sel', !isHd);
        hd.querySelector('input').checked = isHd;
        shared.querySelector('input').checked = !isHd;
        lbl.textContent  = isHd ? 'Your extended public key (xpub)' : 'Your USDT (TRC20) wallet address';
        inp.placeholder  = isHd ? 'xpub...' : 'T...';
        hint.textContent = isHd ? 'Watch-only. Starts with xpub, about 111 characters.' : 'Starts with T and is 34 characters long.';
      }
      shared.addEventListener('click', function(){ pick(false); });
      hd.addEventListener('click',     function(){ pick(true);  });
    })();
  </script>

<?php else: ?>

  <div class="sheet done">
    <div class="big"><svg width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M20 6 9 17l-5-5"/></svg></div>
    <h2>You're set up</h2>
    <p class="lead">CryptoGate is installed. Sign in to create your first invoice.</p>
    <?php if ($selfLocked): ?>
      <div class="note">The installer has locked itself (renamed to <code>install.php.locked</code>). You can delete that file at any time.</div>
    <?php else: ?>
      <div class="note">Delete <code>install.php</code> from your server now - it's no longer needed.</div>
    <?php endif; ?>
    <a class="btn" href="admin/" style="max-width:320px;margin:22px auto 0">Open dashboard</a>
  </div>

<?php endif; ?>

<?php cg_page_bottom(); ?>
