#!/usr/bin/env bash

. lib.bash || exit

checklast() {
	local base=$1 tag=$2
	local stamp

	if ! stamp=$(curl -sSL "$base/last$tag"); then
		err "could not access last$tag at mirror '$base'"
	elif [[ ! $stamp ]]; then
		err "mirror '$base' has malformed last$tag (file is empty)"
	elif ! [[ $stamp =~ ^[0-9]+$ ]]; then
		err "mirror '$base' has malformed last$tag (file starts with '${stamp::15}')"
	else
		datestr=$(date -d "@$stamp" +%F)
		agestr=$(interval $[now - stamp])
		if (( now - stamp > 2*86400 )); then
			warn "last $tag: $agestr ($datestr)"
		else
			info "last $tag: $agestr ($datestr)"
		fi
	fi
}

checkdb() {
	local base=$1 url=$2
	local header

	if ! header=$(curl -sSLI "$url/$repo.db"); then
		err "could not access $repo.db at mirror <$base>"
		return
	fi
	local mdate=$(echo "$header" \
			| grep -i "^last-modified:" \
			| tail -1 \
			| sed "s/^last-modified: *//i; s/\r//")

	if [[ ! $mdate ]]; then
		err "mirror '$base' is missing Last-Modified for $repo.db"
		return
	fi
	local mtime=$(date -d "$mdate" +%s)
	local agestr=$(interval $[now - mtime])
	if (( now - mtime > 2*86400 )); then
		warn "$repo.db age: $agestr ($mdate)"
	else
		info "$repo.db age: $agestr ($mdate)"
	fi
}

checkspeed() {
	local base=$1 baseurl=$2 pkg=$3
	local result
	local url=$baseurl/$pkg

	echo "Testing $url"
	result=$(timeout --foreground 30s wget -e quiet=Off -O /dev/null "$url" 2>&1); r=$?

	if (( ! r )); then
		info "speed: $(echo "$result" | tail -1 | awk '{print $3, $4}')"
	elif (( r == 124 )); then
		warn "speed: definitely too slow (timeout 30s)"
	else
		err "speed: wget failed: $result"
	fi
}

opt_speed=0

while getopts ":w" OPT; do
	case $OPT in
	w) let ++opt_speed;;
	*) lib:die_getopts;;
	esac
done; shift $((OPTIND-1))

repo=extra
arch=`uname -m`
now=`date +%s`

if (( opt_speed >= 2 )); then
	bigpkg=texlive-fontsextra
else
	repo=core
	bigpkg=linux
fi
bigpkgurl=`expac -S %f $repo/$bigpkg`

re='^#? *Server *= *(.+)'

while read -r line; do
	if [[ $line =~ $re ]]; then
		echo "$line"
		url=${BASH_REMATCH[1]}
		url=${url//'$repo'/$repo}
		url=${url//'$arch'/$arch}
		base=${url%/*/os/*}
		checklast "$base" sync &&
		checklast "$base" update &&
		checkdb "$base" "$url" &&
		if (( opt_speed )); then
			checkspeed "$base" "$url" "$bigpkgurl"
		fi
	elif [[ $line == \#* ]]; then
		printf '\e[2m%s\e[m\n' "$line"
	else
		echo "$line"
	fi
done < /etc/pacman.d/mirrorlist
