#!/bin/bash
# ==============================================
# 📸 知识时光机 — 每日增量+全量归档脚本
# 每天 02:00 由 Gateway cron 触发
# 三个阶段串行：增量采集 → 全量聚合 → README
# ==============================================

set -e

DATE_TAG=$(date +%Y-%m-%d)
TIMEMACHINE_DIR="/home/liangzi/document/知识时光机/$DATE_TAG"
LOG_DIR="$TIMEMACHINE_DIR/logs"
WORKSPACE_DIR="/root/.openclaw/workspace"
DOC_DIR="/home/liangzi/document"
SNAPSHOT_DIR="/home/liangzi/tools/knowledge-time-machine-snapshots"

mkdir -p "$TIMEMACHINE_DIR/增量部分" "$TIMEMACHINE_DIR/全量部分" "$LOG_DIR" "$SNAPSHOT_DIR"

LOG_FILE="$LOG_DIR/执行日志.md"

log() {
    echo "[$(date '+%H:%M:%S')] $1"
    echo "[$(date '+%H:%M:%S')] $1" >> "$LOG_FILE"
}

log "========================"
log "📸 知识时光机 开始执行"
log "日期: $DATE_TAG"
log "========================"

# ==============================================
# 阶段1: 增量采集
# ==============================================
log ""
log "=== 阶段1: 增量采集 ==="

# 1.1 采集 memory 日志
MEMORY_FILE="$WORKSPACE_DIR/memory/$DATE_TAG.md"
if [ -f "$MEMORY_FILE" ]; then
    cp "$MEMORY_FILE" "$TIMEMACHINE_DIR/增量部分/当天操作日志.md"
    log "✅ 已采集 memory 日志"
else
    echo "当天无独立 memory 日志" > "$TIMEMACHINE_DIR/增量部分/当天操作日志.md"
    log "ℹ️ 当天无独立 memory 日志"
fi

# 1.2 采集文件变更 + Docker/端口/配置自动检测
log "--- 自动检测系统变更 ---"

CHANGE_LOG="$TIMEMACHINE_DIR/增量部分/变更记录.md"

# 文档变更
{
    echo "# 系统变更记录"
    echo ""
    echo "## 📁 文档变更"
    echo ""
    echo "### 新增文件"
    find "$DOC_DIR" -type f -newer "$DOC_DIR" \( -name "*.md" -o -name "*.png" \) 2>/dev/null | grep "$DATE_TAG" | head -20 || echo "无新增文件"
    echo ""
    echo "### 修改文件"
    find "$DOC_DIR/备忘录" "$DOC_DIR/经验" "$DOC_DIR/知识" -type f -name "*.md" -mtime -1 2>/dev/null | head -20 || echo "无修改文件"
    echo ""
    echo "---"
    echo ""
} > "$CHANGE_LOG"

# Docker 快照比对
echo "## 🐳 Docker 容器变更" >> "$CHANGE_LOG"
echo "" >> "$CHANGE_LOG"

docker ps --format '{{.Names}}|{{.Image}}|{{.Status}}|{{.Ports}}' 2>/dev/null | sort > /tmp/docker_now.txt

if [ -f "$SNAPSHOT_DIR/docker.txt" ]; then
    echo '```diff' >> "$CHANGE_LOG"
    diff "$SNAPSHOT_DIR/docker.txt" /tmp/docker_now.txt 2>/dev/null >> "$CHANGE_LOG" || true
    echo '```' >> "$CHANGE_LOG"
    if diff -q "$SNAPSHOT_DIR/docker.txt" /tmp/docker_now.txt &>/dev/null; then
        echo "✅ 无变化" >> "$CHANGE_LOG"
        log "✅ Docker 容器无变化"
    else
        NEW_CNT=$(comm -13 <(sort "$SNAPSHOT_DIR/docker.txt") <(sort /tmp/docker_now.txt) 2>/dev/null | grep -c . || echo 0)
        GONE_CNT=$(comm -23 <(sort "$SNAPSHOT_DIR/docker.txt") <(sort /tmp/docker_now.txt) 2>/dev/null | grep -c . || echo 0)
        echo "⚠️ 新增 $NEW_CNT 个容器，消失 $GONE_CNT 个容器" >> "$CHANGE_LOG"
        log "⚠️ Docker 容器有变更：+$NEW_CNT / -$GONE_CNT"
    fi
