<?php
/**
 * mail.52xm.cn 状态首页
 */
$cfgFile = '/www/wwwroot/mail.52xm.cn/app/config.json';
$cfg = is_readable($cfgFile) ? json_decode(file_get_contents($cfgFile), true) : [];
$apiKey = isset($cfg['api_key']) ? $cfg['api_key'] : '';

$health = null;
$stats = null;
if ($apiKey) {
    $ch = curl_init('http://127.0.0.1:8088/api/stats');
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_HTTPHEADER     => ['X-Api-Key: ' . $apiKey],
        CURLOPT_TIMEOUT        => 5,
    ]);
    $raw = curl_exec($ch);
    curl_close($ch);
    $decoded = json_decode((string)$raw, true);
    if (is_array($decoded)) {
        $stats = $decoded;
    }
}

// 近 10 条发送记录
$recent = [];
$dbFile = '/www/wwwroot/mail.52xm.cn/data/mail.db';
if (is_readable($dbFile)) {
    try {
        $pdo = new PDO('sqlite:' . $dbFile);
        $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
        $recent = $pdo->query(
            "SELECT id, subject, status, recipients, created_at, sent_at, error
             FROM queue ORDER BY id DESC LIMIT 10"
        )->fetchAll();
    } catch (Exception $e) {
        $recent = [];
    }
}

function esc($s)
{
    return htmlspecialchars((string)$s, ENT_QUOTES, 'UTF-8');
}

function ts($t)
{
    return $t ? date('Y-m-d H:i:s', (int)$t) : '—';
}

$total = isset($stats['total']) ? (int)$stats['total'] : 0;
$st = isset($stats['stats']) ? $stats['stats'] : [];
$sentN = isset($st['sent']) ? (int)$st['sent'] : 0;
$pendingN = isset($st['pending']) ? (int)$st['pending'] : 0;
$retryN = isset($st['retry']) ? (int)$st['retry'] : 0;
$failedN = isset($st['failed']) ? (int)$st['failed'] : 0;
$inboxN = isset($stats['inbox']) ? (int)$stats['inbox'] : 0;
$domain = isset($cfg['domain']) ? $cfg['domain'] : 'mail.52xm.cn';
?>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title><?= esc($domain) ?> 邮件服务</title>
<style>
:root{--bg:#f5f7fa;--card:#fff;--line:#e4e7ed;--txt:#303133;--sub:#909399;
--pri:#409eff;--ok:#67c23a;--warn:#e6a23c;--err:#f56c6c;}
*{box-sizing:border-box;margin:0;padding:0}
body{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Microsoft YaHei",sans-serif;
background:var(--bg);color:var(--txt);padding:24px;line-height:1.6}
.wrap{max-width:1000px;margin:0 auto}
h1{font-size:22px;margin-bottom:6px;display:flex;align-items:center;gap:10px}
.dot{width:9px;height:9px;border-radius:50%;background:var(--ok);box-shadow:0 0 0 3px rgba(103,194,58,.18)}
.sub{color:var(--sub);font-size:13px;margin-bottom:22px}
.cards{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:14px;margin-bottom:22px}
.card{background:var(--card);border:1px solid var(--line);border-radius:10px;padding:16px 18px}
.card .n{font-size:26px;font-weight:600;line-height:1.2}
.card .l{font-size:12px;color:var(--sub);margin-top:4px}
.panel{background:var(--card);border:1px solid var(--line);border-radius:10px;padding:18px 20px;margin-bottom:18px}
.panel h2{font-size:15px;margin-bottom:14px;padding-bottom:10px;border-bottom:1px solid var(--line)}
table{width:100%;border-collapse:collapse;font-size:13px}
th{text-align:left;color:var(--sub);font-weight:500;padding:8px 10px;background:#fafbfc;
border-bottom:1px solid var(--line);white-space:nowrap}
td{padding:9px 10px;border-bottom:1px solid #f0f2f5;vertical-align:top}
tr:last-child td{border-bottom:none}
code{background:#f5f7fa;padding:2px 6px;border-radius:4px;font-size:12px;
font-family:ui-monospace,SFMono-Regular,Menlo,monospace}
.tag{display:inline-block;padding:2px 8px;border-radius:10px;font-size:12px}
.tag.sent{background:#f0f9eb;color:var(--ok)}
.tag.pending{background:#f4f4f5;color:var(--sub)}
.tag.retry{background:#fdf6ec;color:var(--warn)}
.tag.failed{background:#fef0f0;color:var(--err)}
.err{color:var(--err);font-size:12px;max-width:280px;word-break:break-all}
.kv{display:grid;grid-template-columns:110px 1fr;gap:8px 14px;font-size:13px}
.kv dt{color:var(--sub)}
.kv dd{word-break:break-all}
.empty{text-align:center;color:var(--sub);padding:26px 0;font-size:13px}
</style>
</head>
<body>
<div class="wrap">
  <h1><span class="dot"></span><?= esc($domain) ?> 邮件服务</h1>
  <p class="sub">自建 MTA · DKIM 签名 · 队列重试 · HTTP 发信 API</p>

  <div class="cards">
    <div class="card"><div class="n"><?= $total ?></div><div class="l">总投递数</div></div>
    <div class="card"><div class="n" style="color:var(--ok)"><?= $sentN ?></div><div class="l">已发送</div></div>
    <div class="card"><div class="n" style="color:var(--warn)"><?= $pendingN + $retryN ?></div><div class="l">待发送/重试</div></div>
    <div class="card"><div class="n" style="color:var(--err)"><?= $failedN ?></div><div class="l">失败</div></div>
    <div class="card"><div class="n"><?= $inboxN ?></div><div class="l">本地信箱</div></div>
  </div>

  <div class="panel">
    <h2>服务配置</h2>
    <dl class="kv">
      <dt>发信域</dt><dd><code><?= esc($domain) ?></code></dd>
      <dt>SMTP 接收</dt><dd><code><?= esc($domain) ?>:25</code>（MX 已指向本机）</dd>
      <dt>HTTP API</dt><dd><code>https://<?= esc($domain) ?>/api/send</code></dd>
      <dt>DKIM</dt><dd><code>d=<?= esc($domain) ?> s=<?= esc(isset($cfg['dkim_selector']) ? $cfg['dkim_selector'] : 'mail') ?></code>（rsa-sha256）</dd>
      <dt>投递模式</dt><dd><?= !empty($cfg['relay_enabled']) ? '中继 SMTP' : '直投 MX' ?></dd>
    </dl>
  </div>

  <div class="panel">
    <h2>最近投递记录</h2>
    <?php if (!$recent): ?>
      <div class="empty">暂无记录</div>
    <?php else: ?>
    <table>
      <thead><tr><th>#</th><th>主题</th><th>收件人</th><th>状态</th><th>创建时间</th><th>发送时间</th><th>错误</th></tr></thead>
      <tbody>
      <?php foreach ($recent as $r): ?>
        <tr>
          <td><?= (int)$r['id'] ?></td>
          <td><?= esc($r['subject']) ?></td>
          <td><code><?= esc($r['recipients']) ?></code></td>
          <td><span class="tag <?= esc($r['status']) ?>"><?= esc($r['status']) ?></span></td>
          <td><?= ts($r['created_at']) ?></td>
          <td><?= ts($r['sent_at']) ?></td>
          <td><?php if (!empty($r['error'])): ?><span class="err"><?= esc($r['error']) ?></span><?php endif; ?></td>
        </tr>
      <?php endforeach; ?>
      </tbody>
    </table>
    <?php endif; ?>
  </div>
</div>
</body>
</html>
