#!/bin/bash

if [[ " $* " == *" --delete "* ]]; then
	DO_DELETE="true"
else
	echo "Doing dry-run, pass --delete to actually delete the files"
	DO_DELETE="false"
fi

if [[ -z "${GITLAB_TOKEN}" ]]; then
	echo "You must export GITLAB_TOKEN in your environment before running this file!" >&2
	exit 1
fi

function safe_rm()
{
	if [[ "${DO_DELETE}" == "true" ]]; then
		rm -vrf "$@"
	else
		echo "$@"
	fi
}

# Delete all `mr` folders that are no longer open:
function mr_is_closed()
{
	local STATE="$(curl --silent --header "PRIVATE-TOKEN: ${GITLAB_TOKEN}" "https://gitlab.steamos.cloud/api/v4/projects/1230/merge_requests/$1" | jq -r '.state')"
	[[ "${STATE}" == "merged" ]] || [[ "${STATE}" == "closed" ]]
}

echo "Cleaning up stale MRs"
for mr in mr-*; do
	if mr_is_closed "${mr#*-}"; then
		safe_rm "${mr}"
	fi
done


function package_basename()
{
	# Remove extension
	out="${1%%.pkg.*}"
	# Remove arch
	out="${out%-*}"
	# Remove pkgrel
	out="${out%-*}"
	# Remove version
	out="${out%-*}"

	# return
	echo -n "${out}"
}
	

# Collect newest packages by grouping by basename
declare -A NEWEST_PACKAGES
for f in *.pkg.tar.*; do
	pkg_bname="$(package_basename "${f}")"
	if [[ "${f}" -nt "${NEWEST_PACKAGES["${pkg_bname}"]}" ]]; then
		NEWEST_PACKAGES["${pkg_bname}"]="${f}"
	fi
done

PACMAN_DATABASES=()
function load_pacman_database()
{
    local DB_PATH="${1}"
    local DB_NAME="$(basename "${DB_PATH%%.*}" | tr '-' '_')"
    local LISTING=(
        $(xz -d -c "${DB_PATH}" |\
          tar t |\
          grep '/desc$' |\
          xargs dirname)
    )
    eval "declare -A -g ${DB_NAME}"
    for ENTRY in "${LISTING[@]}"; do
        eval "${DB_NAME}['${ENTRY}']=1"
    done
    PACMAN_DATABASES+=( "${DB_NAME}" )
}

function entry_in_databases()
{
    PACKAGE_ENTRY="${1}"
    for DB_NAME in "${PACMAN_DATABASES[@]}"; do
        if eval "[[ -v ${DB_NAME}[\"${PACKAGE_ENTRY}\"] ]]"; then
            return 0
        fi
    done
    return 1
}

load_pacman_database deckard-arch-hotfixes.db.tar.xz

# Delete everything except the newest versions of all the packages
# Exclude anything directly mentioned by name in the database
for f in *.pkg.tar.*; do
	pkg_bname="$(package_basename "${f}")"
	pkg_entry="${f%.pkg.*}"
	pkg_entry="${pkg_entry%-*}"
	if [[ "${NEWEST_PACKAGES["${pkg_bname}"]}" != "${f}" ]] && ! entry_in_databases "${pkg_entry}"; then
		safe_rm "${f}"
	fi
done
