#!/bin/bash
# ═══════════════════════════════════════════════════════════════════════════
# 脚本名：TEMPLATE.sh
# 用途：【示例模板】本 Skill 生成所有脚本必须遵守的结构范本
# 版本：v1.0
# 生成时间：{{ISO8601}}
# 关联审批：{{工单号}}
# ───────────────────────────────────────────────────────────────────────────
# 🟢 安全等级：READ-ONLY（或 🟡 LOW-IMPACT / 🔴 HIGH-RISK）
# 📏 代码行数：{{N}}（只读 ≤50；变更 ≤80；超过必须拆）
# ⏱  Review 预计用时：{{M}} min
# 👀 Review 关注点（≤ 3 条，带行号）：
#   1. 第 X 行：{{关注什么}}
#   2. 第 Y 行：{{关注什么}}
#   3. 第 Z 行：{{关注什么}}
# ⚠️ 可跳过 Review 的行：第 A-B 行（{{原因}}）
# 📋 前置依赖：
#   - openssl >= 1.1.1
#   - {{其他工具}}
# 📦 使用示例：
#   $ export DOMAIN="example.com"
#   $ export RUN_ID="20260423-1400-zhangsan"
#   $ ./TEMPLATE.sh
# 🔁 幂等性：✅ 重跑结果一致（通过 ${RUN_ID} 目录隔离 state）
# ⏪ 回滚脚本：{{N/A 或 rollback-xxx.sh}}
# ═══════════════════════════════════════════════════════════════════════════

set -euo pipefail       # 严格模式：遇错即停、未定义变量报错、管道失败即停
umask 077               # 产生的文件仅当前用户可读（防止私钥泄露到 world-readable）

# ───────────────────────────────────────────────────────────────────────────
# [Section 1/4] 输入校验 ── Review 关注点 #1
# ───────────────────────────────────────────────────────────────────────────
# 所有生产值必须通过环境变量注入，不允许硬编码
DOMAIN="${DOMAIN:?请设置 DOMAIN 环境变量，例如 export DOMAIN=example.com}"
RUN_ID="${RUN_ID:?请设置 RUN_ID，建议格式 YYYYMMDD-HHMM-operator}"

# 前置工具检查（快失败，不要跑一半才发现缺工具）
command -v openssl >/dev/null 2>&1 || { echo "❌ 缺少 openssl"; exit 2; }

# 状态目录：每次 RUN 独立，保证幂等
STATE_DIR="./runs/${RUN_ID}"
mkdir -p "${STATE_DIR}"
LOG_FILE="${STATE_DIR}/run.log"

# 同时输出到 stdout 和日志（审计用）
exec > >(tee -a "${LOG_FILE}") 2>&1

echo "═══ Run ${RUN_ID} 开始 ═══"
echo "脚本：$0"
echo "时间：$(date -Iseconds)"
echo "执行用户：$(whoami)"
echo "工作目录：$(pwd)"

# ───────────────────────────────────────────────────────────────────────────
# [Section 2/4] 幂等检查 ── Review 关注点 #2
# ───────────────────────────────────────────────────────────────────────────
# 每个关键步骤落一个 .done 文件，重跑时跳过
STEP_MARKER="${STATE_DIR}/step_example.done"
if [ -f "${STEP_MARKER}" ]; then
  echo "⏭  已执行过，跳过（如需重做请删除 ${STEP_MARKER}）"
  exit 0
fi

# ───────────────────────────────────────────────────────────────────────────
# [Section 3/4] 核心动作 ── Review 关注点 #3
# ───────────────────────────────────────────────────────────────────────────
# 【示例】查询证书有效期（只读操作）
echo "── 查询证书有效期 ──"
end_date=$(echo | timeout 10 openssl s_client \
  -servername "${DOMAIN}" \
  -connect "${DOMAIN}:443" 2>/dev/null \
  | openssl x509 -noout -enddate 2>/dev/null \
  | cut -d= -f2)

if [ -z "${end_date}" ]; then
  echo "❌ 无法获取 ${DOMAIN} 证书信息"
  exit 10
fi

echo "✅ 证书到期时间：${end_date}"
echo "${end_date}" > "${STATE_DIR}/cert_enddate.txt"

# 成功后打点
touch "${STEP_MARKER}"

# ───────────────────────────────────────────────────────────────────────────
# [Section 4/4] 自验证 ── HP-1 在脚本级落地（展示逻辑，Review 可跳过）
# ───────────────────────────────────────────────────────────────────────────
echo
echo "═══ 自验证 ═══"
echo "【预期】${STATE_DIR}/cert_enddate.txt 存在且非空"

if [ -s "${STATE_DIR}/cert_enddate.txt" ]; then
  echo "✅ 自验证通过"
else
  echo "❌ 自验证失败：输出文件为空"
  exit 20
fi

echo "═══ Run ${RUN_ID} 完成 ═══"
exit 0

# ═══════════════════════════════════════════════════════════════════════════
# 附录：退出码约定（便于上游统一处理）
#   0    成功
#   2    参数或环境错误
#   10   核心动作失败（openssl / 网络等）
#   20   自验证失败（动作成功但结果不符合预期）
#   其他 未分类错误（set -e 自动触发）
# ═══════════════════════════════════════════════════════════════════════════
