#!/bin/bash

find_last_commit_for_title() {
    local title="$1"
    git log --oneline --author=SpiritCroc | grep "$title" | head -n 1 | sed 's| .*||'
}

revert_last() {
    local title="$1"
    shift
    git revert --no-edit `find_last_commit_for_title "$title"` $@
}

require_clean_git() {
    if [ "$NO_REQUIRE_CLEAN_GIT" = "y" ]; then
        return
    fi
    uncommitted=`git status --porcelain`
    if [ ! -z "$uncommitted" ]; then
        echo "Uncommitted changes are present, please commit first!"
        exit 1
    fi
}

upstream_latest_tag() {
    git describe --abbrev=0 upstream/main --tags
}
upstream_previous_tag() {
    #git describe --abbrev=0 `upstream_latest_tag`~1 --tags
    #downstream_latest_tag | sed 's|sc_\(v.*\).sc.*|\1|'
    git log | grep "Merge tag 'v.*' into " | head -n 1 |sed "s|.*Merge tag '\\(v.*\\)' into .*|\1|"
}
downstream_latest_tag() {
    local commit="HEAD"
    while true; do
        local tag=`git describe --abbrev=0 "$commit" --tags`
        if [[ "$tag" =~ "sc_" ]]; then
            echo "$tag"
            break
        else
            commit="$commit^1"
        fi
    done
}

upstream_diff() {
    local latest_tag=`upstream_latest_tag`
    local previous_tag=`upstream_previous_tag`
    git diff "$previous_tag".."$latest_tag" "$@"
}
upstream_log() {
    local latest_tag=`upstream_latest_tag`
    local previous_tag=`upstream_previous_tag`
    git log "$previous_tag".."$latest_tag" "$@"
}

downstream_upstream_diff() {
    local previous_tag=`upstream_previous_tag`
    local downstream_tag=`downstream_latest_tag`
    git diff "$previous_tag".."$downstream_latest_tag" "$@"
}


# Opposite to restore_sc
restore_upstream() {
    local f="$(basename "$1")"
    local path="$(dirname "$1")"
    local sc_f="tmp_sc_$f"
    local upstream_f="upstream_$f"
    if [ -e "$path/$f" ]; then
        mv "$path/$f" "$path/$sc_f"
    fi
    if [ -e "$path/$upstream_f" ]; then
        mv "$path/$upstream_f" "$path/$f"
    fi
}

# Oposite to restore_upstream
restore_sc() {
    local f="$(basename "$1")"
    local path="$(dirname "$1")"
    local sc_f="tmp_sc_$f"
    local upstream_f="upstream_$f"
    if [ -e "$path/$f" ]; then
        mv "$path/$f" "$path/$upstream_f"
    fi
    if [ -e "$path/$sc_f" ]; then
        mv "$path/$sc_f" "$path/$f"
    fi
}

await_edit() {
    local f="$1"
    shift 1
    if [ ! -z "$GRAPHICAL_EDITOR" ]; then
        $GRAPHICAL_EDITOR "$f"
        read -p "Press enter when done"
    elif [ ! -z "$VISUAL" ]; then
        $VISUAL "$f"
    elif [ ! -z "$EDITOR" ]; then
        $EDITOR "$f"
    else
        read -p "No editor set, please edit $f manually, and press enter when done"
    fi
}