#!/usr/bin/env bash
#
# Build combined v1 + v2 documentation for GitHub Pages.
#
# v1 docs (from the v1.x branch) are placed at the site root.
# v2 docs (from main) are placed under /v2/.
#
# The two lines use different toolchains: v1.x still builds with MkDocs, while
# main builds with Zensical (which needs a pre-build step to materialise the API
# reference and a post-build step for llms.txt — see scripts/docs/). Each branch
# is fetched fresh from origin and built with its own synced `docs` group, so
# the output is identical regardless of which branch triggered the workflow.
# This script is intended to run in CI; for a local v2 preview use
# `scripts/serve-docs.sh`.
#
# Usage:
#   scripts/build-docs.sh [output-dir]
#
# Default output directory: site
#
set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
OUTPUT_DIR="$(cd "$REPO_ROOT" && mkdir -p "${1:-site}" && cd "${1:-site}" && pwd)"
V1_WORKTREE="$REPO_ROOT/.worktrees/v1-docs"
V2_WORKTREE="$REPO_ROOT/.worktrees/v2-docs"

cleanup() {
    cd "$REPO_ROOT"
    git worktree remove --force "$V1_WORKTREE" 2>/dev/null || true
    git worktree remove --force "$V2_WORKTREE" 2>/dev/null || true
    rmdir "$REPO_ROOT/.worktrees" 2>/dev/null || true
}
trap cleanup EXIT

# Build the checked-out worktree into its local `site/`, picking the toolchain
# from the branch's own files rather than hard-coding it here: a branch that
# ships the Zensical build recipe (scripts/docs/build.sh) builds with it,
# otherwise it falls back to MkDocs. This keeps the combined build correct
# regardless of which branch triggered it. Zensical requires site_dir to live
# within the project root, so both paths build to the local `site/` and let
# the caller copy it to its destination.
build_site() {
    if [[ -f scripts/docs/build.sh ]]; then
        bash scripts/docs/build.sh
    else
        uv sync --frozen --group docs
        NO_MKDOCS_2_WARNING=1 uv run --frozen --no-sync mkdocs build --site-dir site
    fi
}

build_branch() {
    local branch="$1" worktree="$2" dest="$3"

    echo "=== Building docs for ${branch} ==="
    git fetch origin "$branch"
    git worktree remove --force "$worktree" 2>/dev/null || true
    rm -rf "$worktree"
    git worktree add --detach "$worktree" "origin/${branch}"

    (
        cd "$worktree"
        rm -rf site
        build_site
        mkdir -p "$dest"
        cp -a site/. "$dest/"
    )
}

rm -rf "${OUTPUT_DIR:?}"/*

build_branch v1.x "$V1_WORKTREE" "$OUTPUT_DIR"
build_branch main "$V2_WORKTREE" "$OUTPUT_DIR/v2"

echo "=== Combined docs built at $OUTPUT_DIR ==="
