#!/bin/sh

parse_html() {
	sed 's/</\n</g;s/>/>\n/g' | sed ':f;/</!b;/>/b;N;s/\n/ /;b f' | sed 's/^[[:space:]]*//;/^$/d'
}

get_forms() {
	parse_html | sed '/^<form/,/^<\/form/!d;s#</form.*>#&\n%- - - -%#'
}

tidy_form_for_description() {
	sed '/^</s#^.*\(action=[^ ]*\).*$#[\1], #;/^</s#^.*name=\([^ ]*\).*$#[\1], #;/^</d'
}

truncate_lines() {
	sed 's#^\(.\{65\}\)....*$#\1...#'
}

linify() {
	sed '/^%- - - -%$/{;s/.*//;x;s#\n#'"$1"'#g;b;};H;d'
}

make_form() {
	wg --address | sed 's/^/*base: /'
	sed '/^</!{;s/^/# /;b;};s#\([[:alpha:]]*\)=\([[:alpha:]]\{1,\}\)#\1="\2"#g;s#^<.*name="\([^"]*\).*value="\([^"]*\).*$#\1: \2#;s#^<.*value="\([^"]*\).*name="\([^"]*\).*$#\2: \1#;s#^<.*name="\([^"]*\).*$#\1: #;s#^<.*action="\([^"]*\).*$#*action: \1#;/</d'
}

get_form() {
	get_forms | linify | pick_line_by "$1" | parse_html
}

pick_line_by() {
	case "$1" in
	[1-9]) sed -ne "$1 p" ;;
	*) sed "/$1/!d;q" ;;
	esac
}

save_form() {
	cat "$1" >> "$2"
	echo '%- - - -%' >> "$2"
}

test -z "$WG_DIR" && WG_DIR="$HOME/.wg"
test -z "$FORMFILE" && FORMFILE="$WG_DIR/lastform"
test -z "$FORMHISTORY" && FORMHISTORY="$WG_DIR/formhistory"
test -z "$EDITOR" && EDITOR=sensible-editor

PATTERN=
INPUT="wg -r"
MODE=fill

while test -n "$1"; do
	case "$1" in
	-l|--list) MODE=list ;;
	--list-raw) MODE=listraw ;;
	-h|--history) MODE=history ;;
	-q|--quick) MODE=quick ;;
	-) INPUT=cat ;;
	-*) echo "formfill: unknown option $1" 1>&2 ;;
	*) PATTERN="$1" ;;
	esac
	shift
done

if test -n "$PATTERN"; then
	case "$MODE" in
	fill) $INPUT | get_form "$PATTERN" | make_form > "$FORMFILE" ;;
	history)
		cat "$FORMHISTORY" | linify '%-%-%' | tac | \
		pick_line_by "$PATTERN" | sed 's#%-%-%#\n#g;s#^\n##' > \
		"$FORMFILE"; MODE=fill ;;
	*) echo "Warning: pattern '$PATTERN' overridden by mode" 1>&2 ;;
	esac
fi

case "$MODE" in
	list) $INPUT | get_forms | tidy_form_for_description | \
		linify | truncate_lines | cat -n ;;
	listraw) $INPUT | get_forms ;;
	history) grep -v base: "$FORMHISTORY" | linify '; ' | tac | \
		truncate_lines | cat -n ;;
	fill)
		"$EDITOR" "$FORMFILE"
		save_form "$FORMFILE" "$FORMHISTORY"
		send_form "$FORMFILE" ;;
esac
