#!/usr/local/bin/bash

CURL=$(which curl)
CURLOPT="-s"
SELF=$(basename $0)
PID=$$
TMP="/tmp/${SELF}.${PID}"
SNAPOUT=${TMP}/${SELF}.out

CW_SNAPURL="http://www.cygwin.com/snapshots/"
CW_CLOG=( "winsup-changelog" "" )
CW_DIFF=( "winsup-diffs" "" )
CW_WSUP=( "winsup-src" "tar.bz2" )
CW_DLL=( "cygwin1" "dll.bz2" )
CW_DBG=( "cygwin1" "dbg.bz2" )
CW_INST=( "cygwin-inst" "tar.bz2" )
CW_SRC=( "cygwin-src" "tar.bz2" )

cleanup()
{
	[[ -n ${TMP} ]] && rm -rf ${TMP}
	exit
}

cs_args()
{
	while [[ -n "$1" ]]; do
		if [[ "$1" == "-f" ]]; then
			shift
			[[ -e "$1" ]] && cs_tfile=$1
		else
			cs_pre=$1
		fi

		shift
	done

	return
}

cs_snap_get()
{
	${CURL} ${CURLOPT} ${CW_SNAPURL} > ${SNAPOUT} || exit
}

cs_filt()
{
	cat ${SNAPOUT} | egrep "href=.*$1" | sed -e "s#.*href=\"$1-\([0-9-]\+\).*#\1#g"
}

cs_init()
{
	for i in CLOG DIFF WSUP DLL DBG INST SRC; do
		eval CS_${i}=$((b++))
	done

	mkdir ${TMP} || exit
}

print_data()
{
	printf -- "\n-------------------------\n"
	[[ -n $1 ]] && [[ -n $2 ]] && printf ":: %10s: %s\n::\n" "$1" "$2"
	printf ":: %10s: %s\n" "date" "${cs_all[m]}"
	printf ":: %10s: %s\n" "dll" "$(eval echo ${CW_SNAPURL}\${cs_${cs_all[m]}[${CS_DLL}]})"
	printf ":: %10s: %s\n" "debug" "$(eval echo ${CW_SNAPURL}\${cs_${cs_all[m]}[${CS_DBG}]})"
	printf ":: %10s: %s\n" "source" "$(eval echo ${CW_SNAPURL}\${cs_${cs_all[m]}[${CS_SRC}]})"
	printf ":: %10s: %s\n" "winsup" "$(eval echo ${CW_SNAPURL}\${cs_${cs_all[m]}[${CS_WSUP}]})"
	printf ":: %10s: %s\n" "install" "$(eval echo ${CW_SNAPURL}\${cs_${cs_all[m]}[${CS_INST}]})"
	printf ":: %10s: %s\n" "diffs" "$(eval echo ${CW_SNAPURL}\${cs_${cs_all[m]}[${CS_CLOG}]})"
	printf ":: %10s: %s\n" "changelog" "$(eval echo ${CW_SNAPURL}\${cs_${cs_all[m]}[${CS_DIFF}]})"
	printf "::\n"

	if [[ -n ${cs_tfile} ]]; then
		printf -- "-------------------------\n"
		source ${cs_tfile}
		printf -- "-------------------------\n"
	fi
}

cs_args $*
cs_init
cs_snap_get

cs_pre="$1"
cs_pre_i=0
cs_clog=( $(cs_filt ${CW_CLOG[0]}) )
cs_all=( $(cs_filt ${CW_WSUP[0]}) )
max=${#cs_all[*]}
a=0

for i in ${cs_all[*]}; do
	[[ -n ${cs_pre} ]] && [[ ${i} == "${cs_pre}" ]] && cs_pre_i=$a
	eval "cs_${i}=( \
		${CW_CLOG[0]}-${cs_clog[a]} \
		${CW_DIFF[0]}-${cs_clog[a++]} \
		${CW_WSUP[0]}-${i}.${CW_WSUP[1]} \
		${CW_DLL[0]}-${i}.${CW_DLL[1]} \
		${CW_DBG[0]}-${i}.${CW_DBG[1]} \
		${CW_INST[0]}-${i}.${CW_INST[1]} \
		${CW_SRC[0]}-${i}.${CW_SRC[1]} \
	)"
done

let l=cs_pre_i
let r=max-1
let m=(r-l)/2+l

while [[ $l -le $r ]]; do
	while [[ ${cont:=0} -eq 0 ]]; do
		print_data
		printf ":: [(l)og,(d)iff,(a)bsent,(s)een] --> "; read tmp

		if [[ ${tmp:0:1} == "l" ]]; then
			${CURL} ${CURLOPT} "$(eval echo ${CW_SNAPURL}\${cs_${cs_all[m]}[${CS_CLOG}]})"
		elif [[ ${tmp:0:1} == "d" ]]; then
			${CURL} ${CURLOPT} "$(eval echo ${CW_SNAPURL}\${cs_${cs_all[m]}[${CS_DIFF}]})"
		elif [[ ${tmp:0:1} == "a" ]]; then
			let r=m-1
			cont=1
		elif [[ ${tmp:0:1} == "s" ]]; then
			let l=m+1
			cont=1
		fi
	done

	let m=(r-l)/2+l
	cont=0
done

[[ $((m-1)) -lt ${cs_pre_i} ]] && echo "Nothing else to try." && cleanup
[[ ${m} -eq $max ]] && echo "Nothing else to try." && cleanup
let m=m-1

while [[ ${cont} -eq 0 ]]; do
	print_data "SUSPECT" "Suggest examination of changelog and/or diff"
	printf ":: [(l)og,(d)iff] --> "; read tmp

	if [[ ${tmp:0:1} == "l" ]]; then
		${CURL} ${CURLOPT} "$(eval echo ${CW_SNAPURL}\${cs_${cs_all[m]}[${CS_CLOG}]})"
	elif [[ ${tmp:0:1} == "d" ]]; then
		${CURL} ${CURLOPT} "$(eval echo ${CW_SNAPURL}\${cs_${cs_all[m]}[${CS_DIFF}]})"
	else
		cont=1
	fi
done

cleanup
