#! /bin/bash

# Just fake it to allow sourcing the .ebuild file directly into scope.
inherit() {
	:
}

in_array() {
	local needle="$1"
	shift
	while [[ $# -gt 0 ]]; do
		[[ "$1" = "$needle" ]] && return 0
		shift
	done
	return 1
}

if [[ -r /usr/libexec/rc/sh/functions.sh ]]; then
	# We have openrc so high-jack these for prettier output.
	. /usr/libexec/rc/sh/functions.sh
else
	ebegin() { echo "$*"; }
	eend() { :; }
	eerror() { echo "$*"; }
fi

for eb in "$@"; do
	unset AWS_GROUPS
	if [[ "$(basename "${eb}")" != aws-sdk-cpp-*.ebuild ]] ; then
		eerror "Ebuild name ${eb} looks invalid, skipping."
		continue
	fi
	if [[ ! -r "${eb}" ]]; then
		eerror "${eb} is not readable, skipping."
		continue
	fi
	ebegin "${eb}"
	r=0
	
	if ! ebuild "${eb}" fetch; then
		eerror "Error fetching dist files."
		avail_mods=()
	else
		distname="$(portageq metadata / ebuild dev-cpp/aws-sdk-cpp-1.11.887 SRC_URI | sed -nre 's/.* -> aws/aws/p')"
		avail_mods=($(tar tf "$(portageq envvar DISTDIR)/${distname}" --wildcards "*/generated/src/*" | sed -nre 's:.*/generated/src/aws-cpp-sdk-([^/]+)$:\1:p'))
	fi
	
	. "${eb}"
	declare -A listed_names=()
	for c in "${!AWS_GROUPS[@]}"; do
		IFS=';' mods=(${AWS_GROUPS[$c]})
		for m in "${mods[@]}"; do
			if [[ -n "${listed_names[$m]}" ]]; then
				eerror "${m} is listed twice, in first in ${listed_names[$m]} then in ${c}"
				r=1
			else
				listed_names[$m]="${c}"
			fi
			if [[ "${#avail_mods[@]}" -gt 0 ]] && ! in_array "${m}" "${avail_mods[@]}"; then
				eerror "Module ${m} listed in AWS_GROUPS category ${c} is not found in sources."
				r=1
			fi
		done
		sorted_list="$(printf "%s\n" "${mods[@]}" | sort | tr '\n' ';')"
		if [[ "${sorted_list%;}" != "${AWS_GROUPS[$c]}" ]]; then
			eerror "Category ${c} in AWS_GROUPS is not sorted, correctly sorted list is: ${sorted_list%;}"
			r=1
		fi
	done
	for m in "${avail_mods[@]}"; do
		if [[ -z "${listed_names[$m]}" ]]; then
			eerror "Module ${m} in sources is not found in any AWS_GROUPS category."
			r=1
		fi
	done
	eend $r
done