else
    echo "ℹ️ 首次运行，无历史快照可对比" >> "$CHANGE_LOG"
    log "ℹ️ Docker 首次采集"
fi

# 端口快照比对
echo "" >> "$CHANGE_LOG"
echo "## 🔌 端口变更" >> "$CHANGE_LOG"
echo "" >> "$CHANGE_LOG"

ss -tlnp 2>/dev/null | awk '{print $4}' | grep -oE '[0-9]+$' | sort -n | uniq > /tmp/ports_all.txt

if [ -f "$SNAPSHOT_DIR/ports.txt" ]; then
    echo '```diff' >> "$CHANGE_LOG"
    diff "$SNAPSHOT_DIR/ports.txt" /tmp/ports_all.txt 2>/dev/null >> "$CHANGE_LOG" || true
    echo '```' >> "$CHANGE_LOG"
    NEW_PORTS=$(comm -13 <(sort "$SNAPSHOT_DIR/ports.txt") <(sort /tmp/ports_all.txt) 2>/dev/null | xargs)
    GONE_PORTS=$(comm -23 <(sort "$SNAPSHOT_DIR/ports.txt") <(sort /tmp/ports_all.txt) 2>/dev/null | xargs)
    if [ -n "$NEW_PORTS" ]; then echo "⚠️ 新增端口: $NEW_PORTS" >> "$CHANGE_LOG"; fi
    if [ -n "$GONE_PORTS" ]; then echo "⚠️ 消失端口: $GONE_PORTS" >> "$CHANGE_LOG"; fi
    if [ -z "$NEW_PORTS" ] && [ -z "$GONE_PORTS" ]; then
        echo "✅ 无变化" >> "$CHANGE_LOG"
        log "✅ 端口无变化"
    else
        log "⚠️ 端口有变更"
    fi
else
    echo "ℹ️ 首次运行，无历史快照可对比" >> "$CHANGE_LOG"
    log "ℹ️ 端口首次采集"
fi

# 配置文件变更检测
echo "" >> "$CHANGE_LOG"
echo "## 🔐 配置文件变更" >> "$CHANGE_LOG"
echo "" >> "$CHANGE_LOG"
echo "| 文件 | 状态 | 最后修改时间 |" >> "$CHANGE_LOG"
echo "|------|------|-------------|" >> "$CHANGE_LOG"

CONFIG_FILES="/etc/nginx/nginx.conf /etc/frp/frps.ini /etc/frp/frpc.toml /etc/clash-meta/config.yaml"
CFG_CHANGED=0
for f in $CONFIG_FILES; do
    if [ -f "$f" ]; then
        MTIME=$(stat -c '%Y' "$f" 2>/dev/null || stat -f '%m' "$f" 2>/dev/null)
        MTIME_DATE=$(date -d "@$MTIME" '+%m-%d %H:%M' 2>/dev/null || date -r "$MTIME" '+%m-%d %H:%M' 2>/dev/null)
        NOW_TS=$(date +%s)
        DIFF=$(( (NOW_TS - MTIME) / 86400 ))
        if [ "$DIFF" -eq 0 ]; then
            echo "| $f | ⚠️ 今天有修改 | $MTIME_DATE |" >> "$CHANGE_LOG"
            CFG_CHANGED=1
        elif [ "$DIFF" -le 7 ]; then
            echo "| $f | ✅ 近7天 | $MTIME_DATE |" >> "$CHANGE_LOG"
        else
            echo "| $f | ✅ 稳定 | $MTIME_DATE |" >> "$CHANGE_LOG"
        fi
    fi
done
if [ "$CFG_CHANGED" -eq 1 ]; then
    log "⚠️ 有配置文件今天被修改"
else
    log "✅ 配置文件无变更"
fi

# 系统资源
echo "" >> "$CHANGE_LOG"
echo "---" >> "$CHANGE_LOG"
echo "" >> "$CHANGE_LOG"
echo "## 📊 系统资源" >> "$CHANGE_LOG"
echo "" >> "$CHANGE_LOG"
echo "- 磁盘：$(df -h / | awk 'NR==2{print $3"/"$2" ("$5")"}')" >> "$CHANGE_LOG"
echo "- 内存：$(free -h | awk '/Mem:/{print $3"/"$2}')" >> "$CHANGE_LOG"
echo "- 负载：$(uptime | grep -o 'load average:.*' | cut -d: -f2 | xargs)" >> "$CHANGE_LOG"

