#!/usr/bin/env bash

# 在 80 节点安装“OpenAI 403 stale error 自动恢复”定时任务。
# 设计目标：
# 1. 把恢复脚本固定部署到 /srv/sub2api-80/shared/bin；
# 2. 把敏感配置单独写入 /srv/sub2api-80/shared/env/stale-openai-403-recover.env；
# 3. 使用 systemd timer 每 30 分钟执行一次；
# 4. 覆盖前先把旧文件归档到 .trash，禁止直接删除。

set -euo pipefail

BASE_DIR="/srv/sub2api-80/shared"
BIN_DIR="$BASE_DIR/bin"
ENV_DIR="$BASE_DIR/env"
LOG_DIR="$BASE_DIR/logs"
BIN_TARGET="$BIN_DIR/recover_stale_openai_403_accounts.py"
ENV_TARGET="$ENV_DIR/stale-openai-403-recover.env"
SERVICE_NAME="sub2api-stale-openai-403-recover.service"
TIMER_NAME="sub2api-stale-openai-403-recover.timer"
SYSTEMD_DIR="/etc/systemd/system"
SYSTEMD_TRASH_DIR="$SYSTEMD_DIR/.trash"
SHARED_TRASH_DIR="$BASE_DIR/.trash"

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(cd "$SCRIPT_DIR/../../.." && pwd)"
SOURCE_SCRIPT="$REPO_ROOT/tools/admin/recover_stale_openai_403_accounts.py"
SOURCE_SERVICE="$SCRIPT_DIR/$SERVICE_NAME"
SOURCE_TIMER="$SCRIPT_DIR/$TIMER_NAME"

BASE_URL="http://127.0.0.1:8090"
ADMIN_KEY=""
READ_ADMIN_KEY_FROM_STDIN="false"
MODEL_ID="gpt-5.4"
LAST_USED_WITHIN_HOURS="168"

usage() {
  cat <<'EOF'
用法：
  sudo ./install-stale-openai-403-recover-timer.sh --admin-key <管理员APIKey> [--base-url <URL>] [--model-id <模型>] [--last-used-within-hours <小时>]
  printf '%s' '<管理员APIKey>' | sudo ./install-stale-openai-403-recover-timer.sh --admin-key-stdin

参数：
  --admin-key                必填。写入 80/sub2api-stale-openai-403/SUBLB_PROD_ADMIN_API_KEY
  --admin-key-stdin          可选。从标准输入读取管理员 API Key，避免出现在进程参数里
  --base-url                 可选。默认 http://127.0.0.1:8090
  --model-id                 可选。默认 gpt-5.4
  --last-used-within-hours   可选。默认 168
  -h, --help                 显示帮助

说明：
  1. 安装脚本会把旧的脚本 / env / service / timer 先归档到 .trash
  2. 安装完成后会 enable --now timer
  3. 你仍然可以手工触发一次 service 做即时恢复
EOF
}

backup_if_exists() {
  local target="$1"
  local trash_dir="$2"
  if [[ -e "$target" ]]; then
    mkdir -p "$trash_dir"
    mv "$target" "$trash_dir/$(basename "$target").$(date +%Y%m%d_%H%M%S)"
  fi
}

while [[ $# -gt 0 ]]; do
  case "$1" in
    --admin-key)
      ADMIN_KEY="${2:-}"
      shift 2
      ;;
    --admin-key-stdin)
      READ_ADMIN_KEY_FROM_STDIN="true"
      shift
      ;;
    --base-url)
      BASE_URL="${2:-}"
      shift 2
      ;;
    --model-id)
      MODEL_ID="${2:-}"
      shift 2
      ;;
    --last-used-within-hours)
      LAST_USED_WITHIN_HOURS="${2:-}"
      shift 2
      ;;
    -h|--help)
      usage
      exit 0
      ;;
    *)
      echo "[错误] 未知参数：$1" >&2
      usage
      exit 1
      ;;
  esac
done

if [[ "$READ_ADMIN_KEY_FROM_STDIN" == "true" ]]; then
  IFS= read -r ADMIN_KEY
fi

if [[ -z "$ADMIN_KEY" ]]; then
  echo "[错误] 必须提供 --admin-key 或 --admin-key-stdin" >&2
  exit 1
fi

if [[ "$(id -u)" -ne 0 ]]; then
  echo "[错误] 请用 sudo/root 执行" >&2
  exit 1
fi

[[ -f "$SOURCE_SCRIPT" ]] || { echo "[错误] 未找到脚本源文件：$SOURCE_SCRIPT" >&2; exit 1; }
[[ -f "$SOURCE_SERVICE" ]] || { echo "[错误] 未找到 service 模板：$SOURCE_SERVICE" >&2; exit 1; }
[[ -f "$SOURCE_TIMER" ]] || { echo "[错误] 未找到 timer 模板：$SOURCE_TIMER" >&2; exit 1; }

echo "[1/7] 准备目录"
mkdir -p "$BIN_DIR" "$ENV_DIR" "$LOG_DIR" "$SHARED_TRASH_DIR" "$SYSTEMD_TRASH_DIR"

echo "[2/7] 归档旧脚本和旧环境文件"
backup_if_exists "$BIN_TARGET" "$SHARED_TRASH_DIR"
backup_if_exists "$ENV_TARGET" "$SHARED_TRASH_DIR"

echo "[3/7] 安装恢复脚本"
install -m 0755 "$SOURCE_SCRIPT" "$BIN_TARGET"

echo "[4/7] 写入环境文件"
umask 077
cat > "$ENV_TARGET" <<EOF
SUBLB_PROD_BASE_URL=$BASE_URL
SUBLB_PROD_ADMIN_API_KEY=$ADMIN_KEY
DEFAULT_MODEL_ID=$MODEL_ID
LAST_USED_WITHIN_HOURS=$LAST_USED_WITHIN_HOURS
EOF
chown admin:admin "$ENV_TARGET"
chmod 0600 "$ENV_TARGET"

echo "[5/7] 归档旧 systemd 单元并安装新单元"
backup_if_exists "$SYSTEMD_DIR/$SERVICE_NAME" "$SYSTEMD_TRASH_DIR"
backup_if_exists "$SYSTEMD_DIR/$TIMER_NAME" "$SYSTEMD_TRASH_DIR"
install -m 0644 "$SOURCE_SERVICE" "$SYSTEMD_DIR/$SERVICE_NAME"
install -m 0644 "$SOURCE_TIMER" "$SYSTEMD_DIR/$TIMER_NAME"

echo "[6/7] 重载并启用 timer"
systemctl daemon-reload
systemctl enable --now "$TIMER_NAME"

echo "[7/7] 当前状态"
systemctl --no-pager --full status "$TIMER_NAME" || true
echo "---"
systemctl --no-pager --full status "$SERVICE_NAME" || true

cat <<'EOF'

下一步建议：
1. 手工触发一次：
   sudo systemctl start sub2api-stale-openai-403-recover.service
2. 看最近日志：
   sudo journalctl -u sub2api-stale-openai-403-recover.service -n 100 --no-pager
3. 看 timer：
   systemctl list-timers sub2api-stale-openai-403-recover.timer --all

EOF
