#!/bin/sh

SRC_BASE="$HOME/.local/src"
XDG_REPO_BASE="$SRC_BASE/xdg-repo"
XDG_REPO_ARCH="x86_64"

get_pkgver() {
    grep "^\s*pkgver" .SRCINFO | sed "s/^\s*pkgver\s*=\s*//;"
}

get_pkgrel() {
    grep "^\s*pkgrel" .SRCINFO | sed "s/^\s*pkgrel\s*=\s*//;"
}

get_epoch() {
    raw_epoch="$(grep "^\s*epoch" .SRCINFO | sed "s/^\s*epoch\s*=\s*//;")"
    if [ -n "$raw_epoch" ]; then
        echo "$raw_epoch:"
    fi
}

get_full_pkgver() {
    echo "$(get_epoch)$(get_pkgver)-$(get_pkgrel)"
}

handle_bin_ver_pkg_upgrade() {
    if [ -e PKGBUILD ]; then
        binary_version="$(grep "^# binary version of this package (-bin):" PKGBUILD | head -n 1 | awk '{print $8}' | sed 's/^.*\///')"
        if [ -n "$binary_version" ]; then
            pkgver="$(get_pkgver)"
            pkgrel="$(get_pkgrel)"
            epoch="$(get_epoch)"
            cd "$SRC_BASE/$binary_version" || return
            git pull || return
            if [ -n "$epoch" ]; then
                sed -i "s/^\s*epoch\s*=.*$/epoch=$epoch/" PKGBUILD
            fi
            sed -i "s/^\s*pkgver\s*=.*$/pkgver=$pkgver/" PKGBUILD
            sed -i "s/^\s*pkgrel\s*=.*$/pkgrel=$pkgrel/" PKGBUILD
            updpkgsums || return
            makepkg --printsrcinfo > .SRCINFO
            git add .SRCINFO PKGBUILD || return
            # note: (hopefully up-to-date) copy of 'uppkg' zsh alias
            git commit -m "uppkg -> $(raw_pkgver="$(grep "^\s*epoch\|^\s*pkgver\|^\s*pkgrel" .SRCINFO | sed "/^\s*epoch/ {s/:$/::/;t;s/$/:/}; s/^\s*epoch\s*=\s*//; s/^\s*pkgver\s*=\s*//; s/^\s*pkgrel\s*=\s*/-/")"; if echo "$raw_pkgver" | grep -q ":"; then raw_pkgver="$(echo "$raw_pkgver" | sed "1{N;h;d};3G")"; fi; echo "$raw_pkgver" | tr -d "\n")" || return

            git push
        fi
    fi
}

xdg_repo_path="$XDG_REPO_BASE/$XDG_REPO_ARCH"
more_than_one_arguemt_given=0
commit_msg="updated"

for file in "$@"; do
    pkgver="$(get_full_pkgver)"
    pkgname="${file%%-"$pkgver"*}"

    for old_pkg in "$xdg_repo_path/$pkgname"*.pkg.tar.zst; do
        if [ -e "$old_pkg" ]; then
            rm "$xdg_repo_path/$pkgname"*.pkg.tar.zst*
            # TODO: broken, use another way to break out of inner loop
            # break
        fi
    done

    if [ "$more_than_one_arguemt_given" = 0 ]; then
        more_than_one_arguemt_given=1
        commit_msg="$commit_msg $pkgname -> $pkgver"
    else
        commit_msg="$commit_msg + $pkgname -> $pkgver"
    fi
    mv "$file" "$xdg_repo_path"
done

handle_bin_ver_pkg_upgrade

cd "$XDG_REPO_BASE" || exit 1
git pull
./signpkgs
git add .
git commit -m "$commit_msg"
git push