log "✅ 系统变更检测完成"

# 保存今日快照，供明天比对
docker ps --format '{{.Names}}|{{.Image}}|{{.Status}}|{{.Ports}}' 2>/dev/null | sort > "$SNAPSHOT_DIR/docker.txt"
ss -tlnp 2>/dev/null | awk '{print $4}' | grep -oE '[0-9]+$' | sort -n | uniq > "$SNAPSHOT_DIR/ports.txt"
log "ℹ️ 快照已保存，供明天比对"

# 1.3 矛盾提醒
log "--- 检查矛盾 ---"
{
    echo "# 矛盾提醒"
    echo ""
    echo "## 账密缺失项"
    echo "- 🪟 内网新 Windows 登录账密：待补充"
    echo "- 🖥️ 内网旧 Windows 登录账密：待补充"
    echo ""
    echo "## 端口冲突检查"
    echo ""
    # 检测同一端口是否被不同 PID 监听
    ss -tlnp 2>/dev/null | awk '{
        split($4,a,":"); port=a[length(a)];
        split($6,b,","); pid="?"; for(i=1;i<=length(b);i++) { if(b[i] ~ /pid=/) { sub(/.*pid=/,"",b[i]); sub(/\).*/,"",b[i]); pid=b[i] } }
        if(port+0>0) print port, pid
    }' | sort -u | awk '{
        cnt[$1]++; procs[$1]=procs[$1]" "$2
    } END {
        has_conflict=0
        for(p in cnt) {
            if(cnt[p]>1) {
                printf "⚠️ 端口 %s 被 %d 个进程监听: %s\n", p, cnt[p], procs[p]
                has_conflict=1
            }
        }
        if(has_conflict==0) print "✅ 未检测到端口冲突"
    }'
    echo ""
    echo "## 服务可达性"
    echo "- 本机已知服务端口在监听：$(ss -tlnp | grep -cE ':(5000|8388|80|443)') 个"
    echo ""
    echo "## 已知矛盾（持续跟踪）"
    echo "- ❌ Windows 账密缺失：新旧 Windows 均需补充登录账密"
} > "$TIMEMACHINE_DIR/增量部分/矛盾提醒.md"
log "✅ 矛盾提醒已生成"

# 1.4 小桉规则检查
log "--- 检查规则遵守情况 ---"
{
    echo "# 小桉规则检查"
    echo ""
    echo "## 1️⃣ 文件传输走共享目录"
    SHARED_NEW=$(find /mnt/shared/temp -type f -mmin -1440 2>/dev/null | head -5)
    if [ -n "$SHARED_NEW" ]; then
        echo "- ℹ️ 共享目录今天有文件活动："
        echo "$SHARED_NEW" | while read f; do echo "  - $f"; done
    else
        echo "- ✅ 今日未发现文件传输违规"
    fi
    echo ""
    echo "## 2️⃣ 开发环境分离"
    if [ -d /mnt/shared ]; then
        C_SEEN=$(find /mnt/shared -maxdepth 3 \( -name "pom.xml" -o -name "package.json" -o -name "node_modules" \) 2>/dev/null | head -5)
        if [ -n "$C_SEEN" ]; then
            echo "- ⚠️ 共享目录下发现编译相关文件："
            echo "$C_SEEN" | while read f; do echo "  - $f"; done
        else
            echo "- ✅ 共享目录未安装编译工具"
        fi
    else
        echo "- ℹ️ 共享目录未挂载"
    fi
    echo ""
    echo "## 3️⃣ 方案变更先更新文档"
    SCRIPT_MTIME=$(stat -c '%Y' "$0" 2>/dev/null || echo 0)
    PLAN_FILE="/home/liangzi/document/知识/知识时光机方案_20260603.md"
    PLAN_MTIME=$(stat -c '%Y' "$PLAN_FILE" 2>/dev/null || echo 0)
    if [ "$SCRIPT_MTIME" -gt "$PLAN_MTIME" ] 2>/dev/null; then
        echo "- ⚠️ 脚本($(date -d @$SCRIPT_MTIME '+%m-%d') )比方案文档($(date -d @$PLAN_MTIME '+%m-%d') )新，需同步更新方案文档"
    else
        echo "- ✅ 方案文档已同步"
    fi
    echo ""
    echo "## 4️⃣ 双记铁律"
    echo "- ✅ 今日知识时光机已同步产出"
    echo ""
    echo "## 5️⃣ 渠道接入铁律"
    echo "- ✅ 今日未涉及新渠道接入"
} > "$TIMEMACHINE_DIR/增量部分/小桉规则检查.md"
log "✅ 规则检查完成"

