#!/bin/bash
# 私有通道清单的手动操作（只改清单，不传包）：
#   rollout.sh promote    current 立即全量（去掉灰度）——紧急修复用；平时满 promoteAfterHours 云端自己当全量
#   rollout.sh rollback   current 换成 previous 并全量。只管还没升上去的设备：已经装了新版的设备默认拒绝降级，
#                         不会自己退回去，要按 RUNBOOK.md「回滚」那三种办法处理
# 环境变量：BUCKET、CHANNEL（默认 stable）
set -euo pipefail
ACTION=${1:?promote|rollback}
: "${BUCKET:?}"
CHANNEL=${CHANNEL:-stable}
WORK=$(mktemp -d); trap 'rm -rf "$WORK"' EXIT
# shellcheck source=manifest-s3.sh
. "$(dirname "$0")/manifest-s3.sh"
decide(){
  python3 - "$WORK/old.json" "$WORK/new.json" "$ACTION" <<'PY'
import json, sys, datetime
src, dst, action = sys.argv[1:4]
m = json.load(open(src))
now = datetime.datetime.now(datetime.timezone.utc).isoformat(timespec='seconds').replace('+00:00', 'Z')
strip = lambda e: {k: v for k, v in e.items() if k not in ('rollout', 'rolloutStartedAt', 'promoteAfterHours')}
cur, prev = m.get('current'), m.get('previous')
if not cur:
    sys.exit('清单里没有 current')
if action == 'promote':
    if 'rollout' not in cur:
        print('%s 已经是全量' % cur['version']); sys.exit(0)
    m['current'] = strip(cur)
    print('%s 立即全量' % cur['version'])
elif action == 'rollback':
    if not prev:
        sys.exit('清单里没有 previous，不能回滚')
    m['current'] = strip(prev); m.pop('previous', None)
    print('回滚：%s -> %s（全量）' % (cur['version'], prev['version']))
else:
    sys.exit('未知操作 %s' % action)
m['generatedAt'] = now
json.dump(m, open(dst, 'w'), indent=2, ensure_ascii=False)
PY
}
with_manifest "$CHANNEL" decide
