# Copyright 1999-2015 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2

DESCRIPTION="Manage fontconfig /etc/fonts/conf.d/ symlinks"
MAINTAINER="fonts@gentoo.org"
VERSION="1.0"

find_targets() {
	local targets bc x i=0
	bcdirs[i]="${ROOT}/etc/fonts/conf.avail/*.conf"

	if [[ -n "${ES_FONTCONFIG_DIRS}" ]] ; then
		for x in ${ES_FONTCONFIG_DIRS} ; do
			bcdirs[$((++i))]="${x}/*"
		done
	fi

	for bc in ${bcdirs[@]} ; do
		[[ -e ${bc} && ${bc} != *~ ]] && targets="${targets}\n$(basename ${bc})"
	done

	echo -ne ${targets} | sort -u
}

is_enabled() {
	bcdir="${ROOT}/etc/fonts/conf.d"

	[[ -e ${bcdir}/${1} ]] || return 1
	return 0
}

### list action ###

describe_list() {
	echo "List available fontconfig .conf files"
}

do_list() {
	local opts
	targets=( $(find_targets) )
	write_list_start "Available fontconfig .conf files  ( $(highlight '*') is enabled ):"

	if [[ -n "${targets[@]}" ]] ; then
		for (( n = 0 ; n < ${#targets[@]} ; ++n )) ; do
			is_enabled ${opts:-} ${targets[${n}]} && \
				targets[${n}]="${targets[${n}]} $(highlight '*')"
		done
		write_numbered_list "${targets[@]}"
	else
		write_kv_list_entry "(none found)" ""
	fi

	return 0
}

### enable action ###

describe_enable() {
	echo "Enable specified fontconfig .conf file(s)"
}

describe_enable_parameters() {
	echo "<target>"
}

describe_enable_options() {
	echo "<target> : Target name or number (from 'list' action)"
}

do_enable() {
	local bc bcdir="${ROOT}/etc/fonts/conf.d"

	[[ -z ${1} ]] && die -q "You didn't specify any .conf files to enable"

	# create directory if necessary
	if [[ ! -d ${bcdir} && -w $(dirname ${bcdir}) ]] ; then
		mkdir ${bcdir} || die -q "Failed to create ${bcdir}"
	elif [[ ! -d ${bcdir} ]] ; then
		die -q "You don't have permission to create ${bcdir}"
	fi

	# make sure we have proper permissions
	[[ -w ${bcdir} ]] || \
		die -q "You don't have permission to write to ${bcdir}"

	targets=( $(find_targets) )

	for bc in $@ ; do
		local file target=${bc}

		is_number "${target}" && \
			target=${targets[$(( ${target} - 1 ))]}

		[[ -z "${target}" ]] && \
			die -q "Target \"${bc}\" doesn't appear to be valid!"

		bc=${target}

		# ignore any unrecognized options
		[[ ${bc} == --* ]] && continue

		# what form is the argument in?
		case "${bc}" in
			# absolute path
			/*)
				file="${ROOT}/${bc}"
				;;
			# relative path
			*/*)
				file="${ROOT}/${PWD}/${bc}"
				;;
			# no path
			*)
				# CWD
				if [[ -f ${bc} ]] ; then
					file="${ROOT}/${PWD}/${bc}"
				# assume /etc/fonts/conf.avail
				elif [[ -f ${ROOT}/etc/fonts/conf.avail/${bc} ]]
				then
					file="${ROOT}/etc/fonts/conf.avail/${bc}"
				else
					if [[ -n "${ES_FONTCONFIG_DIRS}" ]] ; then
						for x in ${ES_FONTCONFIG_DIRS} ; do
							[[ -f ${x}/${bc} ]] && file="${x}/${bc}"
						done
					fi

					[[ -e ${file} ]] || \
						file="${ROOT}/etc/fonts/conf.avail/${bc}"
				fi
				;;
		esac

		# does it exist?
		if [[ ! -e ${file} ]] ; then
			write_error_msg "${file} doesn't exist"
			continue
		fi

		# already installed?
		if [[ -e ${bcdir}/$(basename ${bc}) ]] ; then
			write_error_msg "$(basename ${bc}) is already installed"
			continue
		fi

		# finally, create the symlink
		ln -s "${file}" "${bcdir}" || \
			die -q "Failed to create symlink from '${file}' to '${bcdir}'"
	done
}

### disable action ###

describe_disable() {
	echo "Disable specified fontconfig .conf file(s)"
}

describe_disable_parameters() {
	echo "<target>"
}

describe_disable_options() {
	echo "<target> : Target name or number (from 'list' action)"
}


do_disable() {
	local bc bcdir="${ROOT}/etc/fonts/conf.d"

	[[ -z ${1} ]] && die -q "You didn't specify any .conf files to disable"

	targets=( $(find_targets) )

	for bc in $@ ; do
		local file target=${bc}

		is_number "${target}" && \
			target=${targets[$(( ${target} - 1 ))]}

		[[ -z "${target}" ]] && \
			die -q "Target \"${bc}\" doesn't appear to be valid!"

		bc=${target}
		file="${bcdir}/${bc}"

		# ignore any unrecognized options
		[[ ${bc} == --* ]] && continue

		# is in installed?
		if [[ ! -e ${file} ]] ; then
			write_error_msg "${bc} is not installed"
			continue
		fi

		# remove it if we have permissions
		if [[ -w $(dirname ${file}) ]] ; then
			rm "${file}" || die -q "Failed to remove ${file}"
		else
			die -q "You don't have permission to remove ${file}"
		fi
	done
}

# vim: set ft=eselect :