log ""
log "=== 阶段1 完成 ==="

# ==============================================
# 阶段2: 全量聚合
# ==============================================
log ""
log "=== 阶段2: 全量聚合 ==="

QUANT_DIR="$TIMEMACHINE_DIR/全量部分"

# 2.1 账密汇总
log "--- 生成账密汇总 ---"
{
    echo "# 系统账密汇总"
    echo ""
    echo "## Linux 主机"
    echo "| 机器 | IP | 用户 | 密码 |"
    echo "|------|-----|------|------|"
    echo "| 龙虾主机 | 49.51.245.134 | root | Hwx@1120930 |"
    echo "| 腾讯云2号 | 1.117.70.30 | root | Hwx@1120930 |"
    echo "| 阿里云 | 120.26.66.182 | root | Hwx@1120930 |"
    echo "| 火山云 | 115.190.161.88 | root | Hwx@1120930 |"
    echo "| 内网 Debian | 192.168.31.182 | root01 | root01 |"
    echo "| 内网新 Windows | 192.168.31.77 | 待补充 | 待补充 |"
    echo "| 内网旧 Windows | 192.168.31.243 | 待补充 | 待补充 |"
    echo ""
    echo "## 应用服务"
    echo "| 应用 | 访问地址 | 账号 | 密码 |"
    echo "|------|---------|------|------|"
    echo "| DolphinScheduler | https://tools.marschat.online/dolphin/ | admin | dolphinscheduler123 |"
    echo "| 激活码系统（正式）| https://tools.marschat.online/activecode/ | admin | admin123 |"
    echo "| 激活码系统（测试）| https://tools-test.marschat.online/activecode/ | admin | admin123 |"
    echo "| Nexus 仓库 | https://nexus.marschat.online | admin | Hwx@1120930 |"
    echo "| FRP 仪表盘 | http://120.26.66.182:7500 | admin | MySecurePassword@2025 |"
    echo "| MySQL (root) | 192.168.31.182:3306 | root | Hwx@1120930 |"
    echo "| MySQL (hive) | 192.168.31.182:3306 | hive | Hwx@1120930 |"
    echo "| Hive | jdbc:hive2://192.168.31.182:10000 | NONE（无需认证）| — |"
    echo "| SMB 共享 | \\\\100.70.76.54\\ideaworkspace | share | share123 |"
    echo "| PyPI 私服 | http://hsyun.marschat.online | root | Hwx@1120930 |"
    echo "| Shadowsocks | 49.51.245.134:8388 | — | password0 |"
    echo ""
    echo "## FRP"
    echo "| 项目 | 值 |"
    echo "|------|-----|"
    echo "| FRP Token | YourStrongToken! |"
    echo "| 服务端 | 120.26.66.182:7000 |"
} > "$QUANT_DIR/07-账密汇总.md"
log "✅ 账密汇总已完成"

# 2.2 端口速查表
log "--- 生成端口速查表 ---"
{
    echo "# 端口速查表"
    echo ""
    echo "| 端口 | 机器 | 服务 | 对外 | 说明 |"
    echo "|------|------|------|------|------|"
    echo "| 22 | 内网 Debian | SSH | 3383(FRP) | root01/root01 |"
    echo "| 443 | 腾讯云2号 | Nginx HTTPS | ✅ | Let's Encrypt |"
    echo "| 7890 | 内网 Debian | Clash | ❌ | 代理客户端 |"
    echo "| 7890 | 阿里云 | Clash | ❌ | 代理客户端 |"
    echo "| 3306 | 内网 Debian | MySQL | ❌ | root/Hwx@1120930 |"
    echo "| 3381 | 腾讯云2号→旧Win | RDP | ✅ | stream 转发 |"
    echo "| 3382 | 腾讯云2号→旧Win | SSH | ✅ | stream 转发 |"
    echo "| 3383 | 阿里云→内网 Debian | SSH | ✅ | FRP 隧道 |"
    echo "| 5000 | 龙虾主机 | Docker Registry | ❌ | 仅本机 |"
    echo "| 7000 | 阿里云 | FRP 服务端 | ❌ | 绑定端口 |"
    echo "| 7500 | 阿里云 | FRP 仪表盘 | ❌ | admin/MySecure... |"
    echo "| 8081 | 阿里云 | Nexus | ✅ | 反代到腾讯云2号 |"
    echo "| 8388 | 龙虾主机 | Shadowsocks | ✅ | 代理出口 |"
    echo "| 10000 | 内网 Debian | HiveServer2 | ❌ | JDBC/Thrift |"
    echo "| 12346 | 内网 Debian | DolphinScheduler | 18083(FRP) | admin/dolphinscheduler123 |"
    echo "| 18080 | 内网 Debian | 激活码(正式) | ✅ | admin/admin123 |"
    echo "| 18081 | 内网新 Windows | 激活码(测试) | ✅ | admin/admin123 |"
    echo "| 18083 | 阿里云→内网 Debian | DS | ✅ | FRP 隧道 |"
} > "$QUANT_DIR/05-端口速查表.md"
log "✅ 端口速查表已完成"

