#!/bin/bash

set -eo pipefail

GITEA_RELEASE_PROJECT=${GITEA_RELEASE_PROJECT}
GITEA_RELEASE_ORG=${GITEA_RELEASE_ORG}
GITEA_RELEASE_BASE_URL=${GITEA_BASE_URL:-https://forge.cadoles.com}
GITEA_RELEASE_USERNAME=${GITEA_RELEASE_USERNAME}
GITEA_RELEASE_PASSWORD=${GITEA_RELEASE_PASSWORD}
GITEA_RELEASE_VERSION=${GITEA_RELEASE_VERSION}
GITEA_RELEASE_COMMITISH_TARGET=${GITEA_RELEASE_COMMITISH_TARGET}
GITEA_RELEASE_IS_DRAFT=${GITEA_RELEASE_IS_DRAFT:-false}
GITEA_RELEASE_IS_PRERELEASE=${GITEA_RELEASE_IS_PRERELEASE:-true}
GITEA_RELEASE_BODY=${GITEA_RELEASE_BODY}
GITEA_RELEASE_ATTACHMENTS=${GITEA_RELEASE_ATTACHMENTS}

function check_dependencies {
    assert_command_available 'curl'
    assert_command_available 'jq'
}

function assert_command_available {
    local command=$1
    local command_path=$(which $command)

    if [ -z "$command_path" ]; then
        echo "The '$command' command could not be found. Please install it before using this script." 1>&2
        exit 1
    fi
}

function check_environment {
    assert_environment GITEA_RELEASE_PROJECT
    assert_environment GITEA_RELEASE_ORG
    assert_environment GITEA_RELEASE_BASE_URL
}

function source_env_file {
    if [ ! -f '.env' ]; then
        return 0
    fi
    set -o allexport
    source .env
    set +o allexport
}

function assert_environment {
    local name=$1
    local value=${!name}

    if [ -z "$value" ]; then
        echo "The $"$name" environment variable is empty." 1>&2
        exit 1
    fi
}

function ask_credentials {
    if [ -z "$GITEA_RELEASE_USERNAME" ]; then
        echo -n "Username: "
        read GITEA_RELEASE_USERNAME
        
    fi
    if [ -z "$GITEA_RELEASE_PASSWORD" ]; then
        echo -n "Password: "
        stty -echo
        read GITEA_RELEASE_PASSWORD
        stty echo 
        echo
    fi
}

function retrieve_version {
    if [ ! -z "$GITEA_RELEASE_VERSION" ]; then
        return
    fi

    set +e
    GITEA_RELEASE_VERSION=$(git describe --abbrev=0 --tags 2>/dev/null)
    GITEA_RELEASE_VERSION=${GITEA_RELEASE_VERSION}
    set -e
}

function retrieve_commitish_target {
    if [ ! -z "$GITEA_RELEASE_COMMITISH_TARGET" ]; then
        return
    fi

    GITEA_RELEASE_COMMITISH_TARGET=$(git log -n 1 --pretty="format:%h")
}

function create_release {
    local payload={}

    payload=$(json_set "$payload" body "\"$GITEA_RELEASE_BODY\"")
    payload=$(json_set "$payload" draft $GITEA_RELEASE_IS_DRAFT)
    payload=$(json_set "$payload" name "\"$GITEA_RELEASE_VERSION\"")
    payload=$(json_set "$payload" prerelease $GITEA_RELEASE_IS_PRERELEASE)
    payload=$(json_set "$payload" tag_name "\"${GITEA_RELEASE_VERSION:-$GITEA_RELEASE_COMMITISH_TARGET}\"")
    payload=$(json_set "$payload" target_commitish "\"$GITEA_RELEASE_COMMITISH_TARGET\"")

    gitea_api "/repos/$GITEA_RELEASE_ORG/$GITEA_RELEASE_PROJECT/releases" \
        -H "Content-Type:application/json" \
        -d "$payload"
}

function json_set {
    local data=$1
    local key=$2
    local value=$3
    echo $data | jq -cr --argjson v "$value" --arg k "$key" '.[$k] = $v'
}

function upload_release_attachments {
    local release="$1"
    local release_id=$(echo "$release" | jq -r .id)

    if [ -z "$GITEA_RELEASE_ATTACHMENTS" ]; then
        set +e
        GITEA_RELEASE_ATTACHMENTS="$(ls release/*.{tar.gz,zip} 2>/dev/null)"
        set -e
    fi

    for file in $GITEA_RELEASE_ATTACHMENTS; do
        local filename=$(basename "$file")
        gitea_api "/repos/$GITEA_RELEASE_ORG/$GITEA_RELEASE_PROJECT/releases/$release_id/assets?name=$filename" \
            -H "Content-Type:multipart/form-data" \
            -F "attachment=@$file"
    done
}

function gitea_api {
    local path=$1
    local args=${@:2}

    curl -L \
        --fail \
        -u "$GITEA_RELEASE_USERNAME:$GITEA_RELEASE_PASSWORD" \
        ${args} \
        "$GITEA_RELEASE_BASE_URL/api/v1$path"
}

function main {
    check_dependencies
    source_env_file
    check_environment
    ask_credentials
    retrieve_commitish_target
    retrieve_version
    local release=$(create_release)
    upload_release_attachments "$release"
}

main