#!/usr/bin/env bash
# ========================================
# Git pre-push hook
# ========================================
# Blocks tag pushes unless:
#   1. Tag version matches pyproject.toml version
#   2. Package builds successfully (python -m build)
#
# Install: git config core.hooksPath .githooks

set -euo pipefail

RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'

# Save stdin (ref list) before it's consumed
SAVED_STDIN=$(mktemp)
trap 'rm -f "$SAVED_STDIN"' EXIT
cat > "$SAVED_STDIN"

# Check if any tags are being pushed
TAGS_PUSHED=()
while read -r local_ref local_oid remote_ref remote_oid; do
    if [[ "$remote_ref" == refs/tags/* ]]; then
        TAGS_PUSHED+=("${remote_ref#refs/tags/}")
    fi
done < "$SAVED_STDIN"

# No tags being pushed — allow
if [[ ${#TAGS_PUSHED[@]} -eq 0 ]]; then
    exit 0
fi

echo -e "${YELLOW}[pre-push]${NC} Tag push detected: ${TAGS_PUSHED[*]}"

# Read pyproject.toml version
if [[ ! -f pyproject.toml ]]; then
    echo -e "${RED}[pre-push]${NC} pyproject.toml not found" >&2
    exit 1
fi

PKG_VERSION=$(grep -m1 '^version' pyproject.toml | sed 's/.*"\(.*\)"/\1/')

# Validate each tag
for TAG in "${TAGS_PUSHED[@]}"; do
    TAG_VERSION="${TAG#v}"
    if [[ "$TAG_VERSION" != "$PKG_VERSION" ]]; then
        echo -e "${RED}[pre-push]${NC} Tag version ($TAG_VERSION) != pyproject.toml version ($PKG_VERSION)" >&2
        echo -e "${RED}[pre-push]${NC} Update pyproject.toml first, then re-tag." >&2
        exit 1
    fi
done

echo -e "${GREEN}[pre-push]${NC} Version check passed: v$PKG_VERSION"

# Build check
echo -e "${YELLOW}[pre-push]${NC} Building package..."
BUILD_OUTDIR=$(mktemp -d)
trap 'rm -f "$SAVED_STDIN"; rm -rf "$BUILD_OUTDIR"' EXIT
if command -v uv &>/dev/null; then
    BUILD_CMD="uv build -o $BUILD_OUTDIR"
elif python3 -c "import build" 2>/dev/null; then
    BUILD_CMD="python3 -m build --outdir $BUILD_OUTDIR"
else
    echo -e "${RED}[pre-push]${NC} Neither 'uv' nor 'python3 -m build' available. Install one to enable build check." >&2
    exit 1
fi
if ! $BUILD_CMD 2>&1; then
    echo -e "${RED}[pre-push]${NC} Build failed. Fix errors before pushing tag." >&2
    exit 1
fi

echo -e "${GREEN}[pre-push]${NC} Build succeeded. Pushing tag..."
exit 0
