<?php
/**
 * MailNest — mail.php v1.0
 * ─────────────────────────────────────────────────────────────
 * 1. Upload this file to your server (e.g. mail.yourdomain.com)
 * 2. Visit mail.yourdomain.com/mail.php in your browser
 * 3. Complete the 3-step setup wizard
 * 4. Done — this file becomes your webmail app
 * ─────────────────────────────────────────────────────────────
 * Requirements: PHP 7.4+, MySQL, php-imap extension
 */

// Output buffer so headers always work
ob_start();

define('MN_CFG', __DIR__ . '/mailnest-config.php');
define('MN_VER', '1.0');

// ════════════════════════════════════════════════════════════════════
//  INSTALLER — runs when no config exists
// ════════════════════════════════════════════════════════════════════
if (!file_exists(MN_CFG)) {
    mn_installer();
    ob_end_flush();
    exit;
}

// ════════════════════════════════════════════════════════════════════
//  APP — runs after install
// ════════════════════════════════════════════════════════════════════
require_once MN_CFG;
session_start();

// ── DB ────────────────────────────────────────────────────────────
function db() {
    static $p = null;
    if ($p) return $p;
    $p = new PDO(
        'mysql:host='.DB_HOST.';dbname='.DB_NAME.';charset=utf8mb4',
        DB_USER, DB_PASS,
        [PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE=>PDO::FETCH_ASSOC]
    );
    // ensure reset tokens table exists for older installs
    $p->exec("CREATE TABLE IF NOT EXISTS mn_reset_tokens(
        id INT AUTO_INCREMENT PRIMARY KEY,
        user_id INT NOT NULL, token VARCHAR(100) NOT NULL UNIQUE,
        expires_at BIGINT NOT NULL, used TINYINT DEFAULT 0,
        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
        FOREIGN KEY(user_id) REFERENCES mn_users(id) ON DELETE CASCADE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4");
    return $p;
}

// ── HELPERS ───────────────────────────────────────────────────────
function h($s)       { return htmlspecialchars((string)$s, ENT_QUOTES); }
function me()        { return $_SESSION['u'] ?? null; }
function authed()    { return !empty($_SESSION['u']); }
function isadmin()   { return (me()['role'] ?? '') === 'admin'; }
function url($q='')  {
    $s = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https' : 'http';
    return $s . '://' . $_SERVER['HTTP_HOST'] . $_SERVER['SCRIPT_NAME'] . ($q ? '?' . $q : '');
}
function tok() {
    if (empty($_SESSION['t'])) $_SESSION['t'] = bin2hex(random_bytes(24));
    return $_SESSION['t'];
}
function chktok()    { if (!hash_equals($_SESSION['t'] ?? '', $_POST['t'] ?? '')) { http_response_code(403); die('Invalid token'); } }
function flash($t,$m){ $_SESSION['fl'] = [$t, $m]; }
function popflash()  {
    if (empty($_SESSION['fl'])) return '';
    [$t, $m] = $_SESSION['fl']; unset($_SESSION['fl']);
    $c = $t === 'ok'
        ? 'background:#ecfdf5;color:#065f46;border:1px solid #6ee7b7'
        : 'background:#fef2f2;color:#991b1b;border:1px solid #fca5a5';
    return "<div style='$c;padding:11px 15px;border-radius:8px;margin-bottom:16px;font-size:.875rem'>" . h($m) . "</div>";
}
function imap_ok()   { return function_exists('imap_open'); }
function imap_conn($email, $pass, $folder = 'INBOX') {
    if (!imap_ok()) return false;
    $enc = IMAP_ENC;
    return @imap_open('{' . IMAP_HOST . ':' . IMAP_PORT . '/imap/' . $enc . '/novalidate-cert}' . $folder, $email, $pass);
}

// ── SMTP ──────────────────────────────────────────────────────────
function smtp_io($sock, $cmd = null) {
    if ($cmd !== null) fputs($sock, $cmd . "\r\n");
    $r = '';
    while ($l = fgets($sock, 512)) { $r .= $l; if (substr($l, 3, 1) === ' ') break; }
    return $r;
}
function smtp_send($host, $port, $enc, $fe, $fp, $fn, $recipients, $subj, $html, $domain) {
    $mid  = '<' . uniqid() . '@' . $domain . '>';
    $hdrs = "From: =?UTF-8?B?" . base64_encode($fn) . "?= <$fe>\r\n"
          . "To: " . implode(', ', $recipients) . "\r\n"
          . "Subject: =?UTF-8?B?" . base64_encode($subj) . "?=\r\n"
          . "Date: " . date('r') . "\r\nMessage-ID: $mid\r\n"
          . "MIME-Version: 1.0\r\nContent-Type: text/html; charset=UTF-8\r\nContent-Transfer-Encoding: base64\r\n";
    $msg  = $hdrs . "\r\n" . chunk_split(base64_encode($html));
    $ctx  = stream_context_create(['ssl' => ['verify_peer' => false, 'verify_peer_name' => false]]);
    $sock = $enc === 'ssl'
        ? @stream_socket_client("ssl://$host:$port", $en, $es, 15, STREAM_CLIENT_CONNECT, $ctx)
        : @stream_socket_client("tcp://$host:$port", $en, $es, 15);
    if (!$sock) return ['ok' => false, 'e' => "Cannot connect to $host:$port — $es"];
    smtp_io($sock); smtp_io($sock, "EHLO $domain");
    if ($enc === 'tls') {
        smtp_io($sock, 'STARTTLS');
        stream_socket_enable_crypto($sock, true, STREAM_CRYPTO_METHOD_TLS_CLIENT);
        smtp_io($sock, "EHLO $domain");
    }
    smtp_io($sock, 'AUTH LOGIN');
    smtp_io($sock, base64_encode($fe));
    $ar = smtp_io($sock, base64_encode($fp));
    if (strpos($ar, '235') === false) { fclose($sock); return ['ok' => false, 'e' => "Auth failed: $ar"]; }
    smtp_io($sock, "MAIL FROM:<$fe>");
    foreach ($recipients as $r) smtp_io($sock, "RCPT TO:<$r>");
    smtp_io($sock, 'DATA');
    fputs($sock, $msg . "\r\n.\r\n");
    smtp_io($sock); smtp_io($sock, 'QUIT'); fclose($sock);
    return ['ok' => true];
}
function send_mail($fe, $fp, $fn, $to, $subj, $html, $cc = '', $bcc = '') {
    $arr = array_filter(array_map('trim', [$to]));
    if ($cc)  $arr = array_merge($arr, array_filter(array_map('trim', explode(',', $cc))));
    if ($bcc) $arr = array_merge($arr, array_filter(array_map('trim', explode(',', $bcc))));
    return smtp_send(SMTP_HOST, SMTP_PORT, SMTP_ENC, $fe, $fp, $fn, $arr, $subj, $html, MAIL_DOMAIN);
}
function sys_mail($to, $name, $subj, $body) {
    return smtp_send('mail.aquilainnovations.in', 465, 'ssl',
        'no-reply@aquilainnovations.in', 'N!k!@!~O4M%7sz#R', 'MailNest',
        [$to], $subj, $body, 'aquilainnovations.in');
}

// ── ACTIONS ───────────────────────────────────────────────────────
$pg = $_GET['pg'] ?? 'login';
$ax = $_POST['ax'] ?? '';

if ($ax === 'login') {
    chktok();
    $email = trim($_POST['email'] ?? '');
    $pass  = $_POST['pw'] ?? '';
    $u = db()->prepare("SELECT * FROM mn_users WHERE email=?");
    $u->execute([$email]); $u = $u->fetch();
    if ($u && password_verify($pass, $u['password'])) {
        $_SESSION['u']  = $u;
        $_SESSION['ip'] = base64_decode($u['imap_pass']);
        ob_end_clean();
        header('Location: ' . url('pg=inbox')); exit;
    }
    flash('err', 'Wrong email or password.');
    ob_end_clean();
    header('Location: ' . url('pg=login')); exit;
}
if ($ax === 'logout') {
    session_destroy(); ob_end_clean();
    header('Location: ' . url('pg=login')); exit;
}
if ($ax === 'forgot') {
    $email = trim($_POST['email'] ?? '');
    $u = db()->prepare("SELECT * FROM mn_users WHERE email=?");
    $u->execute([$email]); $u = $u->fetch();
    if ($u) {
        db()->prepare("DELETE FROM mn_reset_tokens WHERE user_id=?")->execute([$u['id']]);
        $tok = bin2hex(random_bytes(24));
        db()->prepare("INSERT INTO mn_reset_tokens(user_id,token,expires_at) VALUES(?,?,?)")
            ->execute([$u['id'], $tok, time() + 3600]);
        $link = url('pg=reset&token=' . $tok);
        sys_mail($u['email'], $u['name'], 'Reset your MailNest password',
            '<body style="font-family:Arial,sans-serif;padding:30px;background:#f5f3ee">
            <div style="max-width:480px;margin:0 auto;background:#fff;border-radius:12px;overflow:hidden">
            <div style="background:#0a0a0f;padding:20px 24px;color:#fff"><strong>✉ MailNest — Password Reset</strong></div>
            <div style="padding:24px"><p>Hi <strong>' . h($u['name']) . '</strong>,</p><br>
            <p style="color:#555;font-size:.9rem;line-height:1.7">Click the button below to reset your password. This link expires in 1 hour.</p><br>
            <a href="' . h($link) . '" style="display:inline-block;background:#ff4d1a;color:#fff;padding:11px 26px;border-radius:7px;font-weight:700;text-decoration:none">Reset Password →</a>
            <br><br><p style="color:#aaa;font-size:.75rem">Or copy: ' . h($link) . '</p>
            </div></div></body>');
    }
    flash('ok', 'If that email exists, a reset link has been sent.');
    ob_end_clean();
    header('Location: ' . url('pg=forgot')); exit;
}
if ($ax === 'doreset') {
    $tok = trim($_POST['token'] ?? '');
    $np  = $_POST['np'] ?? '';
    $cp  = $_POST['cp'] ?? '';
    $r   = db()->prepare("SELECT r.*,u.email FROM mn_reset_tokens r JOIN mn_users u ON u.id=r.user_id WHERE r.token=? AND r.used=0 AND r.expires_at>?");
    $r->execute([$tok, time()]); $r = $r->fetch();
    if (!$r)       { flash('err', 'Link invalid or expired.'); ob_end_clean(); header('Location: ' . url('pg=forgot')); exit; }
    if (strlen($np) < 8) { flash('err', 'Min 8 chars.'); ob_end_clean(); header('Location: ' . url('pg=reset&token=' . urlencode($tok))); exit; }
    if ($np !== $cp)     { flash('err', 'Passwords do not match.'); ob_end_clean(); header('Location: ' . url('pg=reset&token=' . urlencode($tok))); exit; }
    db()->prepare("UPDATE mn_users SET password=?,imap_pass=? WHERE id=?")->execute([password_hash($np, PASSWORD_BCRYPT), base64_encode($np), $r['user_id']]);
    db()->prepare("UPDATE mn_reset_tokens SET used=1 WHERE token=?")->execute([$tok]);
    flash('ok', 'Password updated. Please log in.');
    ob_end_clean();
    header('Location: ' . url('pg=login')); exit;
}
if ($ax === 'send') {
    if (!authed()) { ob_end_clean(); header('Location: ' . url('pg=login')); exit; }
    chktok();
    $u  = me(); $ip = $_SESSION['ip'] ?? base64_decode($u['imap_pass']);
    $r  = send_mail($u['email'], $ip, $u['name'], trim($_POST['to'] ?? ''), trim($_POST['subj'] ?? ''), $_POST['body'] ?? '', trim($_POST['cc'] ?? ''), trim($_POST['bcc'] ?? ''));
    flash($r['ok'] ? 'ok' : 'err', $r['ok'] ? 'Sent!' : 'Failed: ' . ($r['e'] ?? ''));
    ob_end_clean();
    header('Location: ' . url('pg=sent')); exit;
}
if ($ax === 'save_contact') {
    if (!authed()) { ob_end_clean(); header('Location: ' . url('pg=login')); exit; }
    chktok();
    $u = me(); $id = intval($_POST['cid'] ?? 0);
    $n = trim($_POST['name'] ?? ''); $e = trim($_POST['email'] ?? '');
    $ph = trim($_POST['phone'] ?? ''); $no = trim($_POST['notes'] ?? '');
    if ($id) db()->prepare("UPDATE mn_contacts SET name=?,email=?,phone=?,notes=? WHERE id=? AND user_id=?")->execute([$n,$e,$ph,$no,$id,$u['id']]);
    else     db()->prepare("INSERT INTO mn_contacts(user_id,name,email,phone,notes) VALUES(?,?,?,?,?)")->execute([$u['id'],$n,$e,$ph,$no]);
    flash('ok', 'Contact saved.');
    ob_end_clean();
    header('Location: ' . url('pg=contacts')); exit;
}
if ($ax === 'del_contact') {
    if (!authed()) { ob_end_clean(); header('Location: ' . url('pg=login')); exit; }
    chktok();
    db()->prepare("DELETE FROM mn_contacts WHERE id=? AND user_id=?")->execute([intval($_POST['cid'] ?? 0), me()['id']]);
    ob_end_clean();
    header('Location: ' . url('pg=contacts')); exit;
}
if ($ax === 'adduser') {
    if (!isadmin()) { ob_end_clean(); header('Location: ' . url('pg=inbox')); exit; }
    chktok();
    $n = trim($_POST['name'] ?? ''); $e = trim($_POST['email'] ?? '');
    $p = $_POST['pw'] ?? ''; $role = ($_POST['role'] ?? '') === 'admin' ? 'admin' : 'user';
    $sw = !empty($_POST['sw']);
    if (strlen($p) < 6) { flash('err', 'Password min 6 chars.'); ob_end_clean(); header('Location: ' . url('pg=admin')); exit; }
    try {
        db()->prepare("INSERT INTO mn_users(name,email,password,role,imap_pass) VALUES(?,?,?,?,?)")
            ->execute([$n, $e, password_hash($p, PASSWORD_BCRYPT), $role, base64_encode($p)]);
        if ($sw) {
            $lurl = url('pg=login');
            sys_mail($e, $n, 'Your MailNest account is ready',
                '<body style="font-family:Arial,sans-serif;padding:30px;background:#f5f3ee">
                <div style="max-width:480px;margin:0 auto;background:#fff;border-radius:12px;overflow:hidden">
                <div style="background:#0a0a0f;padding:20px 24px;color:#fff"><strong>✉ MailNest — Account Created</strong></div>
                <div style="padding:24px"><p>Hi <strong>' . h($n) . '</strong>,</p><br>
                <div style="background:#f9f8f5;border-radius:8px;padding:14px;margin:14px 0;font-size:.9rem;line-height:1.8">
                <strong>Login URL:</strong> <a href="' . h($lurl) . '" style="color:#3b82f6">' . h($lurl) . '</a><br>
                <strong>Email:</strong> ' . h($e) . '<br>
                <strong>Password:</strong> <code style="background:#e8f0fe;padding:2px 6px;border-radius:4px">' . h($p) . '</code>
                </div>
                <a href="' . h($lurl) . '" style="display:inline-block;background:#ff4d1a;color:#fff;padding:11px 26px;border-radius:7px;font-weight:700;text-decoration:none">Login Now →</a>
                <p style="color:#bbb;font-size:.75rem;margin-top:14px">Please change your password after first login.</p>
                </div></div></body>');
        }
        flash('ok', 'User created' . ($sw ? ' — welcome email sent' : '') . '!');
    } catch (Exception $ex) { flash('err', $ex->getMessage()); }
    ob_end_clean();
    header('Location: ' . url('pg=admin')); exit;
}
if ($ax === 'deluser') {
    if (!isadmin()) { ob_end_clean(); header('Location: ' . url('pg=inbox')); exit; }
    chktok();
    $id = intval($_POST['uid'] ?? 0);
    if ($id !== me()['id']) db()->prepare("DELETE FROM mn_users WHERE id=?")->execute([$id]);
    flash('ok', 'User deleted.');
    ob_end_clean();
    header('Location: ' . url('pg=admin')); exit;
}
if ($ax === 'resetpw') {
    if (!isadmin()) { ob_end_clean(); header('Location: ' . url('pg=inbox')); exit; }
    chktok();
    $id = intval($_POST['uid'] ?? 0); $p = $_POST['pw'] ?? '';
    if (strlen($p) < 6) { flash('err', 'Min 6 chars.'); ob_end_clean(); header('Location: ' . url('pg=admin')); exit; }
    db()->prepare("UPDATE mn_users SET password=?,imap_pass=? WHERE id=?")->execute([password_hash($p, PASSWORD_BCRYPT), base64_encode($p), $id]);
    flash('ok', 'Password reset.');
    ob_end_clean();
    header('Location: ' . url('pg=admin')); exit;
}

// ── PAGE GUARD ────────────────────────────────────────────────────
if (!authed() && !in_array($pg, ['login', 'forgot', 'reset'])) {
    ob_end_clean();
    header('Location: ' . url('pg=login')); exit;
}
if ($pg === 'admin' && !isadmin()) {
    ob_end_clean();
    header('Location: ' . url('pg=inbox')); exit;
}

// ── PAGES ─────────────────────────────────────────────────────────
switch ($pg) {
    case 'login':    pg_login(); break;
    case 'forgot':   pg_forgot(); break;
    case 'reset':    pg_reset(); break;
    case 'inbox':    pg_inbox('INBOX'); break;
    case 'sent':     pg_inbox('Sent'); break;
    case 'drafts':   pg_inbox('Drafts'); break;
    case 'trash':    pg_inbox('Trash'); break;
    case 'view':     pg_view(); break;
    case 'compose':  pg_compose(); break;
    case 'contacts': pg_contacts(); break;
    case 'admin':    pg_admin(); break;
    default: ob_end_clean(); header('Location: ' . url('pg=login')); exit;
}
ob_end_flush();
exit;

// ════════════════════════════════════════════════════════════════════
//  SHARED LAYOUT
// ════════════════════════════════════════════════════════════════════
function head($t = 'MailNest') { ?>
<!DOCTYPE html><html lang="en"><head>
<meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title><?=h($t)?> — MailNest</title>
<link rel="icon" type="image/x-icon" href="https://aquilainnovations.in/logo.ico">
<link href="https://fonts.googleapis.com/css2?family=Bebas+Neue&family=DM+Sans:wght@400;500;600&display=swap" rel="stylesheet">
<style>
:root{--bg:#f5f3ee;--w:#fff;--ac:#ff4d1a;--bl:#3b82f6;--ink:#0a0a0f;--mu:#6b6b78;--br:#e2e0d8;--sw:220px}
*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
body{font-family:'DM Sans',sans-serif;background:var(--bg);color:var(--ink);display:flex;min-height:100vh;font-size:14px;-webkit-font-smoothing:antialiased}
a{text-decoration:none;color:inherit}
input,textarea,select,button{font-family:inherit;font-size:14px}
.sb{width:var(--sw);background:var(--w);border-right:1px solid var(--br);position:fixed;top:0;left:0;height:100vh;display:flex;flex-direction:column;overflow-y:auto;z-index:10}
.sb-logo{padding:18px 16px 14px;font-family:'Bebas Neue',sans-serif;font-size:1.2rem;letter-spacing:.06em;border-bottom:1px solid var(--br);display:flex;align-items:center;gap:8px}
.sb-lm{width:24px;height:24px;border-radius:5px;background:var(--ac);display:flex;align-items:center;justify-content:center;font-size:.75rem;color:#fff;flex-shrink:0}
.sb-comp{margin:12px 10px;background:var(--ink);color:#fff;border-radius:8px;padding:9px;font-weight:700;font-size:.83rem;text-align:center;display:block;transition:.15s}
.sb-comp:hover{background:var(--ac)}
.sb-sec{padding:9px 16px 3px;font-size:.65rem;font-weight:700;letter-spacing:.1em;text-transform:uppercase;color:var(--mu)}
.sb-a{display:flex;align-items:center;gap:9px;padding:8px 16px;font-size:.83rem;color:#555;border-left:3px solid transparent;transition:.12s}
.sb-a:hover{background:#f8f7f4;color:var(--ink)}
.sb-a.on{background:#fff4f2;color:var(--ac);border-left-color:var(--ac);font-weight:600}
.sb-usr{margin-top:auto;padding:12px 14px;border-top:1px solid var(--br);display:flex;align-items:center;gap:9px}
.sb-av{width:32px;height:32px;border-radius:50%;background:var(--ac);color:#fff;display:flex;align-items:center;justify-content:center;font-weight:700;font-size:.8rem;flex-shrink:0}
.sb-ui{flex:1;min-width:0}
.sb-un{font-weight:600;font-size:.8rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.sb-ue{font-size:.7rem;color:var(--mu);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.sb-out{font-size:.7rem;color:var(--mu);padding:3px 7px;border:1px solid var(--br);border-radius:4px;cursor:pointer;background:none;transition:.12s}
.sb-out:hover{color:#dc2626;border-color:#dc2626}
.main{margin-left:var(--sw);flex:1;display:flex;flex-direction:column;min-height:100vh}
.tb{background:var(--w);border-bottom:1px solid var(--br);padding:13px 22px;display:flex;align-items:center;gap:12px}
.tb-t{font-family:'Bebas Neue',sans-serif;font-size:1.05rem;letter-spacing:.04em}
.srch{flex:1;max-width:360px;position:relative}
.srch input{width:100%;padding:7px 11px 7px 32px;border:1px solid var(--br);border-radius:7px;background:#f9f8f5;font-size:.83rem}
.srch input:focus{outline:none;border-color:var(--bl)}
.srch-ic{position:absolute;left:9px;top:50%;transform:translateY(-50%);opacity:.4;font-size:.83rem}
.cnt{padding:20px 22px;flex:1}
.btn{display:inline-flex;align-items:center;gap:5px;padding:7px 14px;border-radius:7px;font-size:.83rem;font-weight:600;cursor:pointer;border:none;transition:.15s;text-decoration:none}
.btn-sm{padding:5px 10px;font-size:.76rem}
.bp{background:var(--ink);color:#fff}.bp:hover{background:var(--ac)}
.bs{background:#f0efe9;color:var(--ink)}.bs:hover{background:#e5e4de}
.bd{background:#fef2f2;color:#dc2626;border:1px solid #fca5a5}
.card{background:var(--w);border:1px solid var(--br);border-radius:10px;overflow:hidden}
.card-hd{padding:13px 17px;border-bottom:1px solid var(--br);font-family:'Bebas Neue',sans-serif;font-size:.95rem;letter-spacing:.04em;display:flex;align-items:center;justify-content:space-between}
.fg{margin-bottom:13px}
.fl{display:block;font-weight:600;font-size:.8rem;margin-bottom:4px}
.fc{width:100%;padding:8px 10px;border:1.5px solid var(--br);border-radius:7px;transition:.15s;background:#fff}
.fc:focus{outline:none;border-color:var(--bl)}
.fr2{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.el{list-style:none}
.ei{display:grid;grid-template-columns:38px 1fr auto;gap:9px;align-items:center;padding:12px 17px;border-bottom:1px solid #f5f5f3;cursor:pointer;transition:.12s}
.ei:hover{background:#fafaf8}
.ei.u .ef{font-weight:700;color:var(--ink)}.ei.u .es{color:#555}
.eav{width:34px;height:34px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-weight:700;font-size:.78rem;color:#fff;flex-shrink:0}
.ef{font-size:.83rem;font-weight:500;color:#666}
.es{font-size:.78rem;color:#aaa;margin-top:1px}
.et{font-size:.7rem;color:#ccc}
.ed{width:7px;height:7px;border-radius:50%;background:var(--bl);margin-top:2px}
.empty{text-align:center;padding:56px 20px;color:var(--mu)}
.modal{display:none;position:fixed;inset:0;background:rgba(0,0,0,.45);z-index:100;align-items:center;justify-content:center;backdrop-filter:blur(3px)}
.modal.open{display:flex}
.mbox{background:#fff;border-radius:12px;padding:24px;width:90%;max-width:460px;max-height:90vh;overflow-y:auto;position:relative}
.mt{font-family:'Bebas Neue',sans-serif;font-size:1rem;letter-spacing:.04em;margin-bottom:16px}
.mx{position:absolute;top:12px;right:13px;background:none;border:none;font-size:1.2rem;cursor:pointer;color:var(--mu)}
table{width:100%;border-collapse:collapse}
th{text-align:left;padding:9px 12px;font-size:.72rem;font-weight:700;letter-spacing:.07em;text-transform:uppercase;color:var(--mu);border-bottom:2px solid var(--br)}
td{padding:10px 12px;border-bottom:1px solid #f5f5f3;font-size:.85rem;vertical-align:middle}
.badge{display:inline-block;padding:2px 8px;border-radius:100px;font-size:.7rem;font-weight:700}
.ba{background:#fff7ed;color:#c2410c}.bu{background:#f0fdf4;color:#166534}
.stat-card{background:var(--w);border:1px solid var(--br);border-radius:10px;padding:18px;text-align:center}
.stat-n{font-family:'Bebas Neue',sans-serif;font-size:1.9rem;letter-spacing:.04em}
.stat-l{font-size:.82rem;color:var(--mu);margin-top:2px}
.warn{background:#fffbeb;border:1px solid #fcd34d;border-radius:8px;padding:13px 15px;margin-bottom:18px;font-size:.84rem;color:#78350f;line-height:1.65}
.info{background:#eff6ff;border:1px solid #bfdbfe;border-radius:8px;padding:13px 15px;margin-bottom:18px;font-size:.82rem;color:#1e3a8a;line-height:1.65}
</style>
</head><body>
<?php }

function sidebar($on = '') {
    $u = me(); $init = strtoupper(substr($u['name'] ?? 'U', 0, 2)); ?>
    <div class="sb">
      <div class="sb-logo"><div class="sb-lm">✉</div>MAILNEST</div>
      <a href="<?=url('pg=compose')?>" class="sb-comp">✏ Compose</a>
      <div class="sb-sec">Mail</div>
      <a href="<?=url('pg=inbox')?>"   class="sb-a <?=$on==='inbox'?'on':''?>">📥 Inbox</a>
      <a href="<?=url('pg=sent')?>"    class="sb-a <?=$on==='sent'?'on':''?>">📤 Sent</a>
      <a href="<?=url('pg=drafts')?>"  class="sb-a <?=$on==='drafts'?'on':''?>">📝 Drafts</a>
      <a href="<?=url('pg=trash')?>"   class="sb-a <?=$on==='trash'?'on':''?>">🗑 Trash</a>
      <div class="sb-sec">Manage</div>
      <a href="<?=url('pg=contacts')?>" class="sb-a <?=$on==='contacts'?'on':''?>">👤 Contacts</a>
      <?php if (isadmin()): ?>
      <a href="<?=url('pg=admin')?>" class="sb-a <?=$on==='admin'?'on':''?>">🛡 Admin</a>
      <?php endif; ?>
      <div class="sb-usr">
        <div class="sb-av"><?=h($init)?></div>
        <div class="sb-ui">
          <div class="sb-un"><?=h($u['name'] ?? '')?></div>
          <div class="sb-ue"><?=h($u['email'] ?? '')?></div>
        </div>
        <form method="POST" action="" style="margin:0">
          <input type="hidden" name="ax" value="logout">
          <input type="hidden" name="t"  value="<?=tok()?>">
          <button type="submit" class="sb-out">Out</button>
        </form>
      </div>
    </div>
<?php }

// ── AUTH PAGES ────────────────────────────────────────────────────
function auth_wrap($sub) { ?>
    <style>body{background:linear-gradient(135deg,#0a0a0f,#1a0800);align-items:center;justify-content:center}
    .ab{background:#fff;border-radius:14px;padding:36px;width:100%;max-width:380px;box-shadow:0 24px 60px rgba(0,0,0,.3)}
    .al{font-family:'Bebas Neue',sans-serif;font-size:1.4rem;letter-spacing:.06em;text-align:center;margin-bottom:4px;display:flex;align-items:center;justify-content:center;gap:8px}
    .alm{width:26px;height:26px;border-radius:5px;background:#ff4d1a;display:flex;align-items:center;justify-content:center;font-size:.8rem;color:#fff}
    .as{text-align:center;color:#6b6b78;font-size:.84rem;margin-bottom:22px;line-height:1.6}
    </style>
    <div class="ab"><div class="al"><div class="alm">✉</div>MAILNEST</div>
    <div class="as"><?=h($sub)?></div>
<?php }

function pg_login() {
    head('Login'); auth_wrap('Sign in to your account');
    echo popflash(); ?>
    <form method="POST" action="">
      <input type="hidden" name="ax" value="login">
      <input type="hidden" name="t"  value="<?=tok()?>">
      <div class="fg"><label class="fl">Email</label><input type="email" name="email" class="fc" required autofocus placeholder="you@domain.com"></div>
      <div class="fg"><label class="fl">Password</label><input type="password" name="pw" class="fc" required placeholder="••••••••"></div>
      <button type="submit" class="btn bp" style="width:100%;justify-content:center;padding:10px;font-size:.92rem">Sign In →</button>
    </form>
    <div style="text-align:center;margin-top:14px">
      <a href="<?=url('pg=forgot')?>" style="font-size:.8rem;color:#6b6b78;text-decoration:underline">Forgot password?</a>
    </div>
    </div></body></html>
<?php }

function pg_forgot() {
    head('Forgot Password'); auth_wrap('Enter your email to receive a reset link.');
    echo popflash(); ?>
    <form method="POST" action="">
      <input type="hidden" name="ax" value="forgot">
      <div class="fg"><label class="fl">Email Address</label><input type="email" name="email" class="fc" required autofocus></div>
      <button type="submit" class="btn bp" style="width:100%;justify-content:center;padding:10px">Send Reset Link →</button>
    </form>
    <div style="text-align:center;margin-top:14px"><a href="<?=url('pg=login')?>" style="font-size:.8rem;color:#6b6b78;text-decoration:underline">← Back to Login</a></div>
    </div></body></html>
<?php }

function pg_reset() {
    $tok = trim($_GET['token'] ?? ''); $row = null;
    if ($tok) {
        $r = db()->prepare("SELECT r.*,u.email FROM mn_reset_tokens r JOIN mn_users u ON u.id=r.user_id WHERE r.token=? AND r.used=0 AND r.expires_at>?");
        $r->execute([$tok, time()]); $row = $r->fetch();
    }
    head('Reset Password'); auth_wrap('Set a new password.');
    echo popflash();
    if (!$row) { ?>
      <div style="text-align:center;color:#991b1b;margin-bottom:16px;font-size:.84rem">Link is <strong>invalid or expired</strong>.</div>
      <a href="<?=url('pg=forgot')?>" class="btn bp" style="width:100%;justify-content:center;padding:10px;text-decoration:none;display:flex">Request New Link →</a>
    <?php } else { ?>
      <div style="font-size:.82rem;color:#6b6b78;margin-bottom:14px">For: <strong><?=h($row['email'])?></strong></div>
      <form method="POST" action="">
        <input type="hidden" name="ax" value="doreset">
        <input type="hidden" name="token" value="<?=h($tok)?>">
        <div class="fg"><label class="fl">New Password (min 8)</label><input type="password" name="np" class="fc" required minlength="8" autofocus></div>
        <div class="fg"><label class="fl">Confirm</label><input type="password" name="cp" class="fc" required minlength="8"></div>
        <button type="submit" class="btn bp" style="width:100%;justify-content:center;padding:10px">Set Password ✓</button>
      </form>
    <?php } ?>
    <div style="text-align:center;margin-top:14px"><a href="<?=url('pg=login')?>" style="font-size:.8rem;color:#6b6b78;text-decoration:underline">← Back to Login</a></div>
    </div></body></html>
<?php }

// ── INBOX ─────────────────────────────────────────────────────────
function pg_inbox($folder = 'INBOX') {
    $u = me(); $ip = $_SESSION['ip'] ?? base64_decode($u['imap_pass']);
    $emails = []; $err = '';
    if (!imap_ok()) {
        $err = 'PHP IMAP extension not enabled. Go to cPanel → Select PHP Version → Extensions → tick imap → Save.';
    } else {
        $imap = imap_conn($u['email'], $ip, $folder);
        if (!$imap) {
            $err = 'Cannot connect to mail server. Check IMAP settings in Admin Panel.';
        } else {
            $n = imap_num_msg($imap);
            if ($n > 0) {
                $ov = imap_fetch_overview($imap, max(1, $n - 49) . ":$n", 0);
                foreach (array_reverse($ov) as $m) {
                    $from = '';
                    if (!empty($m->from)) {
                        if (preg_match('/^(.*?)\s*<[^>]+>$/', $m->from, $mx)) $from = trim($mx[1], ' "\'');
                        if (!$from) $from = $m->from;
                        if (function_exists('imap_utf8')) $from = @imap_utf8($from);
                    }
                    $subj = !empty($m->subject) ? (function_exists('imap_utf8') ? @imap_utf8($m->subject) : $m->subject) : '(no subject)';
                    $emails[] = ['uid' => $m->uid, 'from' => $from ?: 'Unknown', 'subj' => $subj,
                                 'date' => !empty($m->date) ? date('M j', strtotime($m->date)) : '', 'unread' => !$m->seen];
                }
            }
            imap_close($imap);
        }
    }
    $map = ['INBOX' => 'inbox', 'Sent' => 'sent', 'Drafts' => 'drafts', 'Trash' => 'trash'];
    $on = $map[$folder] ?? 'inbox';
    $cols = ['#ff4d1a', '#3b82f6', '#059669', '#7c3aed', '#ea580c', '#0284c7'];
    head($folder); sidebar($on); ?>
    <div class="main">
      <div class="tb">
        <div class="tb-t"><?=h($folder)?></div>
        <div class="srch"><span class="srch-ic">🔍</span><input type="text" placeholder="Search..." oninput="flt(this.value)"></div>
        <a href="<?=url('pg=compose')?>" class="btn bp btn-sm">✏ Compose</a>
      </div>
      <div class="cnt">
        <?php if ($err) echo "<div class='warn'>⚠️ " . h($err) . "</div>"; ?>
        <?=popflash()?>
        <div class="card">
          <ul class="el" id="ml">
          <?php if (empty($emails)): ?>
            <li><div class="empty">📭 No emails here</div></li>
          <?php else: foreach ($emails as $em):
            $col = $cols[abs(crc32($em['from'])) % count($cols)];
            $init = strtoupper(substr($em['from'], 0, 2)); ?>
            <li class="ei <?=$em['unread'] ? 'u' : ''?>" data-f="<?=h(strtolower($em['from']))?>" data-s="<?=h(strtolower($em['subj']))?>">
              <a href="<?=url('pg=view&folder=' . urlencode($folder) . '&uid=' . $em['uid'])?>" style="display:contents">
                <div class="eav" style="background:<?=$col?>"><?=h($init)?></div>
                <div><div class="ef"><?=h($em['from'])?></div><div class="es"><?=h($em['subj'])?></div></div>
                <div style="display:flex;flex-direction:column;align-items:flex-end;gap:3px">
                  <span class="et"><?=h($em['date'])?></span>
                  <?php if ($em['unread']): ?><div class="ed"></div><?php endif; ?>
                </div>
              </a>
            </li>
          <?php endforeach; endif; ?>
          </ul>
        </div>
      </div>
    </div>
    <script>function flt(q){q=q.toLowerCase();document.querySelectorAll('#ml .ei').forEach(e=>{e.style.display=(e.dataset.f.includes(q)||e.dataset.s.includes(q))?'':'none'})}</script>
    </body></html>
<?php }

// ── VIEW EMAIL ────────────────────────────────────────────────────
function parse_email_body($imap, $mn, $st, $pn = '') {
    if ($st->type === 1 && !empty($st->parts)) {
        $html = ''; $txt = '';
        foreach ($st->parts as $i => $p) {
            $r = parse_email_body($imap, $mn, $p, $pn ? $pn . '.' . ($i + 1) : ($i + 1));
            $html .= $r['html']; $txt .= $r['txt'];
        }
        return ['html' => $html, 'txt' => $txt];
    }
    $d = $pn ? imap_fetchbody($imap, $mn, $pn) : imap_body($imap, $mn);
    $enc = $st->encoding ?? 0;
    if ($enc == 3) $d = base64_decode($d);
    elseif ($enc == 4) $d = quoted_printable_decode($d);
    $cs = 'UTF-8';
    if (!empty($st->parameters)) foreach ($st->parameters as $pm) if (strtolower($pm->attribute) === 'charset') { $cs = strtoupper($pm->value); break; }
    if ($cs !== 'UTF-8' && $cs !== '' && function_exists('mb_convert_encoding')) $d = @mb_convert_encoding($d, 'UTF-8', $cs) ?: $d;
    $sub = strtolower($st->subtype ?? '');
    if ($sub === 'html') {
        $d = preg_replace(['/<html[^>]*>/i','/<\/html>/i','/<head[^>]*>.*?<\/head>/is','/<body[^>]*>/i','/<\/body>/i'], '', $d);
        return ['html' => $d, 'txt' => ''];
    }
    return ['html' => '', 'txt' => '<pre style="white-space:pre-wrap;font-size:.88rem">' . htmlspecialchars($d) . '</pre>'];
}

function pg_view() {
    $u = me(); $ip = $_SESSION['ip'] ?? base64_decode($u['imap_pass']);
    $folder = $_GET['folder'] ?? 'INBOX'; $uid = intval($_GET['uid'] ?? 0);
    $from = $subj = $date = $body = $faddr = ''; $err = '';
    if (!imap_ok()) { $err = 'PHP IMAP extension not enabled.'; }
    elseif (!$uid)  { $err = 'No message selected.'; }
    else {
        $imap = imap_conn($u['email'], $ip, $folder);
        if (!$imap) { $err = 'Cannot connect to mail server.'; }
        else {
            $mn = imap_msgno($imap, $uid);
            if (!$mn) { $err = 'Message not found.'; }
            else {
                @imap_setflag_full($imap, (string)$uid, '\\Seen', ST_UID);
                $hdr = imap_headerinfo($imap, $mn);
                if (!empty($hdr->from[0])) {
                    $per = $hdr->from[0]->personal ?? ''; $mb = $hdr->from[0]->mailbox ?? ''; $ho = $hdr->from[0]->host ?? '';
                    $from = $per ? @imap_utf8($per) : "$mb@$ho"; $faddr = "$mb@$ho";
                }
                $subj = !empty($hdr->subject) ? @imap_utf8($hdr->subject) : '(no subject)';
                $date = !empty($hdr->date) ? date('D, M j Y g:i A', strtotime($hdr->date)) : '';
                $r = parse_email_body($imap, $mn, imap_fetchstructure($imap, $mn));
                $body = $r['html'] ?: $r['txt'];
                if (trim($body) === '') { $raw = imap_body($imap, $mn); if ($hdr->encoding ?? 0 == 3) $raw = base64_decode($raw); $body = '<pre style="white-space:pre-wrap">' . htmlspecialchars($raw) . '</pre>'; }
            }
            imap_close($imap);
        }
    }
    $back = strtolower($folder) === 'inbox' ? 'inbox' : 'sent';
    head($subj ?: 'Email'); sidebar($back); ?>
    <div class="main">
      <div class="tb">
        <a href="<?=url('pg=' . $back)?>" class="btn bs btn-sm">← Back</a>
        <div class="tb-t" style="flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap"><?=h(mb_substr($subj ?: $err, 0, 55))?></div>
      </div>
      <div class="cnt">
        <?php if ($err): ?><div class="warn">⚠️ <?=h($err)?></div>
        <?php else: ?>
        <div class="card">
          <div style="padding:20px 22px">
            <div style="font-family:'Bebas Neue',sans-serif;font-size:1.3rem;letter-spacing:.02em;margin-bottom:14px;line-height:1.2"><?=h($subj)?></div>
            <div style="display:flex;align-items:center;gap:11px;padding:12px 0;border-top:1px solid var(--br);border-bottom:1px solid var(--br);margin-bottom:20px;flex-wrap:wrap">
              <div class="eav" style="width:38px;height:38px;background:var(--bl);font-size:.85rem;flex-shrink:0"><?=strtoupper(substr($from ?: '?', 0, 2))?></div>
              <div style="flex:1;min-width:0">
                <div style="font-weight:700;font-size:.88rem"><?=h($from)?><?php if($faddr) echo ' <span style="color:var(--mu);font-weight:400">&lt;' . h($faddr) . '&gt;</span>'; ?></div>
                <div style="font-size:.76rem;color:var(--mu);margin-top:2px"><?=h($date)?></div>
              </div>
              <div style="display:flex;gap:7px">
                <a href="<?=url('pg=compose&to=' . urlencode($faddr) . '&subj=' . urlencode('Re: ' . $subj))?>" class="btn bs btn-sm">&#x21A9; Reply</a>
                <a href="<?=url('pg=compose&subj=' . urlencode('Fwd: ' . $subj))?>" class="btn bs btn-sm">&#x2192; Fwd</a>
              </div>
            </div>
            <?php
            $iframe_html = '<!DOCTYPE html><html><head><meta charset="UTF-8">'
                . '<style>body{font-family:Arial,sans-serif;font-size:14px;line-height:1.7;'
                . 'color:#222;padding:4px;margin:0;word-break:break-word}'
                . 'img{max-width:100%;height:auto}a{color:#3b82f6}table{max-width:100%}'
                . '</style></head><body>' . $body . '</body></html>';
            $iframe_src = htmlspecialchars($iframe_html, ENT_QUOTES);
            ?>
            <iframe style="width:100%;border:none;min-height:400px;display:block"
              srcdoc="<?=$iframe_src?>"
              onload="this.style.height=(this.contentWindow.document.body.scrollHeight+20)+'px'">
            </iframe>
          </div>
        </div>
        <?php endif; ?>
      </div>
    </div></body></html>
<?php }

// ── COMPOSE ───────────────────────────────────────────────────────
function pg_compose() {
    $u = me(); $to = h($_GET['to'] ?? ''); $subj = h($_GET['subj'] ?? '');
    $cs = db()->prepare("SELECT name,email FROM mn_contacts WHERE user_id=? ORDER BY name"); $cs->execute([$u['id']]); $cs = $cs->fetchAll();
    head('Compose'); sidebar(); ?>
    <div class="main">
      <div class="tb"><div class="tb-t">NEW MESSAGE</div></div>
      <div class="cnt">
        <?=popflash()?>
        <div class="card"><div style="padding:20px 22px">
          <form method="POST" action="">
            <input type="hidden" name="ax" value="send"><input type="hidden" name="t" value="<?=tok()?>">
            <div class="fg"><label class="fl">To</label>
              <input type="text" name="to" class="fc" value="<?=$to?>" required list="cl" autocomplete="off">
              <datalist id="cl"><?php foreach ($cs as $c): ?><option value="<?=h($c['email'])?>"><?=h($c['name'])?></option><?php endforeach; ?></datalist>
            </div>
            <div class="fr2">
              <div class="fg"><label class="fl">CC</label><input type="text" name="cc" class="fc"></div>
              <div class="fg"><label class="fl">BCC</label><input type="text" name="bcc" class="fc"></div>
            </div>
            <div class="fg"><label class="fl">Subject</label><input type="text" name="subj" class="fc" value="<?=$subj?>" required></div>
            <div class="fg"><label class="fl">Message</label><textarea name="body" class="fc" style="min-height:260px;resize:vertical"></textarea></div>
            <div style="display:flex;gap:9px">
              <button type="submit" class="btn bp">📤 Send</button>
              <a href="<?=url('pg=inbox')?>" class="btn bs">Cancel</a>
            </div>
          </form>
        </div></div>
      </div>
    </div></body></html>
<?php }

// ── CONTACTS ──────────────────────────────────────────────────────
function pg_contacts() {
    $u = me(); $cs = db()->prepare("SELECT * FROM mn_contacts WHERE user_id=? ORDER BY name"); $cs->execute([$u['id']]); $cs = $cs->fetchAll();
    $cols = ['#ff4d1a', '#3b82f6', '#059669', '#7c3aed', '#ea580c', '#0284c7'];
    head('Contacts'); sidebar('contacts'); ?>
    <div class="main">
      <div class="tb"><div class="tb-t">CONTACTS</div><button class="btn bp btn-sm" onclick="oM('am')">+ Add</button></div>
      <div class="cnt">
        <?=popflash()?>
        <?php if (empty($cs)): ?><div class="empty">👤 No contacts yet</div>
        <?php else: ?>
        <div style="display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:14px">
          <?php foreach ($cs as $c):
            $col = $cols[abs(crc32($c['email'])) % count($cols)];
            $in = strtoupper(substr($c['name'] ?: $c['email'], 0, 2)); ?>
          <div style="background:#fff;border:1px solid var(--br);border-radius:10px;padding:18px">
            <div class="eav" style="width:44px;height:44px;background:<?=$col?>;font-size:.95rem;margin-bottom:10px"><?=h($in)?></div>
            <div style="font-weight:700;margin-bottom:3px"><?=h($c['name'] ?: '—')?></div>
            <div style="font-size:.8rem;color:var(--mu)"><?=h($c['email'])?></div>
            <?php if ($c['phone']): ?><div style="font-size:.76rem;color:var(--mu);margin-top:3px">📞 <?=h($c['phone'])?></div><?php endif; ?>
            <div style="display:flex;gap:6px;margin-top:11px">
              <a href="<?=url('pg=compose&to=' . urlencode($c['email']))?>" class="btn bs btn-sm">✉</a>
              <button class="btn bs btn-sm" onclick='oEdit(<?=json_encode($c)?>)'>Edit</button>
              <form method="POST" action="" style="margin:0" onsubmit="return confirm('Delete?')">
                <input type="hidden" name="ax" value="del_contact"><input type="hidden" name="t" value="<?=tok()?>"><input type="hidden" name="cid" value="<?=$c['id']?>">
                <button class="btn bd btn-sm">✕</button>
              </form>
            </div>
          </div>
          <?php endforeach; ?>
        </div>
        <?php endif; ?>
      </div>
    </div>
    <div class="modal" id="am" onclick="if(event.target===this)cM('am')"><div class="mbox"><button class="mx" onclick="cM('am')">✕</button><div class="mt">ADD CONTACT</div>
    <form method="POST" action=""><input type="hidden" name="ax" value="save_contact"><input type="hidden" name="t" value="<?=tok()?>"><input type="hidden" name="cid" value="0">
    <div class="fg"><label class="fl">Name</label><input type="text" name="name" class="fc"></div>
    <div class="fg"><label class="fl">Email *</label><input type="email" name="email" class="fc" required></div>
    <div class="fg"><label class="fl">Phone</label><input type="text" name="phone" class="fc"></div>
    <div class="fg"><label class="fl">Notes</label><textarea name="notes" class="fc" style="min-height:70px"></textarea></div>
    <button type="submit" class="btn bp">Save</button></form></div></div>
    <div class="modal" id="em" onclick="if(event.target===this)cM('em')"><div class="mbox"><button class="mx" onclick="cM('em')">✕</button><div class="mt">EDIT CONTACT</div>
    <form method="POST" action=""><input type="hidden" name="ax" value="save_contact"><input type="hidden" name="t" value="<?=tok()?>"><input type="hidden" name="cid" id="ecid">
    <div class="fg"><label class="fl">Name</label><input type="text" name="name" id="en" class="fc"></div>
    <div class="fg"><label class="fl">Email *</label><input type="email" name="email" id="ee" class="fc" required></div>
    <div class="fg"><label class="fl">Phone</label><input type="text" name="phone" id="ep" class="fc"></div>
    <div class="fg"><label class="fl">Notes</label><textarea name="notes" id="eno" class="fc" style="min-height:70px"></textarea></div>
    <button type="submit" class="btn bp">Update</button></form></div></div>
    <script>
    function oM(id){document.getElementById(id).classList.add('open')}
    function cM(id){document.getElementById(id).classList.remove('open')}
    function oEdit(c){document.getElementById('ecid').value=c.id;document.getElementById('en').value=c.name||'';document.getElementById('ee').value=c.email||'';document.getElementById('ep').value=c.phone||'';document.getElementById('eno').value=c.notes||'';oM('em')}
    </script></body></html>
<?php }

// ── ADMIN ─────────────────────────────────────────────────────────
function pg_admin() {
    $users  = db()->query("SELECT id,name,email,role,created_at FROM mn_users ORDER BY created_at DESC")->fetchAll();
    $me     = me();
    $domain = defined('MAIL_DOMAIN') ? MAIL_DOMAIN : '';
    head('Admin'); sidebar('admin'); ?>
    <div class="main">
      <div class="tb"><div class="tb-t">ADMIN PANEL</div><button class="btn bp btn-sm" onclick="oM('cu')">+ Add User</button></div>
      <div class="cnt">
        <?=popflash()?>
        <?php if (!imap_ok()): ?><div class="warn"><strong>⚠️ PHP IMAP not enabled.</strong> cPanel → Select PHP Version → Extensions → tick <strong>imap</strong> → Save.</div><?php endif; ?>
        <div class="info">
          <strong>How to add users under @<?=h($domain)?>:</strong>
          <div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:10px;margin-top:10px">
            <div style="background:#fff;border-radius:7px;padding:11px;border:1px solid #bfdbfe"><strong>1. Create mailbox</strong><br>cPanel → Email Accounts → create the mailbox with a password.</div>
            <div style="background:#fff;border-radius:7px;padding:11px;border:1px solid #bfdbfe"><strong>2. Add here</strong><br>Click "+ Add User" with the same email &amp; password from cPanel.</div>
            <div style="background:#fff;border-radius:7px;padding:11px;border:1px solid #bfdbfe"><strong>3. User logs in</strong><br><a href="<?=url('pg=login')?>" style="color:#3b82f6;font-size:.78rem;word-break:break-all"><?=url('pg=login')?></a></div>
          </div>
        </div>
        <div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:12px;margin-bottom:18px">
          <div class="stat-card"><div class="stat-n"><?=count($users)?></div><div class="stat-l">Total Users</div></div>
          <div class="stat-card"><div class="stat-n"><?=count(array_filter($users, fn($u) => $u['role'] === 'admin'))?></div><div class="stat-l">Admins</div></div>
          <div class="stat-card"><div class="stat-n" style="font-size:.9rem;padding-top:4px"><?=h($domain) ?: '—'?></div><div class="stat-l">Mail Domain</div></div>
          <div class="stat-card"><div class="stat-n" style="font-size:.9rem;padding-top:4px"><?=defined('IMAP_HOST') ? h(IMAP_HOST) : '—'?></div><div class="stat-l">Mail Server</div></div>
        </div>
        <div class="card">
          <div class="card-hd"><span>USERS (<?=count($users)?>)</span><button class="btn bp btn-sm" onclick="oM('cu')">+ Add User</button></div>
          <table><thead><tr><th>Name</th><th>Email</th><th>Role</th><th>Added</th><th>Actions</th></tr></thead><tbody>
          <?php foreach ($users as $u):
            $cols = ['#ff4d1a', '#3b82f6', '#059669', '#7c3aed'];
            $col  = $cols[abs(crc32($u['email'])) % 4];
            $in   = strtoupper(substr($u['name'], 0, 2)); ?>
          <tr>
            <td><div style="display:flex;align-items:center;gap:8px"><div style="width:28px;height:28px;border-radius:50%;background:<?=$col?>;color:#fff;display:flex;align-items:center;justify-content:center;font-weight:700;font-size:.7rem;flex-shrink:0"><?=h($in)?></div><?=h($u['name'])?></div></td>
            <td style="color:var(--mu);font-size:.8rem"><?=h($u['email'])?></td>
            <td><span class="badge <?=$u['role']==='admin'?'ba':'bu'?>"><?=ucfirst($u['role'])?></span></td>
            <td style="font-size:.8rem;color:var(--mu)"><?=date('M j, Y', strtotime($u['created_at']))?></td>
            <td><div style="display:flex;gap:5px;flex-wrap:wrap">
              <button class="btn bs btn-sm" onclick="oReset(<?=$u['id']?>,<?=json_encode($u['name'])?>,<?=json_encode($u['email'])?>)">🔑 Reset PW</button>
              <?php if ($u['id'] !== $me['id']): ?>
              <form method="POST" action="" style="margin:0" onsubmit="return confirm('Delete <?=h(addslashes($u['name']))?>?')">
                <input type="hidden" name="ax" value="deluser"><input type="hidden" name="t" value="<?=tok()?>"><input type="hidden" name="uid" value="<?=$u['id']?>">
                <button class="btn bd btn-sm">✕</button>
              </form>
              <?php endif; ?>
            </div></td>
          </tr>
          <?php endforeach; ?></tbody></table>
        </div>
      </div>
    </div>
    <!-- ADD USER -->
    <div class="modal" id="cu" onclick="if(event.target===this)cM('cu')"><div class="mbox" style="max-width:480px">
      <button class="mx" onclick="cM('cu')">✕</button>
      <div class="mt">ADD USER — @<?=h($domain)?></div>
      <div style="background:#fffbeb;border:1px solid #fcd34d;border-radius:7px;padding:10px 12px;margin-bottom:14px;font-size:.78rem;color:#92400e">Create the mailbox in cPanel first, then add here with the same password.</div>
      <form method="POST" action="">
        <input type="hidden" name="ax" value="adduser"><input type="hidden" name="t" value="<?=tok()?>">
        <div class="fg"><label class="fl">Full Name</label><input type="text" name="name" class="fc" required></div>
        <div class="fg"><label class="fl">Email</label>
          <div style="display:flex">
            <input type="text" id="eu" class="fc" style="border-radius:7px 0 0 7px;border-right:none" oninput="document.getElementById('ef').value=this.value+'@<?=h($domain)?>'">
            <span style="background:#f0efe9;border:1.5px solid var(--br);border-left:none;border-radius:0 7px 7px 0;padding:8px 10px;font-size:.85rem;color:var(--mu);white-space:nowrap">@<?=h($domain)?></span>
          </div>
          <input type="hidden" name="email" id="ef">
          <input type="email" id="eo" class="fc" style="margin-top:5px" placeholder="Or type full address: user@other.com" oninput="if(this.value){document.getElementById('ef').value=this.value;document.getElementById('eu').value=''}">
        </div>
        <div class="fg"><label class="fl">Mailbox Password</label>
          <input type="text" name="pw" class="fc" required minlength="6" placeholder="Same as cPanel email account password">
          <div style="font-size:.7rem;color:#999;margin-top:3px">⚠️ Must match the actual mailbox password on your mail server</div>
        </div>
        <div class="fg"><label class="fl">Role</label>
          <select name="role" class="fc"><option value="user">User</option><option value="admin">Admin</option></select></div>
        <div class="fg" style="display:flex;align-items:center;gap:8px;background:#f9f8f5;border-radius:7px;padding:9px 11px">
          <input type="checkbox" name="sw" id="sw" value="1" checked style="width:15px;height:15px">
          <label for="sw" style="cursor:pointer;font-size:.83rem"><strong>Send welcome email</strong> with login link and credentials</label>
        </div>
        <button type="submit" class="btn bp" style="width:100%;justify-content:center;padding:10px">Add User</button>
      </form>
    </div></div>
    <!-- RESET PW -->
    <div class="modal" id="rm" onclick="if(event.target===this)cM('rm')"><div class="mbox">
      <button class="mx" onclick="cM('rm')">✕</button>
      <div class="mt">RESET PASSWORD</div>
      <div id="rn" style="font-size:.82rem;color:var(--mu);margin-bottom:12px"></div>
      <div style="background:#fffbeb;border:1px solid #fcd34d;border-radius:7px;padding:9px 11px;margin-bottom:14px;font-size:.78rem;color:#92400e">Must match the mailbox password on your mail server.</div>
      <form method="POST" action="">
        <input type="hidden" name="ax" value="resetpw"><input type="hidden" name="t" value="<?=tok()?>"><input type="hidden" name="uid" id="ruid">
        <div class="fg"><label class="fl">New Password</label><input type="text" name="pw" class="fc" required minlength="6"></div>
        <button type="submit" class="btn bp" style="width:100%;justify-content:center;padding:10px">Reset Password</button>
      </form>
    </div></div>
    <script>
    function oM(id){document.getElementById(id).classList.add('open')}
    function cM(id){document.getElementById(id).classList.remove('open')}
    function oReset(id,n,e){document.getElementById('ruid').value=id;document.getElementById('rn').textContent=n+' ('+e+')';oM('rm')}
    document.querySelector('#cu form').addEventListener('submit',function(e){
      var f=document.getElementById('ef'),u=document.getElementById('eu');
      if(!f.value&&u.value)f.value=u.value+'@<?=h($domain)?>';
      if(!f.value){e.preventDefault();alert('Please enter an email address.');}
    });
    </script></body></html>
<?php }

// ════════════════════════════════════════════════════════════════════
//  INSTALLER — runs when mailnest-config.php does not exist
// ════════════════════════════════════════════════════════════════════
function mn_installer() {
    $step = 1; $err = ''; $ok = false; $v = [];

    if ($_SERVER['REQUEST_METHOD'] === 'POST') {
        $step = intval($_POST['step'] ?? 1);

        if ($step === 1) {
            $v = [
                'host' => trim($_POST['db_host'] ?? 'localhost'),
                'name' => trim($_POST['db_name'] ?? ''),
                'user' => trim($_POST['db_user'] ?? ''),
                'pass' => $_POST['db_pass'] ?? '',  // raw from input field
            ];
            if (!$v['name'] || !$v['user']) { $err = 'Database name and username are required.'; }
            else {
                try {
                    $p = new PDO('mysql:host=' . $v['host'] . ';charset=utf8mb4', $v['user'], $v['pass'], [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);
                    $s = preg_replace('/[^a-zA-Z0-9_]/', '', $v['name']);
                    $p->exec("CREATE DATABASE IF NOT EXISTS `$s` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci");
                    $p->exec("USE `$s`");
                    $step = 2;
                } catch (Exception $e) { $err = 'DB Error: ' . $e->getMessage(); }
            }
        } elseif ($step === 2) {
            // pass comes as base64 from hidden field db_pass_enc
            $v = [
                'host'   => trim($_POST['db_host']     ?? ''),
                'name'   => trim($_POST['db_name']     ?? ''),
                'user'   => trim($_POST['db_user']     ?? ''),
                'pass'   => base64_decode($_POST['db_pass_enc'] ?? ''),
                'domain' => trim($_POST['mail_domain'] ?? ''),
                'ihost'  => trim($_POST['imap_host']   ?? ''),
                'iport'  => intval($_POST['imap_port']   ?? 993),
                'ienc'   => $_POST['imap_enc']  ?? 'ssl',
                'shost'  => trim($_POST['smtp_host']   ?? ''),
                'sport'  => intval($_POST['smtp_port']   ?? 587),
                'senc'   => $_POST['smtp_enc']  ?? 'tls',
            ];
            if (!$v['domain'] || !$v['ihost'] || !$v['shost']) { $err = 'Mail domain, IMAP host and SMTP host are required.'; }
            else { $step = 3; }
        } elseif ($step === 3) {
            // pass comes as base64 from hidden field db_pass_enc
            $v = [
                'host'   => trim($_POST['db_host']     ?? ''),
                'name'   => trim($_POST['db_name']     ?? ''),
                'user'   => trim($_POST['db_user']     ?? ''),
                'pass'   => base64_decode($_POST['db_pass_enc'] ?? ''),
                'domain' => $_POST['mail_domain'] ?? '',
                'ihost'  => $_POST['imap_host']   ?? '',
                'iport'  => intval($_POST['imap_port'] ?? 993),
                'ienc'   => $_POST['imap_enc']    ?? 'ssl',
                'shost'  => $_POST['smtp_host']   ?? '',
                'sport'  => intval($_POST['smtp_port'] ?? 587),
                'senc'   => $_POST['smtp_enc']    ?? 'tls',
                'aname'  => trim($_POST['admin_name']  ?? ''),
                'aemail' => trim($_POST['admin_email'] ?? ''),
            ];
            $apw = $_POST['admin_pass'] ?? '';
            if (!$v['aname'] || !$v['aemail']) { $err = 'Admin name and email required.'; }
            elseif (strlen($apw) < 8) { $err = 'Password must be at least 8 characters.'; }
            elseif (!$v['host'] || !$v['name'] || !$v['user']) { $err = 'Database details missing — please go back to Step 1.'; $step = 1; $v = []; }
            else {
                try {
                    $p = new PDO('mysql:host=' . $v['host'] . ';dbname=' . $v['name'] . ';charset=utf8mb4', $v['user'], $v['pass'], [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);
                    $p->exec("CREATE TABLE IF NOT EXISTS mn_users(id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(100) NOT NULL,email VARCHAR(200) NOT NULL UNIQUE,password VARCHAR(255) NOT NULL,role ENUM('admin','user') DEFAULT 'user',imap_pass VARCHAR(255),created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4");
                    $p->exec("CREATE TABLE IF NOT EXISTS mn_contacts(id INT AUTO_INCREMENT PRIMARY KEY,user_id INT NOT NULL,name VARCHAR(100),email VARCHAR(200) NOT NULL,phone VARCHAR(50),notes TEXT,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,FOREIGN KEY(user_id)REFERENCES mn_users(id)ON DELETE CASCADE)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4");
                    $p->exec("CREATE TABLE IF NOT EXISTS mn_reset_tokens(id INT AUTO_INCREMENT PRIMARY KEY,user_id INT NOT NULL,token VARCHAR(100) NOT NULL UNIQUE,expires_at BIGINT NOT NULL,used TINYINT DEFAULT 0,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,FOREIGN KEY(user_id)REFERENCES mn_users(id)ON DELETE CASCADE)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4");
                    $ex = $p->prepare("SELECT id FROM mn_users WHERE email=?"); $ex->execute([$v['aemail']]);
                    $hash = password_hash($apw, PASSWORD_BCRYPT); $enc = base64_encode($apw);
                    if ($ex->fetch()) $p->prepare("UPDATE mn_users SET name=?,password=?,imap_pass=?,role='admin' WHERE email=?")->execute([$v['aname'], $hash, $enc, $v['aemail']]);
                    else $p->prepare("INSERT INTO mn_users(name,email,password,role,imap_pass)VALUES(?,?,?,'admin',?)")->execute([$v['aname'], $v['aemail'], $hash, $enc]);
                    $cfg  = "<?php\n";
                    $cfg .= "define('DB_HOST',    '" . addslashes($v['host'])   . "');\n";
                    $cfg .= "define('DB_NAME',    '" . addslashes($v['name'])   . "');\n";
                    $cfg .= "define('DB_USER',    '" . addslashes($v['user'])   . "');\n";
                    $cfg .= "define('DB_PASS',    '" . addslashes($v['pass'])   . "');\n";
                    $cfg .= "define('IMAP_HOST',  '" . addslashes($v['ihost'])  . "');\n";
                    $cfg .= "define('IMAP_PORT',  "  . $v['iport']              . ");\n";
                    $cfg .= "define('IMAP_ENC',   '" . $v['ienc']               . "');\n";
                    $cfg .= "define('SMTP_HOST',  '" . addslashes($v['shost'])  . "');\n";
                    $cfg .= "define('SMTP_PORT',  "  . $v['sport']              . ");\n";
                    $cfg .= "define('SMTP_ENC',   '" . $v['senc']               . "');\n";
                    $cfg .= "define('MAIL_DOMAIN','" . addslashes($v['domain']) . "');\n";
                    if (@file_put_contents(MN_CFG, $cfg) === false) throw new Exception('Cannot write mailnest-config.php — run chmod 755 on the folder, or create it manually.');
                    $ok = true;
                } catch (Exception $e) { $err = $e->getMessage(); }
            }
        }
    }

    $hf = function($k) use ($v) {
        // Map internal key to the HTML field name
        $names = ['host'=>'db_host','name'=>'db_name','user'=>'db_user','pass'=>'db_pass_enc'];
        $field = $names[$k] ?? $k;
        $val   = $v[$k] ?? '';
        if ($k === 'pass') $val = base64_encode($val); // encode password
        echo '<input type="hidden" name="' . $field . '" value="' . htmlspecialchars($val, ENT_QUOTES) . '">';
    };
    $fv  = function($k, $d = '') use ($v) { return htmlspecialchars($v[$k] ?? $d, ENT_QUOTES); };
    $sel = function($k, $val) use ($v) { return ($v[$k] ?? '') === $val ? 'selected' : ''; };
    $base = ((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https' : 'http') . '://' . $_SERVER['HTTP_HOST'] . $_SERVER['SCRIPT_NAME'];
    $s = $step;
    ?>
<!DOCTYPE html><html lang="en"><head>
<meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>MailNest Setup</title>
<link href="https://fonts.googleapis.com/css2?family=Bebas+Neue&family=DM+Sans:wght@400;500;600&display=swap" rel="stylesheet">
<style>
*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
body{font-family:'DM Sans',sans-serif;background:linear-gradient(135deg,#0d0d1a,#1a0800);min-height:100vh;display:flex;align-items:center;justify-content:center;padding:20px}
.w{background:#fff;border-radius:16px;width:100%;max-width:520px;overflow:hidden;box-shadow:0 32px 80px rgba(0,0,0,.5)}
.wt{background:#0a0a0f;padding:26px 28px;color:#fff}
.wl{font-family:'Bebas Neue',sans-serif;font-size:1.3rem;letter-spacing:.06em;display:flex;align-items:center;gap:9px;margin-bottom:3px}
.wm{width:24px;height:24px;border-radius:5px;background:#ff4d1a;display:flex;align-items:center;justify-content:center;font-size:.8rem;color:#fff}
.wd{font-size:.78rem;color:rgba(255,255,255,.38)}
.bar{display:flex;gap:4px;margin-top:16px}
.pill{flex:1;height:4px;border-radius:2px;background:rgba(255,255,255,.12)}
.pill.d{background:#ff4d1a}.pill.a{background:#fff}
.lbls{display:flex;margin-top:6px}
.lbl{flex:1;font-size:.62rem;text-align:center;color:rgba(255,255,255,.28)}
.lbl.a{color:#fff;font-weight:600}.lbl.d{color:rgba(255,255,255,.48)}
.wb{padding:28px}
.wh{font-family:'Bebas Neue',sans-serif;font-size:1.15rem;letter-spacing:.03em;margin-bottom:4px}
.ws{color:#6b6b78;font-size:.84rem;margin-bottom:20px;line-height:1.6}
.fg{margin-bottom:13px}
.fl{display:block;font-weight:600;font-size:.8rem;margin-bottom:4px}
.fc{width:100%;padding:8px 10px;border:1.5px solid #e2e0d8;border-radius:7px;font-size:.9rem;font-family:inherit;transition:.15s}
.fc:focus{outline:none;border-color:#3b82f6}
.fr{display:grid;grid-template-columns:1fr 1fr;gap:11px}
.fh{font-size:.7rem;color:#999;margin-top:3px}
.btn{width:100%;padding:11px;border:none;border-radius:8px;font-size:.92rem;font-weight:700;cursor:pointer;font-family:inherit;background:#0a0a0f;color:#fff;transition:.15s;margin-top:2px}
.btn:hover{background:#ff4d1a}
.er{background:#fef2f2;color:#991b1b;border:1px solid #fca5a5;padding:11px 13px;border-radius:7px;margin-bottom:16px;font-size:.84rem;line-height:1.5}
.bx{border:1px solid #e2e0d8;border-radius:8px;padding:13px;margin-bottom:13px}
.bt{font-weight:700;font-size:.82rem;margin-bottom:11px}
.tip{background:#fffbeb;border:1px solid #fcd34d;border-radius:7px;padding:12px 13px;margin-bottom:16px;font-size:.8rem;color:#78350f;line-height:1.65}
.tip strong{color:#92400e}.tip code{background:#fef3c7;padding:1px 5px;border-radius:3px}
.di{font-size:2.8rem;text-align:center;margin-bottom:12px}
.ck{display:flex;align-items:center;gap:9px;padding:7px 0;font-size:.84rem;border-bottom:1px solid #f5f5f3}
.ck:last-child{border:0}
.go{display:block;text-align:center;background:#0a0a0f;color:#fff;padding:11px;border-radius:8px;font-weight:700;font-size:.92rem;text-decoration:none;transition:.15s}
.go:hover{background:#ff4d1a}
select.fc{cursor:pointer}
</style>
</head><body>
<div class="w">
  <div class="wt">
    <div class="wl"><div class="wm">✉</div>MAILNEST SETUP</div>
    <div class="wd">v<?=MN_VER?> · Self-hosted webmail installer</div>
    <div class="bar">
      <?php for ($i = 1; $i <= 4; $i++): $c = $ok ? 'd' : ($i < $s ? 'd' : ($i === $s ? 'a' : '')); ?>
      <div class="pill <?=$c?>"></div><?php endfor; ?>
    </div>
    <div class="lbls">
      <?php foreach (['Database', 'Mail Server', 'Admin', 'Done'] as $i => $l):
        $n = $i + 1; $c = $ok && $n === 4 ? 'a' : ($ok ? 'd' : ($n === $s ? 'a' : ($n < $s ? 'd' : ''))); ?>
      <div class="lbl <?=$c?>"><?=$l?></div><?php endforeach; ?>
    </div>
  </div>
  <div class="wb">
  <?php if ($err): ?><div class="er">⚠️ <?=htmlspecialchars($err)?></div><?php endif; ?>

  <?php if ($ok): ?>
    <div class="di">🎉</div>
    <div class="wh" style="text-align:center;font-size:1.3rem">SETUP COMPLETE!</div>
    <p style="text-align:center;color:#6b6b78;font-size:.84rem;margin:8px 0 20px;line-height:1.6">Your MailNest webmail is live and ready.</p>
    <div style="background:#f9f8f5;border-radius:8px;padding:13px;margin-bottom:16px">
      <div class="ck">✅ Database &amp; tables ready</div>
      <div class="ck">✅ Mail server configured</div>
      <div class="ck">✅ Admin account created</div>
      <div class="ck">✅ Config saved</div>
    </div>
    <div style="background:#fff7ed;border:1px solid #fed7aa;border-radius:7px;padding:11px 13px;margin-bottom:16px;font-size:.8rem;color:#9a3412;line-height:1.6">
      📧 <strong>Enable IMAP:</strong> cPanel → Select PHP Version → Extensions → tick <strong>imap</strong> → Save<br>
      🔒 <strong>Tip:</strong> Bookmark <code style="background:#fef3c7;padding:1px 5px;border-radius:3px"><?=htmlspecialchars($base)?></code> — that's your webmail URL.
    </div>
    <a href="<?=htmlspecialchars($base)?>" class="go">Open MailNest →</a>

  <?php elseif ($s === 1): ?>
    <div class="wh">STEP 1 — DATABASE</div>
    <p class="ws">Enter your MySQL credentials. The database will be created automatically.</p>
    <div class="tip">
      <strong>💡 cPanel users — read this first:</strong><br>
      cPanel prefixes all names with your account username.<br>
      Go to <strong>cPanel → MySQL Databases</strong> → create DB + user → add user to DB with ALL PRIVILEGES → enter the <strong>full prefixed names</strong> below (e.g. <code>user_mailnest</code> not just <code>mailnest</code>).
    </div>
    <form method="POST" action="<?=htmlspecialchars($base)?>">
      <input type="hidden" name="step" value="1">
      <div class="fg"><label class="fl">Database Host</label><input type="text" name="db_host" class="fc" value="<?=$fv('host','localhost')?>" required><div class="fh">Almost always <strong>localhost</strong></div></div>
      <div class="fr">
        <div class="fg"><label class="fl">Database Name</label><input type="text" name="db_name" class="fc" value="<?=$fv('name')?>" placeholder="prefix_mailnest" required><div class="fh">Full prefixed name</div></div>
        <div class="fg"><label class="fl">DB Username</label><input type="text" name="db_user" class="fc" value="<?=$fv('user')?>" placeholder="prefix_user" required autocomplete="off"><div class="fh">Full prefixed name</div></div>
      </div>
      <div class="fg"><label class="fl">DB Password</label><input type="password" name="db_pass" class="fc" autocomplete="new-password"><div class="fh">Set in cPanel MySQL Users</div></div>
      <button type="submit" class="btn">Test Connection &amp; Continue →</button>
    </form>

  <?php elseif ($s === 2): ?>
    <div class="wh">STEP 2 — MAIL SERVER</div>
    <p class="ws">Same IMAP &amp; SMTP settings you'd enter in Outlook or Thunderbird.</p>
    <form method="POST" action="<?=htmlspecialchars($base)?>">
      <input type="hidden" name="step" value="2">
      <?php $hf('host'); $hf('name'); $hf('user'); $hf('pass'); ?>
      <div class="fg"><label class="fl">Mail Domain</label><input type="text" name="mail_domain" class="fc" value="<?=$fv('domain')?>" placeholder="yourdomain.com" required><div class="fh">The domain part of your email addresses</div></div>
      <div class="bx">
        <div class="bt">📥 IMAP — Incoming Mail</div>
        <div class="fr" style="margin-bottom:10px">
          <div class="fg" style="margin:0"><label class="fl">Host</label><input type="text" name="imap_host" class="fc" value="<?=$fv('ihost')?>" placeholder="mail.yourdomain.com" required></div>
          <div class="fg" style="margin:0"><label class="fl">Port</label><input type="number" name="imap_port" class="fc" value="<?=$fv('iport','993')?>"></div>
        </div>
        <div class="fg" style="margin:0"><label class="fl">Encryption</label>
          <select name="imap_enc" class="fc">
            <option value="ssl" <?=$sel('ienc','ssl')?>>SSL/TLS (993)</option>
            <option value="tls" <?=$sel('ienc','tls')?>>STARTTLS</option>
            <option value="notls" <?=$sel('ienc','notls')?>>None</option>
          </select>
        </div>
      </div>
      <div class="bx">
        <div class="bt">📤 SMTP — Outgoing Mail</div>
        <div class="fr" style="margin-bottom:10px">
          <div class="fg" style="margin:0"><label class="fl">Host</label><input type="text" name="smtp_host" class="fc" value="<?=$fv('shost')?>" placeholder="smtp.yourdomain.com" required></div>
          <div class="fg" style="margin:0"><label class="fl">Port</label><input type="number" name="smtp_port" class="fc" value="<?=$fv('sport','587')?>"></div>
        </div>
        <div class="fg" style="margin:0"><label class="fl">Encryption</label>
          <select name="smtp_enc" class="fc">
            <option value="tls" <?=$sel('senc','tls')?>>STARTTLS (587)</option>
            <option value="ssl" <?=$sel('senc','ssl')?>>SSL (465)</option>
            <option value="none" <?=$sel('senc','none')?>>None (25)</option>
          </select>
        </div>
      </div>
      <button type="submit" class="btn">Continue →</button>
    </form>

  <?php elseif ($s === 3): ?>
    <div class="wh">STEP 3 — ADMIN ACCOUNT</div>
    <p class="ws">Create the administrator account to manage users and settings.</p>
    <form method="POST" action="<?=htmlspecialchars($base)?>">
      <input type="hidden" name="step" value="3">
      <?php foreach (['host','name','user','pass','domain','ihost','iport','ienc','shost','sport','senc'] as $k) $hf($k); ?>
      <div class="fg"><label class="fl">Full Name</label><input type="text" name="admin_name" class="fc" value="<?=$fv('aname')?>" required></div>
      <div class="fg"><label class="fl">Email Address</label><input type="email" name="admin_email" class="fc" value="<?=$fv('aemail')?>" placeholder="admin@yourdomain.com" required><div class="fh">Must be a real mailbox on your mail server</div></div>
      <div class="fg"><label class="fl">Password <span style="font-weight:400;color:#999">(min 8 chars)</span></label><input type="password" name="admin_pass" class="fc" minlength="8" required autocomplete="new-password"></div>
      <button type="submit" class="btn">Finish Setup ✓</button>
    </form>
  <?php endif; ?>
  </div>
</div>
</body></html>
<?php }
