#!/bin/bash

# Rules for generating semantic versioning
# major: breaking change
# minor: feat, style
# patch: build, fix, perf, refactor, revert

PREVENT_REMOVE_FILE=$1
TEMP_FILE_PATH=.gitea/conventional_commits/tmp

LAST_TAG=$(git describe --tags --abbrev=0 --always)
echo "Last tag: #$LAST_TAG#"
PATTERN="^[0-9]+\.[0-9]+\.[0-9]+$"

increment_version() {
    local version=$1
    local increment=$2
    local major=$(echo $version | cut -d. -f1)
    local minor=$(echo $version | cut -d. -f2)
    local patch=$(echo $version | cut -d. -f3)

    if [ "$increment" == "major" ]; then
        major=$((major + 1))
        minor=0
        patch=0
    elif [ "$increment" == "minor" ]; then
        minor=$((minor + 1))
        patch=0
    elif [ "$increment" == "patch" ]; then
        patch=$((patch + 1))
    fi

    echo "${major}.${minor}.${patch}"
}

create_file() {
    local with_range=$1
    if [ -s $TEMP_FILE_PATH/messages.txt ]; then
        return 1
    fi
    if [ "$with_range" == "true" ]; then
        git log $LAST_TAG..HEAD --no-decorate --pretty=format:"%s" > $TEMP_FILE_PATH/messages.txt
    else
        git log --no-decorate --pretty=format:"%s" > $TEMP_FILE_PATH/messages.txt
    fi
}

get_commit_range() {
    rm -f $TEMP_FILE_PATH/messages.txt
    if [[ $LAST_TAG =~ $PATTERN ]]; then
        create_file true
    else
        create_file
        LAST_TAG="0.0.0"
    fi
    echo " " >> $TEMP_FILE_PATH/messages.txt
}

start() {
    mkdir -p $TEMP_FILE_PATH
    get_commit_range
    new_version=$LAST_TAG
    increment_type=""

    while read message; do
        echo $message
        if echo $message | grep -Pq '(feat|style)(\([\w]+\))?!:([a-zA-Z0-9-_!\&\.\%\(\)\=\w\s]+)\s?(,?\s?)((ref(s?):?\s?)(([A-Z0-9]+\-[0-9]+)|(#[0-9]+)|(NOISSUE)))'; then
            increment_type="major"
            echo "a"
            break
        elif echo $message | grep -Pq '(feat|style)(\([\w]+\))?:([a-zA-Z0-9-_!\&\.\%\(\)\=\w\s]+)\s?(,?\s?)((ref(s?):?\s?)(([A-Z0-9]+\-[0-9]+)|(#[0-9]+)|(NOISSUE)))'; then
            if [ -z "$increment_type" ] || [ "$increment_type" == "patch" ]; then
                increment_type="minor"
                echo "b"
            fi 
        elif echo $message | grep -Pq '(build|fix|perf|refactor|revert)(\(.+\))?:\s([a-zA-Z0-9-_!\&\.\%\(\)\=\w\s]+)\s?(,?\s?)((ref(s?):?\s?)(([A-Z0-9]+\-[0-9]+)|(#[0-9]+)|(NOISSUE)))'; then
            if [ -z "$increment_type" ]; then
                increment_type="patch"
                echo "c"
            fi
        fi
    done < $TEMP_FILE_PATH/messages.txt

    if [ -n "$increment_type" ]; then
        new_version=$(increment_version $LAST_TAG $increment_type)
        echo "New version: $new_version"

        gitchangelog | grep -v "[rR]elease:" > HISTORY.md
        git add HISTORY.md
        echo $new_version > song_of_the_day/VERSION
        git add song_of_the_day/VERSION 
        git commit -m "release: version $new_version 🚀"
        echo "creating git tag : $new_version"
        git tag $new_version
        git push -u origin HEAD --tags
        echo "Gitea Actions will detect the new tag and release the new version."
    else
        echo "No changes requiring a version increment."
    fi
}

start

if [ -z "$PREVENT_REMOVE_FILE" ]; then
    rm -f $TEMP_FILE_PATH/messages.txt
fi