#!/bin/bash -euE
#!/bin/bash
#   Copyright (c) 2013 by Luke Shumaker <lukeshu@sbcglobal.net>
#
#   This program is free software; you can redistribute it and/or modify
#   it under the terms of the GNU General Public License as published by
#   the Free Software Foundation; either version 3 of the License, or
#   (at your option) any later version.
#
#   This program is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#   GNU General Public License for more details.
#
#   You should have received a copy of the GNU General Public License
#   along with this program.  If not, see <http://www.gnu.org/licenses/>.

# make sure XDG_CACHE_HOME is set
. $(librelib conf.sh)

# Usage: blacklist-normalize <$file
# Normalizes the syntax of the blacklist on stdin
blacklist-normalize() {
	sed -e 's/^[^:]*$/&::/' -e 's/^[^:]*:[^:]*$/&:/'
}

# Usage: blacklist-cat
# Prints the blacklist.
# Uses the chache, but downloads it if it doesn't exist. Also normalizes the
# blacklist for easier parsing.
blacklist-cat() {
	local file="$XDG_CACHE_HOME/libretools/blacklist.txt"
	if ! [[ -e $file ]]; then
		# exit on failure, whether set -e or not
		blacklist-update || return $?
	fi
	blacklist-normalize < "$file"
}

# Usage: blacklist-update
# Updates (or creates) the cached copy of the blacklist
blacklist-update() (
	set -euE # allow it to not be set globally
	. libremessages
	load_files libretools
	check_vars BLACKLIST

	local remote_blacklist="$BLACKLIST"
	local local_blacklist="$XDG_CACHE_HOME/libretools/blacklist.txt"

	stat_busy "Downloading blacklist of proprietary software packages"

	mkdir -p "${local_blacklist%/*}"
	if wget -N -q -O "${local_blacklist}.part" "$remote_blacklist" 2>/dev/null; then
		stat_done
		mv "${local_blacklist}.part" "$local_blacklist"
	else
		stat_done
		rm "${local_blacklist}.part"
		if [[ -e "$local_blacklist" ]]; then
			warning "Using local copy of blacklist"
		else
			error "Download failed, exiting"
			return 1
		fi

	fi
)

# Usage: blacklist-cat | blacklist-lookup $pkgname
# Filters to obtain the line for $pkgname from the blacklist on stdin.
# Exits successfully whether a line is found or not.
blacklist-lookup() {
	local pkg=$1
	# we accept that $pkg contains no regex-nes
	blacklist-normalize | grep "^$pkg:" || true
}

# Usage: blacklist-cat | blacklist-get-pkg
# Prints only the package name field of the blacklist line(s) on stdin.
blacklist-get-pkg() {
	blacklist-normalize | cut -d: -f1
}

# Usage: blacklist-cat | blacklist-get-rep
# Prints only the replacement package field of the blacklist line(s) on stdin.
blacklist-get-rep() {
	blacklist-normalize | cut -d: -f2
}

# Usage: blacklist-cat | blacklist-get-reason
# Prints only the reason field of the blacklist line(s) on stdin.
blacklist-get-reason() {
	blacklist-normalize | cut -d: -f3-
}

if [[ "${0##*/}" == libreblacklist ]]; then
	usage-outside() {
		sed -n '/^# Usage:/,/()/p' $0 |
		tr '\n' '\r' | sed 's/\s*()\s*[{(]/\n/g'
	}
	usage-inside() {
		sed 's/\r/\n/g'<<<"$1"|sed '/^$/d'
	}
	usage() {
		if [[ $# -eq 0 ]]; then
			printf "Usage: %s [-h] COMMAND [ARGUMENTS]\n" "${0##*/}"
			echo "Tool for working with the nonfree software blacklist"
			echo
			echo "Commands:"
			usage-outside | while read -r sec; do sec="$(usage-inside "$sec")"
				<<<"$sec" sed -n \
					-e 's/blacklist-//g' \
					-e 's/^# //' \
					-e '2p;$p' |
				tac|tr '\n' '\t'
				echo
			done|column -t -s"$(printf '\t')"|sed 's/^/  /'
		else
			usage-outside | while read -r sec; do sec="$(usage-inside "$sec")"
				cmd=$(<<<"$sec" sed -n 's/.*blacklist[ -]//;$p')
				if [[ "$cmd" == "$1" ]]; then
					<<<"$sec" sed -n \
						-e "s/blacklist-/${0##*/} /g" \
						-e 's/^# //p'
				fi
			done
		fi
	}

	if [[ $# -eq 0 ]]; then
		usage >/dev/stderr
		exit 1
	fi
	_blacklist_cmd=$1
	shift
	if [[ $_blacklist_cmd == -h ]]; then
		usage "$@"
	else
		"blacklist-$_blacklist_cmd" "$@"
	fi
fi