# 2.3 域名映射
log "--- 生成域名映射 ---"
{
    echo "# 域名映射表"
    echo ""
    echo "| 域名 | 解析到 | 用途 | SSL |"
    echo "|------|--------|------|-----|"
    echo "| tools.marschat.online | 腾讯云2号(1.117.70.30) | DS + 激活码 | ✅ |"
    echo "| tools-test.marschat.online | 腾讯云2号(1.117.70.30) | 激活码测试 | ✅ |"
    echo "| nexus.marschat.online | 腾讯云2号(1.117.70.30) | Nexus 仓库 | ✅ |"
    echo "| aliyun.marschat.online | 阿里云(120.26.66.182) | FRP 服务端 | ❌ |"
    echo "| hsyun.marschat.online | 火山云(115.190.161.88) | PyPI 私服 | ❌ |"
} > "$QUANT_DIR/08-域名映射.md"
log "✅ 域名映射已完成"

# 2.4 应用依赖关系
log "--- 生成应用依赖关系 ---"
{
    echo "# 应用依赖关系"
    echo ""
    echo "## 核心依赖"
    echo ""
    echo "┌─ 用户访问 ─────────────────────────┐"
    echo "│  https://tools.marschat.online       │"
    echo "│         ↓ (DNS: 腾讯云2号)            │"
    echo "│  Nginx 反代 (:443)                    │"
    echo "│         ↓                              │"
    echo "│  阿里云 FRP 服务端 (:18080/18083)     │"
    echo "│         ↓ (FRP 隧道)                   │"
    echo "│  内网 Debian                           │"
    echo "│    ├── DS Standalone → HiveServer2    │"
    echo "│    └── ActiveCode → MySQL              │"
    echo "└───────────────────────────────────────┘"
    echo ""
    echo "### 详细依赖"
    echo "- DS → HiveServer2 (JDBC :10000)"
    echo "- DS → MySQL (元数据存储)"
    echo "- 激活码 → MySQL (业务数据)"
    echo "- 腾讯云2号 Nginx → 阿里云 FRP (反代)"
    echo "- 阿里云 Clash → 龙虾 Shadowsocks (代理出口)"
    echo "- 内网 Debian Clash → 龙虾 Shadowsocks (代理出口)"
} > "$QUANT_DIR/04-应用依赖关系.md"
log "✅ 应用依赖关系已完成"

