#!/bin/bash
# pull_artifacts.sh — download benchmark artifacts (galleries, montage frames) from
# the Gitea generic package registry. Counterpart to push_artifacts.sh.
#
# Downloads are public (no token needed) as long as the repo/packages are public.
# Resolving "latest" needs GITEA_TOKEN (the list-packages endpoint requires auth
# on this instance even for a public account) — export it before using "latest".
#
# Usage:
#   scripts/artifacts/pull_artifacts.sh galleries [version]
#   scripts/artifacts/pull_artifacts.sh montage-frames <film-slug> [version]
#   scripts/artifacts/pull_artifacts.sh experiment-data [version]
#   scripts/artifacts/pull_artifacts.sh report-highlights <name> [version]
# version defaults to "latest" (newest uploaded version, by created_at).
set -euo pipefail

REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
OWNER="dtourolle"
# NOTE: file download lives under /api/packages/ (no /v1/); listing/metadata
# lives under the regular /api/v1/packages/ REST API. Different base paths,
# both real — see push_artifacts.sh's comment.
DL_BASE="https://gitea.tourolle.paris/api/packages/${OWNER}"

resolve_latest_version() {
    local package="$1"
    if [ -z "${GITEA_TOKEN:-}" ]; then
        echo "error: resolving 'latest' needs GITEA_TOKEN (list-packages requires auth here)." >&2
        echo "  export GITEA_TOKEN=... or pass an explicit version instead of 'latest'." >&2
        exit 1
    fi
    curl -sf "https://gitea.tourolle.paris/api/v1/packages/${OWNER}" \
        -H "Authorization: token ${GITEA_TOKEN}" \
        | python3 -c "
import json, sys
d = json.load(sys.stdin)
matches = [p for p in d if p['name'] == '$package' and p['type'] == 'generic']
if not matches:
    sys.exit('no versions found for package \'$package\'')
matches.sort(key=lambda p: p['created_at'])
print(matches[-1]['version'])
"
}

pull_galleries() {
    local version="$1"
    local dest="${REPO_ROOT}/experiments/galleries"
    mkdir -p "$dest"
    echo "=== galleries (version ${version}) ==="
    for model in arcface_w600k_r50 arcface_r18 arcface_w600k_mbf LVFace-B_Glint360K; do
        local f="gallery_${model}.h5"
        echo "  fetching ${f}..."
        curl -sf "${DL_BASE}/generic/galleries/${version}/${f}" \
            -o "${dest}/${f}" || echo "    [warn] ${f} not found at version ${version}"
    done
}

pull_montage_frames() {
    local version="$1" film="$2"
    local dest="${REPO_ROOT}/experiments/results/holdout/montage_bestworst"
    mkdir -p "$dest"
    echo "=== montage-frames/${film} (version ${version}) ==="
    local tmp; tmp="$(mktemp)"
    curl -sf "${DL_BASE}/generic/montage-frames/${version}/${film}.zip" -o "$tmp"
    mkdir -p "${dest}/${film}"
    unzip -qo "$tmp" -d "${dest}/${film}"
    rm "$tmp"
}

pull_experiment_data() {
    local version="$1"
    echo "=== experiment-data (version ${version}) ==="
    local tmp; tmp="$(mktemp)"
    curl -sf "${DL_BASE}/generic/experiment-data/${version}/experiment-data.zip" -o "$tmp"
    unzip -qo "$tmp" -d "$REPO_ROOT"
    rm "$tmp"
}

pull_report_highlight() {
    local version="$1" name="$2"
    local dest="${REPO_ROOT}/docs/assets/images"
    mkdir -p "$dest"
    echo "=== report-highlights/${name} (version ${version}) ==="
    curl -sf "${DL_BASE}/generic/report-highlights/${version}/${name}" -o "${dest}/${name}"
}

if [ $# -eq 0 ]; then
    echo "usage: $0 galleries [version]" >&2
    echo "       $0 montage-frames <film-slug> [version]" >&2
    echo "       $0 experiment-data [version]" >&2
    echo "       $0 report-highlights <name> [version]" >&2
    exit 1
fi

TARGET="$1"
case "$TARGET" in
    galleries)
        VERSION="${2:-latest}"
        [ "$VERSION" = "latest" ] && VERSION="$(resolve_latest_version galleries)"
        pull_galleries "$VERSION"
        ;;
    montage-frames)
        FILM="${2:?usage: $0 montage-frames <film-slug> [version]}"
        VERSION="${3:-latest}"
        [ "$VERSION" = "latest" ] && VERSION="$(resolve_latest_version montage-frames)"
        pull_montage_frames "$VERSION" "$FILM"
        ;;
    experiment-data)
        VERSION="${2:-latest}"
        [ "$VERSION" = "latest" ] && VERSION="$(resolve_latest_version experiment-data)"
        pull_experiment_data "$VERSION"
        ;;
    report-highlights)
        NAME="${2:?usage: $0 report-highlights <name> [version]}"
        VERSION="${3:-latest}"
        [ "$VERSION" = "latest" ] && VERSION="$(resolve_latest_version report-highlights)"
        pull_report_highlight "$VERSION" "$NAME"
        ;;
    *)
        echo "unknown target: $TARGET (expected galleries, montage-frames, experiment-data, or report-highlights)" >&2
        exit 1
        ;;
esac
