# -*-eselect-*-  vim: ft=eselect
# Copyright 1999-2022 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

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

find_targets() {
	local bc bcdirs=()

	for bc in /etc/fonts/conf.avail ${ES_FONTCONFIG_DIRS}; do
		bcdirs+=("${EROOT}${bc}/*.conf")
	done

	for bc in ${bcdirs[@]}; do
		[[ -e ${bc} ]] && echo "${bc##*/}"
	done | sort -u
}

is_enabled() {
	[[ -e ${EROOT}/etc/fonts/conf.d/${1} ]]
}

### list action ###

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

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

	for (( n = 0; n < ${#targets[@]}; ++n )); do
		is_enabled "${targets[n]}" &&
			targets[n]=$(highlight_marker "${targets[n]}")
	done
	write_numbered_list -m "(none found)" "${targets[@]}"
}

### 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="${EROOT}/etc/fonts/conf.d" x

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

	# create directory if necessary
	if [[ ! -d ${bcdir} && -w ${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}"

	local targets=($(find_targets))

	for bc; 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="${EROOT}${bc}"
				;;
			# relative path
			*/*)
				file="${EROOT}${PWD}/${bc}"
				;;
			# no path
			*)
				[[ -n ${ES_FONTCONFIG_DIRS} ]] &&
				for x in ${ES_FONTCONFIG_DIRS}; do
					[[ -f ${EROOT}${x}/${bc} ]] && file="${EROOT}${x}/${bc}" && break
				done || file="${EROOT}/etc/fonts/conf.avail/${bc}"
				;;
		esac

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

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

		# finally, create the symlink
		ln -rs "${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="${EROOT}/etc/fonts/conf.d"

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

	local targets=($(find_targets))

	for bc; 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 ${file%/*} ]]; then
			rm "${file}" || die -q "Failed to remove ${file}"
		else
			die -q "You don't have permission to remove ${file}"
		fi
	done
}
