#!/bin/bash
# example: radar=00004 I=10 bomsnarf
# example: path=/gms/IDE00035.radar. I=60 ext=.jpg start='-5 hours -35 minutes' debug=1 bomsnarf
# defaults to Melbourne 512km and 6 minute interval

mkdir -p imgs ; cd imgs

: ${I:=6}
: ${radar:=021}
: ${count:=10}
: ${site:=http://www.bom.gov.au}
: ${path:=/radar/IDR${radar}.T.}
: ${pre:="$site$path"}
: ${ext:=.png}
: ${start:=now}
: ${debug:=}

Z=$[$I * 60 - 60]
w=${pre##*/}
w=${w%.}

dt() {
	f="%Y/%m/%d %H:%M"
	if [ "$sec" = 1 -o "$nano" = 1 ]; then f="$f:%S"; fi
	if [ "$nano" = 1 ]; then f="$f.%N"; fi
	if [ "$zone" = 1 ]; then f="$f %z"; fi
	if [ "$day" != 0 ]; then f="$f %a"; fi
	date +"$f" -d "${*:-now}"
}

dated() {
	N="$1" ; Z="$2" ; shift 2
	[ -n "$Z" ] || . usage "date zone [opt ...]"
	date -d "`echo "$N" | perl -ne '
		chomp;
		s/\D//g;
		BEGIN { @c=qw(4 / 2 / 2 _ 2 : 2 : 2 .) }
		@a=@c;
		$c = -1;
		while(@a) {
			($n, $s) = splice @a,0,2;
			$c += 1 + $n;
			last if $c >= length($_);
			$_ = substr($_,0,$c).$s.substr($_,$c);
	#		warn "$n $c $s $_\n";
		}
		s/_/ /g;
		print "$_\n";
	'` $Z" "$@"
}

dtu() { TZ=GMT day="${day:-0}" dt "$@"; }

date2secs() { dated "$1" UTC -u +%s; }
secs2ndate() { date -d "$1 secs 1970/01/01 UTC" -u +%Y%m%d%H%M; }
secs2date() { date -d "$1 secs 1970/01/01 UTC" -u +"%Y/%m/%d %H:%M"; }

D=`dtu -d "$start"`
S=`date2secs "$D"`
get() {
	N=`secs2ndate "$S"`
	D=`secs2date "$S"`
	U="$pre$N$ext"
	F=${U##*/}
	already=0
	if [ -n "$debug" ]; then
		printf "%-10s  %-s  $U  " "$w" "$D"
	else
		printf "%-10s  %-s  " "$w" "$D"
	fi
	[ -e "$F" ] && { echo got; already=1; return 0; }
	wget -c -q "$U" && { echo "^_^"; return 0; }
	echo "0_o"
	return 1
}
while true; do
	while true; do
		get && break
		S=$[$S-60]
	done
	# TODO detect I if not specified?
	if [ $already = 0 ]; then
		S0="$S"
		while true; do
			S=$[$S-$I*60]
			get || break
			[ $already = 1 ] && break
		done
		S="$S0"
	fi
	while true; do
		S=$[$S+$[$I*60]]
		failed=0 ; resync=0 ; maxfail=3
		while true; do
			get "$N" && break
			failed=$[$failed+1]
			if [ $failed -gt $maxfail ]; then
				resync=1
				break
			fi
			sleep $Z
		done
		if [ $resync = 1 ]; then break; fi
		sleep $Z
	done
done
