#!/bin/bash

. "$(dirname "$(readlink -e "$0")")/config"
. "$(dirname "$(readlink -e "$0")")/db-functions"

if (( $# < 3 )); then
	msg "usage: %s <repo-from> <repo-to> <pkgname|pkgbase> ..." "${0##*/}"
	exit 1
fi

args=("${@}")
repo_from="${args[0]}"
repo_to="${args[1]}"
ftppath_from="${FTP_BASE}/${repo_from}/os/"
ftppath_to="${FTP_BASE}/${repo_to}/os/"

if ! check_repo_permission "$repo_to" || ! check_repo_permission "$repo_from"; then
	die "You don't have permission to move packages from %s to %s" "$repo_from" "$repo_to"
fi

# TODO: this might lock too much (architectures)
for pkgarch in "${ARCHES[@]}"; do
	repo_lock "${repo_to}" "${pkgarch}" || exit 1
	repo_lock "${repo_from}" "${pkgarch}" || exit 1
done

# First loop is to check that all necessary files exist
for pkgbase in "${args[@]:2}"; do
	found=false
	for tarch in "${ARCHES[@]}"; do
		while read -r pkgfile; do

			if ! abs_move_preflight_check "$repo_from" "$tarch" "$pkgbase"; then
				die "%s not found in %s-%s" "$pkgbase" "$repo_from" "$tarch"
			fi

			# getpkgfile will `exit` for us if it fails;
			# no need to check its result
			getpkgfile "${ftppath_from}/${tarch}/${pkgfile}" >/dev/null

			found=true
		done < <(getdbinfo "$repo_from" "$tarch" "$pkgbase" FILENAME)
	done
	[[ $found = true ]] || die "%s not found in %s" "$pkgbase" "$repo_from"
done

msg "Moving packages from [%s] to [%s]..." "$repo_from" "$repo_to"

declare -A add_pkgs
declare -A remove_pkgs
for pkgbase in "${args[@]:2}"; do
	abs_move_start "$repo_from" "$repo_to" "$pkgbase"
	for tarch in "${ARCHES[@]}"; do
		msg2 "%s (%s)" "$pkgbase" "$tarch"
		abs_move_arch "$tarch"
		while read -r pkgname pkgver pkgfile; do
			ln -s "../../../${PKGPOOL}/${pkgfile}" "${ftppath_to}/${tarch}/"
			if [[ -f ${FTP_BASE}/${PKGPOOL}/${pkgfile}.sig ]]; then
				ln -s "../../../${PKGPOOL}/${pkgfile}.sig" "${ftppath_to}/${tarch}/"
			fi
			add_pkgs[${tarch}]+="${FTP_BASE}/${PKGPOOL}/${pkgfile} "
			remove_pkgs[${tarch}]+="${pkgname} "
		done < <(getdbinfo "$repo_from" "$tarch" "$pkgbase" NAME,VERSION,FILENAME)
	done
	abs_move_finish
done

for tarch in "${ARCHES[@]}"; do
	if [[ -n ${add_pkgs[${tarch}]} ]]; then
		arch_repo_modify add "${repo_to}" "${tarch}" ${add_pkgs[${tarch}]}
		arch_repo_modify remove "${repo_from}" "${tarch}" ${remove_pkgs[${tarch}]}
	fi
done

for pkgarch in "${ARCHES[@]}"; do
	repo_unlock "${repo_from}" "${pkgarch}"
	repo_unlock "${repo_to}" "${pkgarch}"
done
