#!/bin/sh
# =============================================================================
# freshen-channel — rebuild a tool's alpha or beta channel from its current
# stable tag, so users tracking that channel are never on code older than
# current stable.
#
# Usage:
#   ./freshen-channel <tool> <channel>
#     tool     archive | transmittal | classifier | mdedit | landing
#     channel  alpha | beta
#
# Why this exists:
#   Stable releases do NOT automatically clobber alpha/beta files (see
#   AGENTS.md "Channel discipline" rule 4). After cutting stable v0.0.5,
#   users pinned to alpha may be on an older build than current stable —
#   that violates the stale-channel rule. Run this to drag alpha (or
#   beta) forward to whatever stable currently is.
#
# What it does:
#   1. Finds the latest <tool>-v* tag.
#   2. Creates a temporary git worktree at that tag — does NOT touch
#      your current branch or working tree.
#   3. Runs <tool>/build.sh --release <channel> inside the worktree.
#   4. Copies the resulting <tool>_<channel>.html into the main repo's
#      website/releases/.
#   5. Removes the worktree.
#
# The on-page label of the freshened build will be
# `<channel> · <today> · <stable-tag-sha>` — the SHA encodes which
# stable was used as the source, so anyone debugging can `git checkout`
# that exact commit.
#
# Note: the build pipeline used is the one AT THE TAG, not the latest
# main. That is intentional — pure reproducibility. If you have made
# build-system improvements since stable was cut and want the freshen
# to use them, cut a new stable that includes those changes first.
# =============================================================================
set -eu

TOOL="${1:-}"
CHANNEL="${2:-}"

case "$TOOL" in
    archive | transmittal | classifier | mdedit | landing) ;;
    *)
        echo "usage: $0 <tool> <channel>" >&2
        echo "       tool: archive | transmittal | classifier | mdedit | landing" >&2
        exit 1
        ;;
esac

case "$CHANNEL" in
    alpha | beta) ;;
    *)
        echo "usage: $0 <tool> <channel>" >&2
        echo "       channel: alpha | beta  (stable is what you are freshening FROM)" >&2
        exit 1
        ;;
esac

REPO=$(cd "$(dirname "$0")" && pwd)

# Find the latest stable tag for the tool.
LATEST_TAG=$(git -C "$REPO" tag --list "${TOOL}-v*" --sort=-v:refname | head -1)
if [ -z "$LATEST_TAG" ]; then
    echo "error: no stable tag found for ${TOOL} (looking for ${TOOL}-v*)" >&2
    echo "       cut a stable release first: sh ${TOOL}/build.sh --release [version]" >&2
    exit 1
fi

# Temporary detached worktree at the stable tag. Cleaned up on exit.
WT=$(mktemp -d)
cleanup() {
    git -C "$REPO" worktree remove --force "$WT" >/dev/null 2>&1 || true
    rm -rf "$WT"
}
trap cleanup EXIT INT TERM

echo "Freshening ${TOOL} ${CHANNEL} from ${LATEST_TAG}"
git -C "$REPO" worktree add --quiet --detach "$WT" "$LATEST_TAG"

# Build in the worktree. The tool's build.sh resolves its release dir
# from $ZDDC_DEPLOY_RELEASES_DIR (default $REPO/dist/release-output);
# pass through whatever the parent process has set so freshen-channel
# honors the same target as the regular build.
DEPLOY_DIR="${ZDDC_DEPLOY_RELEASES_DIR:-$REPO/dist/release-output}"
mkdir -p "$DEPLOY_DIR"
ZDDC_DEPLOY_RELEASES_DIR="$DEPLOY_DIR" \
    sh "$WT/${TOOL}/build.sh" --release "$CHANNEL"

DST="$DEPLOY_DIR/${TOOL}_${CHANNEL}.html"
if [ ! -f "$DST" ]; then
    echo "error: build did not produce $DST" >&2
    exit 1
fi

echo "Wrote $DST"
echo "Done. ${CHANNEL} channel for ${TOOL} now reflects ${LATEST_TAG}."
echo "Run ./deploy --releases to push it to the live site."
