#!/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=97
		    debian_v=$(($(printf "%d" "'$s") - $ascii_a + $debian_jessie + 1))
		fi
		if [ -z "$include_archived" ]
		then
		    debian_eol=$(awk -F, "\$1==\"$debian_v\" { print \$6 }" /usr/share/distro-info/debian.csv)
		    [ -n "${debian_eol}" -a \
			 $(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" -a -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" gt "$bi_v" || \
		echo "src:$src $bi_s$chld/$bi_v $s$chld/${vu_v:-(None)}"
	done
    done
done