# 2.5 运维命令速查
log "--- 生成运维命令速查 ---"
{
    echo "# 运维命令速查"
    echo ""
    echo "## SSH 入口"
    echo '```bash'
    echo "# 内网 Debian（通过 FRP 隧道）"
    echo "sshpass -p 'root01' ssh -p 3383 root01@120.26.66.182"
    echo ""
    echo "# 腾讯云2号"
    echo "sshpass -p 'Hwx@1120930' ssh root@1.117.70.30"
    echo ""
    echo "# 阿里云"
    echo "sshpass -p 'Hwx@1120930' ssh root@120.26.66.182"
    echo '```'
    echo ""
    echo "## 服务管理"
    echo '```bash'
    echo "# FRP 服务端（阿里云）"
    echo "systemctl restart frps"
    echo ""
    echo "# FRP 客户端（内网 Debian）"
    echo "echo 'root01' | sudo -S systemctl restart frpc"
    echo ""
    echo "# DS"
    echo "cd ~/dolphinscheduler && docker compose up -d"
    echo "docker logs ds-standalone --tail 50"
    echo ""
    echo "# Hive"
    echo "cd ~/hive-compose && docker compose up -d"
    echo "docker exec hive-server2 /opt/hive/bin/beeline -u jdbc:hive2://localhost:10000"
    echo ""
    echo "# Nginx（腾讯云2号）"
    echo "nginx -t && systemctl reload nginx"
    echo ""
    echo "# Clash"
    echo "systemctl restart clash-meta"
    echo "curl -x http://127.0.0.1:7890 https://www.google.com -o /dev/null -w '%{http_code}'"
    echo '```'
    echo ""
    echo "## 验证命令"
    echo '```bash'
    echo "# 代理是否正常"
    echo "curl -x http://127.0.0.1:7890 https://www.google.com -o /dev/null -w '%{http_code}'"
    echo ""
    echo "# Docker 容器状态"
    echo "docker ps --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}'"
    echo ""
    echo "# 端口监听"
    echo "ss -tlnp | grep -E '10000|12346|3306|8081|18080'"
    echo '```'
} > "$QUANT_DIR/06-运维命令速查.md"
log "✅ 运维命令速查已完成"

# 2.6 知识交叉索引
log "--- 生成知识交叉索引 ---"
{
    echo "# 知识交叉索引"
    echo ""
    echo "## 核心文档索引"
    echo ""
    echo "| 文档 | 位置 | 状态 |"
    echo "|------|------|------|"
    echo "| 知识时光机方案 | 知识/知识时光机方案_20260603.md | ✅ 现行 |"
    echo "| 整体架构总览 | 知识/整体架构总览_20260603.md | ✅ 现行 |"
    echo "| 网络架构图（旧）| 知识/网络架构图_20260525.md | ⚠️ 已过时 |"
    echo "| 连接信息 | 备忘录/连接信息_2026051017.md | ✅ 现行 |"
    echo "| DS 部署方案 | 知识/DolphinScheduler部署方案_20260603.md | ✅ 现行 |"
    echo "| DS 连接信息 | 备忘录/DolphinScheduler连接信息_20260603.md | ✅ 现行 |"
    echo "| 小桉工作规则 | 小桉工作规则.md | ✅ 现行 |"
    echo ""
    echo "## 矛盾项"
    echo ""
    echo "| 检测项 | 状态 | 说明 |"
    echo "|-------|------|------|"
    echo "| Windows 账密 | ❌ 缺失 | 新旧 Windows 均未记录登录账密 |"
    echo "| 网络架构图 | ⚠️ 已标记过期 | 5.25版未包含 DS |"
} > "$QUANT_DIR/09-知识交叉索引.md"
log "✅ 知识交叉索引已完成"

# 2.7 渲染架构图
log "--- 渲染架构图 ---"

MMDC_CMD="mmdc -b white -p /home/liangzi/document/知识时光机/puppeteer-config.json"
MERMAID_DIR="/home/liangzi/tools/mermaid"

if command -v mmdc &>/dev/null; then
    if [ -f "$MERMAID_DIR/01-网络架构图.mmd" ]; then
        $MMDC_CMD -i "$MERMAID_DIR/01-网络架构图.mmd" -o "$QUANT_DIR/01-网络架构图.png" -w 1200 2>&1 | grep -v "^Generating" || true
        log "✅ 网络架构图已渲染（mmdc）"
    else
        log "⚠️ mermaid 源文件不存在: 01-网络架构图.mmd"
    fi

    if [ -f "$MERMAID_DIR/02-服务拓扑图.mmd" ]; then
        $MMDC_CMD -i "$MERMAID_DIR/02-服务拓扑图.mmd" -o "$QUANT_DIR/02-服务拓扑图.png" -w 1000 2>&1 | grep -v "^Generating" || true
        log "✅ 服务拓扑图已渲染（mmdc）"
    else
        log "⚠️ mermaid 源文件不存在: 02-服务拓扑图.mmd"
    fi

    if [ -f "$MERMAID_DIR/03-网络流量图.mmd" ]; then
        $MMDC_CMD -i "$MERMAID_DIR/03-网络流量图.mmd" -o "$QUANT_DIR/03-网络流量图.png" -w 1200 2>&1 | grep -v "^Generating" || true
        log "✅ 网络流量图已渲染（mmdc）"
    fi
else
    log "⚠️ mmdc 未安装，架构图跳过渲染"
