#!/usr/bin/env bash
set -euo pipefail

if [ $# -ne 1 ]; then
    echo "Usage: $0 <version>"
    echo "  e.g. $0 0.2.0"
    exit 1
fi

VERSION="$1"

# Validate semver
if ! echo "$VERSION" | grep -qP '^\d+\.\d+\.\d+$'; then
    echo "error: version must be semver (e.g. 0.2.0)"
    exit 1
fi

# Must be on main
BRANCH=$(git rev-parse --abbrev-ref HEAD)
if [ "$BRANCH" != "main" ]; then
    echo "error: releases must be made from main (currently on $BRANCH)"
    exit 1
fi

# Working tree must be clean
if ! git diff --stat --exit-code; then
    echo "error: working tree has uncommitted changes"
    exit 1
fi
if ! git diff --cached --stat --exit-code; then
    echo "error: staged but uncommitted changes"
    exit 1
fi

# Tag must not already exist
if git tag -l "v$VERSION" | grep -q .; then
    echo "error: tag v$VERSION already exists"
    exit 1
fi

echo "==> Bumping version to $VERSION in Cargo.toml"
sed -i "s/^version = \".*\"/version = \"$VERSION\"/" Cargo.toml

echo "==> Running cargo test"
cargo test 2>&1 | tail -5

echo "==> Running cargo build --release"
cargo build --release 2>&1 | tail -3

echo "==> Committing release: v$VERSION"
git add Cargo.toml Cargo.lock
git commit -m "release: v$VERSION"

echo "==> Tagging v$VERSION"
git tag -a "v$VERSION" -m "release: v$VERSION"

echo ""
echo "Release v$VERSION ready."
echo "To publish:  git push --tags origin main"
echo "To undo:     git tag -d v$VERSION && git reset --soft HEAD~1"
