#!/bin/sh

set -e

DEVUAN_DAK_API_URL=https://api.pkginfo.devuan.org

devuan_suites()
{
    curl -fs $DEVUAN_DAK_API_URL/suites | \
	jq -r '.[] | select(.codename) |.codename' | \
	sort -u | grep -v -- -
}

debian_equivalent()
{
    s=$1
    valid=$2
    case $s in
	ceres|unstable)
	    echo sid
	    ;;
	experimental|*stable|testing)
	    echo "$s"
	    ;;
	*)
	    if echo "$valid" | grep --quiet --fixed-strings --line-regexp "$s"
	    then
		debian_jessie=8
		if [ "$s" = 'jessie' ]
		then
		    debian_v=$debian_jessie
		else
		    ascii_a=$(printf '%d' \'a) # Decimal value of ASCII a
		    debian_v=$(($(printf "%d" "'$s") - $ascii_a + $debian_jessie + 1))
		fi
		if [ -z "$include_archived" ]
		then
		    # This is the EOL LTS date
		    debian_eol=$(awk -F, "\$1==\"$debian_v\" { print \$7 }" /usr/share/distro-info/debian.csv)
		    [ -n "${debian_eol}" ] && \
			 [ "$(date -d "${debian_eol}" +%s)" -lt "$(date +%s)" ] && return
		fi
		awk -F, "\$1==\"$debian_v\" { print \$3 }" /usr/share/distro-info/debian.csv
	    else
		echo "WARNING: unknown suite $s" >&2
	    fi
	    ;;
    esac
}

get_versions()
{
    s=$1
    u=$2
    rmadison -u "$u" -a source "$s" | awk -F\| '{print $3 $2}'
}

# parse command line
while getopts ai:I: opt
do
    case $opt in
	a) include_archived=$opt;;
	i) ign_src=$(echo "$ign_src" "$OPTARG");;
	I) ign_suite=$(echo "$ign_suite" "$OPTARG");;
	\?) echo "$0 [ -a ] [ source... ]"; exit 1;;
    esac
done

shift $(($OPTIND - 1))

sources=${*:-$(dpkg-parsechangelog -S Source)}

for src in $sources
do
    echo "$ign_src" | grep -q --word-regexp "$src" && continue
    devuan=$(get_versions "$src" "$DEVUAN_DAK_API_URL/madison")
    [ -z "$devuan" ] && \
	echo "WARNING: no Devuan versions found for src:$src" >&2 && \
	continue
    debian=$(get_versions "$src" udd ) # Use Ultimate Debian Database
    [ -z "$debian" ] && \
	echo "WARNING: no Debian versions found for src:$src" >&2 && \
	continue

    for s in $(echo "$devuan" | awk '$1 !~ /-/ {print $1}' | sort -u) # Parent suites
    do
	echo "$ign_suite" | grep -q --word-regexp "$s" && continue
	: "${valid_suites:=$(devuan_suites)}"
	bi_s=$(debian_equivalent "$s" "$valid_suites")
	[ -z "$bi_s" ] && continue

	for chld in '' '-proposed-updates' '-security' '-backports'
	do
	    echo "$ign_suite" | grep -q --word-regexp "$s$chld" && continue
	    if [ "$chld" = '-proposed-updates' ]
	    then
		udd_s="${bi_s}-p-u" # UDD uses different name!
	    else
		udd_s="${bi_s}$chld"
	    fi
	    bi_v=$(echo "$debian" | awk "\$1==\"$udd_s\" {print \$2}" | tail -1)
	    [ -z "$bi_v" ] && continue
	    vu_v=$(echo "$devuan" | awk "\$1==\"$s$chld\" {print \$2}" | tail -1)
	    if [ -z "$vu_v" ] && [ -n "$chld" ]
	    then
		# Check if update already in parent suite
		vu_p_v=$(echo "$devuan" | awk "\$1==\"$s\" {print \$2}" | tail -1)
		if [ -z "${vu_p_v##"${bi_v}"*devuan*}" ]
		then
		    echo "src:$src $vu_p_v already in $s" >&2
		    continue
		fi
	    fi

	    dpkg --compare-versions "$vu_v" ge "$bi_v" || \
		echo "src:$src $bi_s$chld/$bi_v $s$chld/${vu_v:-(None)}"
	done
    done
done