fi

# 同时保留文本版流量图做备用
{
    echo "# 网络流量图（文本版）"
    echo ""
    echo "## 出网链路（内→外）"
    echo ""
    echo '```'
    echo "内网 Debian → Clash(:7890) → 龙虾 Shadowsocks(:8388) → 公网"
    echo "阿里云     → Clash(:7890) → 龙虾 Shadowsocks(:8388) → 公网"
    echo "内网 Debian → 家庭宽带直连 → 国内网站"
    echo "阿里云     → 公网直连 → 国内网站"
    echo '```'
    echo ""
    echo "## 入网链路（外→内）"
    echo ""
    echo '```'
    echo "用户 → tools.marschat.online"
    echo "  → 腾讯云2号 Nginx(:443)"
    echo "  → 阿里云 FRPS(:18080/18083)"
    echo "  → FRP 隧道"
    echo "  → 内网 Debian (DS/激活码)"
    echo '```'
    echo ""
    echo "## FRP 隧道总览"
    echo ""
    echo "| 公网端口 | 内网目标 | 协议 | 用途 |"
    echo "|---------|---------|------|------|"
    echo "| 3381 | 旧 Win :3389 | TCP | RDP |"
    echo "| 3382 | 旧 Win :22 | TCP | SSH |"
    echo "| 3383 | Debian :22 | TCP | SSH |"
    echo "| 18080 | Debian :18080 | KCP | 激活码(正式) |"
    echo "| 18081 | 新 Win :18081 | TCP | 激活码(测试) |"
    echo "| 18083 | Debian :12346 | TCP | DolphinScheduler |"
} > "$QUANT_DIR/03-网络流量图.md"
log "✅ 网络流量图（文本版）已完成"

log ""
log "=== 阶段2 完成 ==="

# ==============================================
# 阶段3: 产出现 README
# ==============================================
log ""
log "=== 阶段3: 产出 README ==="

{
    echo "# 📸 知识时光机 — $DATE_TAG"
    echo ""
    echo "## 本期摘要"
    echo ""
    if [ -f "$MEMORY_FILE" ]; then
        echo "**今日有操作记录**，详见 [增量部分/当天操作日志.md](./增量部分/当天操作日志.md)"
    else
        echo "**今日无操作记录**"
    fi
    echo ""
    echo "## 增量部分"
    echo "- [当天操作日志](./增量部分/当天操作日志.md)"
    echo "- [变更记录](./增量部分/变更记录.md)"
    echo "- [矛盾提醒](./增量部分/矛盾提醒.md)"
    echo "- [小桉规则检查](./增量部分/小桉规则检查.md)"
    echo ""
    echo "## 全量部分"
    echo "- [01-网络架构图](./全量部分/01-网络架构图.png)"
    echo "- [02-服务拓扑图](./全量部分/02-服务拓扑图.png)"
    echo "- [03-网络流量图](./全量部分/03-网络流量图.png) 🖼️ + [文本版](./全量部分/03-网络流量图.md)"
    echo "- [04-应用依赖关系](./全量部分/04-应用依赖关系.md)"
    echo "- [05-端口速查表](./全量部分/05-端口速查表.md)"
    echo "- [06-运维命令速查](./全量部分/06-运维命令速查.md)"
    echo "- [07-账密汇总](./全量部分/07-账密汇总.md)"
    echo "- [08-域名映射](./全量部分/08-域名映射.md)"
    echo "- [09-知识交叉索引](./全量部分/09-知识交叉索引.md)"
    echo ""
    echo "## 待办"
    echo "- 🪟 补充内网 Windows 登录账密"
    echo "- 🖥️ 补充内网旧 Windows 登录账密"
} > "$TIMEMACHINE_DIR/README.md"

log "✅ README 已完成"

# ==============================================
# 完成
# ==============================================
log ""
log "========================"
log "✅ 知识时光机执行完毕"
log "📂 输出: $TIMEMACHINE_DIR"
log "========================"

# 输出摘要
echo ""
echo "===== 知识时光机摘要 ====="
echo "📂 $TIMEMACHINE_DIR"
echo "├── 增量部分/"
ls "$TIMEMACHINE_DIR/增量部分/" 2>/dev/null
echo "├── 全量部分/"
ls "$TIMEMACHINE_DIR/全量部分/" 2>/dev/null
echo "└── README.md"
echo "=========================="
