#!/usr/bin/env bash
# Run sfeed
# shellcheck disable=2016
# set -euo pipefail

main() {
	NOFETCH=false
	[ "x$1" = "x-n" ] && {
		NOFETCH=true
		shift
	}
	[ -n "$1" ] && SFEED_OUTPUT="$1" || SFEED_OUTPUT="$HOME/.sfeed"
	export SFEED_OUTPUT
	export NOFETCH
	export SFEED_CONFIG="$HOME/.sfeed"
	# SFEED_CONFIG="${XDG_CONFIG_HOME:-$HOME/.config}/sfeed"
	export SFEED_DATA="$HOME/.sfeed"
	# SFEED_DATA="${XDG_DATA_HOME:-$HOME/.local/share}/sfeed"
	# SFEED_OUTPUT=/var/www/sfeed
	export sfeedrc="$SFEED_CONFIG/sfeedrc"
	export sfeedpath="$SFEED_DATA/feeds"
	test -d "$(dirname "$sfeedrc")" || mkdir -p "$(dirname "$sfeedrc")"
	test -d "$sfeedpath" || mkdir -p "$sfeedpath"
	touch /tmp/runsfeed.ok

	# if ! $NOFETCH; then
	# logok "Finding Invidious host" \
	# get_invidious_url "https://api.invidious.io/instances.json?sort_by=health"
	# fi
	logok "Removing unsubscribed feeds" \
		remove_unsubs "$sfeedrc"
	logok -n "Updating feeds" \
		update "$sfeedrc"
	logok "Updating urls" \
		update_urls "$sfeedrc"
	logok "Generating HTML" '{
		html "$sfeedpath"/* >/tmp/sfeed-index.html &&
			mv /tmp/sfeed-index.html "$SFEED_OUTPUT/index.html";
		html -v LIMIT=-1 "$sfeedpath"/* >/tmp/sfeed-feeds.html &&
			mv /tmp/sfeed-feeds.html "$SFEED_OUTPUT/feeds.html";
	}'
	logok "Generating RSS" '{
		atom "$sfeedpath" >/tmp/feeds.xml &&
			mv /tmp/feeds.xml "$SFEED_OUTPUT/feeds.xml";
		atom "$sfeedpath" 7 >/tmp/feeds-short.xml &&
			mv /tmp/feeds-short.xml "$SFEED_OUTPUT/feeds-short.xml";
	}'
	logok "Generating OPML" '{
		opml "$sfeedrc" >/tmp/feeds.opml &&
			mv /tmp/feeds.opml "$SFEED_OUTPUT/feeds.opml";
	}'
	logok "Generating twtxt" '{
		twtxt "$sfeedpath" >/tmp/feeds.txt &&
			mv /tmp/feeds.txt "$SFEED_OUTPUT/feeds.txt";
	}'
	logok "Generating ass" '{
		ass "$sfeedpath" >/tmp/feed.ass &&
			mv /tmp/feed.ass "$SFEED_OUTPUT/feed.ass";
	}'
	logok "Archiving old feeds" \
		'archive 60 "$sfeedpath"/*'
	logok "Weeding" '{
		echo
		mkdir -p "$SFEED_OUTPUT/weeds";
		weed > /tmp/weeds.html &&
			mv /tmp/weeds.html "$SFEED_OUTPUT/weeds/index.html";
	}'
	robotstxt >"$SFEED_OUTPUT/robots.txt"
	if [ -f /tmp/runsfeed.ok ]; then
		echo >&2 'Done.'
	else
		echo >&2 'Done (some errors).'
	fi
}

runcmd() {
	cmd="$(command -v "$1" || echo "./$1")"
	shift
	"$cmd" "$@"
}

remove_unsubs() {
	runcmd sfeed_unsubscribe.sh "$@"
}

update_urls() {
	runcmd sfeed_update_urls.sh "$@"
}

get_invidious_url() {
	"${NOFETCH:-false}" && return
	curl -sL "$1" |
		jq -r .[][1].uri |
		grep -v onion |
		head -n1 | tee /tmp/invidious.host
}

logok() {
	newline=''
	if [ "x$1" = x-n ]; then
		newline='\n'
		shift
	fi
	printf "%s...$newline" "$1" >&2
	shift
	if output="$(eval "$@" | tee /dev/stderr)"; then
		printf '%s\n' "${output:-ok}"
		return 0
	else
		rm /tmp/runsfeed.ok
		printf 'ERROR\n'
		return 1
	fi
}

update() {
	runcmd sfeed_update_xargs "$@"
}

aggregate() {
	curd="$PWD"
	cd "$1" || return 1
	if [ -n "$2" ]; then
		old="$(($(date +%s) - ($2 * 24 * 3600)))"
	else
		old=0
	fi
	awk -v old="$old" \
		'BEGIN{FS="\t";OFS="\t";} int($1)>=old{$2="["FILENAME"] "$2;print}' \
		* | sort -k1,1rn
	cd "$curd" || return
}

ass() {
	aggregate "$1" "$2" | runcmd sfeed_ass.awk
}

twtxt() {
	aggregate "$1" "$2" | sfeed_twtxt
}

opml() {
	sfeed_opml_export "$@"
}

html() {
	runcmd sfeed_html.awk "$@"
}

atom() ( # atom DIRECTORY [DAYS]
	aggregate "$1" "$2" | sfeed_atom
)

weed() (
	# Generate a page for weeds.
	runcmd sfeed_update_xargs weedrc >&2
	. weedrc
	aggregate "$sfeedpath" | runcmd sfeed_weed.awk
)

archive() ( # sfeed_archive AGE FEED ...
	age="$1"
	shift
	# shellcheck disable=2031
	old="$sfeedpath/../sfeed.old.d"
	mkdir -p "$old"
	for feed; do
		awk -v old="$(($(date +%s) - (age * 24 * 3600)))" \
			-F '\t' 'int($1) > old' <"$feed" >"$feed.new"
		mv "$feed" "$old/${feed##*/}" 2>/dev/null &&
			mv "$feed.new" "$feed" 2>/dev/null
	done
)

robotstxt() {
	echo "User-Agent: *"
	echo "Disallow: /"
}

if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
	main "$@"
fi