#!/usr/bin/env bash
# shellcheck shell=bash
set -euxo pipefail

released_versions="$(git tag --list | grep -E '^v[0-9]+\.[0-9]+\.[0-9]+(-rc\.[0-9]+)?$')"
cur_version="$(cargo pkgid usage-lib | cut -d# -f2 | cut -d@ -f2)"
if ! echo "$released_versions" | grep -q "^v$cur_version$"; then
  echo "Releasing $cur_version"
  if [ "${usage_dry_run:-}" != 1 ]; then
    cargo publish -p usage-lib
    cargo publish -p usage-cli
    git tag "v$cur_version"
    git push --tags
  fi
  exit 0
fi

version="$(git cliff --bumped-version)"

if [ "${usage_dry_run:-}" == 1 ]; then
  echo "version: $version"
  changelog="$(git cliff --bump --unreleased --strip all)"
  echo "changelog: $changelog"
  exit 0
fi

# Generate changelog using git-cliff (LLM editorialization happens in release.yml after merge)
git cliff --bump -o CHANGELOG.md

# Get the unreleased notes for PR body
# Strip version header since PR title already has version
PR_BODY="$(git cliff --bump --unreleased --strip all | tail -n +3)"

cargo set-version "${version#v}" --exclude clap_usage
mise run render
mise run lint-fix

git config user.name mise-en-dev
git config user.email 123107610+mise-en-dev@users.noreply.github.com
cargo update
aube update
git add \
  {./,cli/,lib/}Cargo.* \
  package.json aube-lock.yaml \
  cli/usage.usage.kdl \
  docs/cli/reference/* \
  CHANGELOG.md
git checkout -B release
git commit -m "chore: release $version"
git push origin release --force

if [[ "$(gh pr list --label release)" == "" ]]; then
  gh pr create --title "chore: release $version" --body "$PR_BODY" --label "release" --head release
else
  gh pr edit --title "chore: release $version" --body "$PR_BODY"
fi
