#!/usr/bin/env bash
# Download ONNX models required by scene_analyze and build_gallery.
# Run from the project root: bash scripts/download_models.sh

set -euo pipefail

MODELS_DIR="${1:-models}"
mkdir -p "$MODELS_DIR"

# ── YuNet face detection ──────────────────────────────────────────────────────
YUNET_URL="https://github.com/opencv/opencv_zoo/raw/main/models/face_detection_yunet/face_detection_yunet_2023mar.onnx"
YUNET_FILE="$MODELS_DIR/face_detection_yunet_2023mar.onnx"
if [ ! -f "$YUNET_FILE" ]; then
    echo "Downloading YuNet…"
    curl -L "$YUNET_URL" -o "$YUNET_FILE"
else
    echo "YuNet already present: $YUNET_FILE"
fi

# ── ArcFace face recognition (buffalo_l / w600k_r50) ─────────────────────────
# This model is part of InsightFace's buffalo_l pack.
# We download and unpack only the recognition model.
ARCFACE_FILE="$MODELS_DIR/arcface_w600k_r50.onnx"
if [ ! -f "$ARCFACE_FILE" ]; then
    echo "Downloading ArcFace (buffalo_l)…"
    TMP_ZIP=$(mktemp /tmp/buffalo_l.XXXXXX.zip)
    curl -L "https://github.com/deepinsight/insightface/releases/download/v0.7/buffalo_l.zip" \
        -o "$TMP_ZIP"
    # The zip contains: 1k3d68.onnx  2d106det.onnx  det_10g.onnx  genderage.onnx  w600k_r50.onnx
    unzip -jo "$TMP_ZIP" "w600k_r50.onnx" -d "$MODELS_DIR"
    mv "$MODELS_DIR/w600k_r50.onnx" "$ARCFACE_FILE"
    rm "$TMP_ZIP"
else
    echo "ArcFace already present: $ARCFACE_FILE"
fi

# ── ArcFace face recognition (buffalo_s / w600k_mbf — MobileFaceNet) ─────────
# Lighter backbone (13 MB vs 174 MB for R50) — same 512-dim output, faster inference.
ARCFACE_MBF_FILE="$MODELS_DIR/arcface_w600k_mbf.onnx"
if [ ! -f "$ARCFACE_MBF_FILE" ]; then
    echo "Downloading ArcFace MobileFaceNet (buffalo_s)…"
    TMP_ZIP=$(mktemp /tmp/buffalo_s.XXXXXX.zip)
    curl -L "https://github.com/deepinsight/insightface/releases/download/v0.7/buffalo_s.zip" \
        -o "$TMP_ZIP"
    unzip -jo "$TMP_ZIP" "w600k_mbf.onnx" -d "$MODELS_DIR"
    mv "$MODELS_DIR/w600k_mbf.onnx" "$ARCFACE_MBF_FILE"
    rm "$TMP_ZIP"
else
    echo "ArcFace MBF already present: $ARCFACE_MBF_FILE"
fi

# ── SCRFD-500MF face detection (InsightFace buffalo_sc) ───────────────────────
# buffalo_sc.zip contains det_500m.onnx (SCRFD-500MF with 5 keypoints).
# If the unzip fails (file not found in archive), download manually from:
#   https://huggingface.co/deepinsight/insightface/resolve/main/models/buffalo_sc/det_500m.onnx
SCRFD_FILE="$MODELS_DIR/scrfd_500m_bnkps.onnx"
if [ ! -f "$SCRFD_FILE" ]; then
    echo "Downloading SCRFD-500MF (buffalo_sc)…"
    TMP_ZIP=$(mktemp /tmp/buffalo_sc.XXXXXX.zip)
    curl -L "https://github.com/deepinsight/insightface/releases/download/v0.7/buffalo_sc.zip" \
        -o "$TMP_ZIP"
    unzip -jo "$TMP_ZIP" "det_500m.onnx" -d "$MODELS_DIR"
    mv "$MODELS_DIR/det_500m.onnx" "$SCRFD_FILE"
    rm "$TMP_ZIP"
else
    echo "SCRFD-500MF already present: $SCRFD_FILE"
fi

# ── TransNetV2 shot-boundary detection (scene detector, opt-in) ───────────────
# ONNX export (elya5/transnetv2, MIT). Fixed input 1x100x27x48x3 (RGB 0-255),
# primary output "534" = per-frame boundary logits. Used only with --scene-detect.
SCENE_FILE="$MODELS_DIR/transnetv2.onnx"
SCENE_SHA="c4d54a682bace32f25136ef83ca2c9d403e8f8193775efeb995172a0d95a8e0c"
if [ ! -f "$SCENE_FILE" ]; then
    echo "Downloading TransNetV2…"
    curl -L "https://huggingface.co/elya5/transnetv2/resolve/main/transnetv2.onnx" \
        -o "$SCENE_FILE"
    if command -v sha256sum >/dev/null; then
        echo "$SCENE_SHA  $SCENE_FILE" | sha256sum -c - \
            || echo "WARNING: TransNetV2 sha256 mismatch (upstream may have changed)"
    fi
else
    echo "TransNetV2 already present: $SCENE_FILE"
fi

echo ""
echo "Models ready in $MODELS_DIR/:"
ls -lh "$MODELS_DIR"
