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

# Find the latest semver tag (vMAJOR.MINOR.PATCH).
LAST_TAG=$(git tag --sort=-v:refname | grep -E '^v[0-9]+\.[0-9]+\.[0-9]+$' | head -1 || true)

if [ -z "$LAST_TAG" ]; then
    echo "v1.0.0"
    exit 0
fi

COMMITS=$(git log "${LAST_TAG}..HEAD" --pretty=format:"%s%n%b" 2>/dev/null || true)

if [ -z "$COMMITS" ]; then
    echo "$LAST_TAG"
    exit 0
fi

VERSION=${LAST_TAG#v}
BASE_MAJOR=${VERSION%%.*}
REST=${VERSION#*.}
BASE_MINOR=${REST%%.*}
BASE_PATCH=${REST##*.}

BUMP="patch"

if echo "$COMMITS" | grep -qE '(^|[[:space:]])BREAKING CHANGE|^[a-z]+(\([^)]+\))?!:'; then
    BUMP="major"
elif echo "$COMMITS" | grep -qE '^feat(\([^)]+\))?!?:'; then
    BUMP="minor"
fi

case "$BUMP" in
    major)
        NEW_MAJOR=$((BASE_MAJOR + 1))
        NEW_MINOR=0
        NEW_PATCH=0
        ;;
    minor)
        NEW_MAJOR=$BASE_MAJOR
        NEW_MINOR=$((BASE_MINOR + 1))
        NEW_PATCH=0
        ;;
    patch)
        NEW_MAJOR=$BASE_MAJOR
        NEW_MINOR=$BASE_MINOR
        NEW_PATCH=$((BASE_PATCH + 1))
        ;;
esac

echo "v${NEW_MAJOR}.${NEW_MINOR}.${NEW_PATCH}"
