#!/usr/bin/env bash
set -e

if [ "$#" -eq 1 ]; then
    VERSION=$1
else
    echo "Must provide release version string, e.g. ./script/release.sh 1.0.5"
    exit 1
fi

SEMVER_REGEX="^[vV]?(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)(\\-[0-9A-Za-z-]+(\\.[0-9A-Za-z-]+)*)?(\\+[0-9A-Za-z-]+(\\.[0-9A-Za-z-]+)*)?$"

if [[ "$VERSION" =~ $SEMVER_REGEX ]]; then
    echo "Releasing whispercpp version v$VERSION:"
else
    echo "Warning: version $VERSION must follow semantic versioning schema, ignore this for preview releases"
    exit 0
fi

GIT_ROOT=$(git rev-parse --show-toplevel)
cd "$GIT_ROOT" || exit 1

if [ -d "$GIT_ROOT"/dist ]; then
    echo "Removing existing 'dist' and 'build' directory to get a clean build"
    rm -rf "$GIT_ROOT"/dist
    rm -rf "$GIT_ROOT"/build
fi

tag_name="v$VERSION"

if git rev-parse "$tag_name" > /dev/null 2>&1; then
    echo "git tag '$tag_name' exist, using existing tag."
    echo "To redo releasing and overwrite existing tag, delete tag with the following and re-run release.sh:"
    echo "git tag -d $tag_name && git push --delete origin $tag_name"
    git checkout "$tag_name"
else
    echo "Creating git tag '$tag_name'"

    sed -i.bak "s/^version =.*/version = \"${VERSION}\"/g" pyproject.toml && rm pyproject.toml.bak
    sed -i.bak "s/\"\/\/conditions:default\":.*/\"\/\/conditions:default\": \"${VERSION}\",/g" BUILD.bazel && rm BUILD.bazel.bak
    git add pyproject.toml && git commit --signoff -S -sv -m "release(pyproject): bump version to $VERSION [generated]"

    git tag -s "$tag_name" -m "Tag generated by tools/release, version: $VERSION"

    git push origin "$tag_name"
fi

MINOR="$((${VERSION##*.} + 1))"
DEV_VERSION="${VERSION%.*}.${MINOR}.dev0"
sed -i.bak "s/^version =.*/version = \"$DEV_VERSION\"/g" pyproject.toml && rm pyproject.toml.bak
sed -i.bak "s/\"\/\/conditions:default\":.*/\"\/\/conditions:default\": \"$DEV_VERSION\",/g" BUILD.bazel && rm BUILD.bazel.bak
git add pyproject.toml BUILD.bazel && git commit --signoff -S -sv -m "chore: bump development version [generated]"
git push origin main
