# -*-eselect-*-  vim: ft=eselect
# Copyright 1999-2015 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Id$

DESCRIPTION="Manage /usr/bin/pdftex implementations"
MAINTAINER="tex@gentoo.org"
SVN_DATE='$Date: 2015/03/31 16:53:36 $'
VERSION=$(svn_date_to_version "${SVN_DATE}" )

# find a list of pdftex symlink targets, best first
find_targets() {
	local f
	for f in "${ROOT}"/usr/bin/pdftex-*; do
		if [[ -f ${f} ]] ; then
			echo "${f##*/pdftex-}"
		fi
	done | sort
}

# find version number of currently symlinked version
identify_target() {
	local f
	f="$(canonicalise "${ROOT}"/usr/bin/pdftex)"
	echo "${f##*/pdftex-}"
}

# try to remove the pdftex symlink
remove_symlinks() {
	rm -f "${ROOT}"/usr/bin/pdftex &>/dev/null
}

# set the pdftex symlink
set_symlinks() {
	local target="${1}" targets
	if is_number "${target}" && [[ ${target} -ge 1 ]] ; then
		targets=( $(find_targets ) )
		target=${targets[$(( ${target} - 1 ))]}
	fi
	if [[ -f "${ROOT}/usr/bin/pdftex-${target}" ]] ; then
		remove_symlinks
		ln -s "pdftex-${target}" "${ROOT}/usr/bin/pdftex" || \
			die "Could not set ${target} /usr/bin/pdftex symlink"
		echo "Updating TeX formats"
		"${ROOT}"/usr/bin/fmtutil-sys --all &>/dev/null || write_warning_msg "Could not update TeX formats for some reason, pdftex may not work properly."
	else
		die -q "Target \"${target}\" doesn't appear to be valid!"
	fi
}

### show action ###

describe_show() {
	echo "Show the current pdftex version"
}

do_show() {
	[[ -z "${@}" ]] || die -q "Too many parameters"

	write_list_start "Current pdftex verson:"
	if [[ -L "${ROOT}/usr/bin/pdftex" ]] ; then
		write_kv_list_entry "$(identify_target)" ""
	elif [[ -e "${ROOT}/usr/bin/pdftex" ]] ; then
		write_kv_list_entry "(not a symlink)" ""
	else
		write_kv_list_entry "(unset)" ""
	fi
}

### list action ###

describe_list() {
	echo "List available pdftex versions"
}

do_list() {
	[[ -z "${@}" ]] || die -q "Too many parameters"

	local i targets current
	targets=( $(find_targets ) )
	current=$(identify_target)
	for (( i = 0; i < ${#targets[@]}; i++ )); do
		[[ ${targets[i]} = ${current} ]] \
			&& targets[i]=$(highlight_marker "${targets[i]}")
	done
	write_list_start "Available pdftex versions:"
	write_numbered_list -m "(none found)" "${targets[@]}"
}

### set action ###

describe_set() {
	echo "Set a new pdftex version"
}

describe_set_options() {
	echo "target : Target version number or index from 'list' action"
}

describe_set_parameters() {
	echo "<target>"
}

do_set() {
	if [[ -z "${1}" ]] ; then
		die -q "You didn't give me a version number"

	elif [[ -n "${2}" ]] ; then
		die -q "Too many parameters"

	elif [[ -L "${ROOT}/usr/bin/pdftex" ]] ; then
		if ! remove_symlinks ; then
			die -q "Can't remove existing version symlink"
		elif ! set_symlinks "${1}" ; then
			die -q "Can't set new version"
		fi

	elif [[ -e "${ROOT}/usr/bin/pdftex" ]] ; then
		die -q "${ROOT}/usr/bin/pdftex seems to be from an old ebuild, please remove manually"
	else
		set_symlinks "${1}" || die -q "Can't set new version"
	fi
}

### update action ###

describe_update() {
	echo "Automatically update the pdftex version number"
}

describe_update_options() {
	echo "--if-unset : Do not override currently selected version"
}

do_update() {
	[[ -z "${1}" ]] || ( [[ -z "${2}" ]] && [[ "${1}" == "--if-unset" ]] ) || \
		die -q "Usage error"

	if [[ -L "${ROOT}/usr/bin/pdftex" ]] ; then
		[[ ${1} == "--if-unset" ]] && return
		remove_symlinks || die -q "Can't remove existing symlink"
	fi
	if [[ -e "${ROOT}/usr/bin/pdftex" ]] ; then
		die -q "${ROOT}/usr/bin/pdftex seems to be from an old ebuild, please remove manually"
	elif ! [[ -z $(find_targets ) ]] ; then
		set_symlinks 1 || die -q "Can't set a new version"
	fi
}
