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

EAPI=8

inherit fossil desktop

DESCRIPTION="GUI client for XMPP (Jabber) instant messaging protocol, written in Tcl/Tk."
HOMEPAGE="http://tkabber.jabber.ru/"

RDEPEND="
	>=dev-lang/tcl-8.5
	>=dev-lang/tk-8.5
	>=dev-tcltk/tcllib-1.6
	>=dev-tcltk/bwidget-1.3
	gpg? ( dev-tcltk/tclgpg )
	ssl? ( >=dev-tcltk/tls-1.4.1 )
	sound? ( dev-tcltk/snack )
	trayicon? ( >=dev-tcltk/tktray-1.1 )
	tkimg? ( >=dev-tcltk/tkimg-1.4.6 )
	udp? ( dev-tcltk/tcludp )"
DEPEND="${DEPEND}
	doc? ( app-text/xml2rfc )"

LICENSE="GPL-2"
SLOT="0"
IUSE="contrib gpg +doc examples plugins 3rd-party-plugins ssl sound tkimg trayicon +udp vanilla fix-site-plugins-path remote-controlling"

OFFICIAL_TKABBER_PLUGINS_DIR="${S}/plugins/official"
THIRD_PARTY_TKABBER_PLUGINS_DIR="${S}/plugins/3rd-party"
TKABBER_SITE_PLUGINS="/usr/share/tkabber/site-plugins"
INCOMPATIBLE_PLUGINS="pluginmanager"
TKIMG_DEPENDENT_PLUGINS="alarm vimage"

src_unpack() {
	fossil_fetch 'https://chiselapp.com/user/sgolovan/repository/tkabber' tkabber
	fossil_fetch 'https://chiselapp.com/user/sgolovan/repository/tclxmpp' tkabber/tclxmpp
	if use plugins; then
		fossil_fetch 'https://chiselapp.com/user/sgolovan/repository/tkabber-plugins' plugins/official
	fi
	if use 3rd-party-plugins; then
		fossil_fetch 'https://chiselapp.com/user/sgolovan/repository/tkabber-contrib' plugins/3rd-party
	fi
}

src_prepare() {
	if use vanilla; then
		return
	fi

	# Fix default official and third party plugins directory
	if use fix-site-plugins-path; then
		cd "${S}/tkabber" || die "Can't chdir to ${S}/tkabber"
		eapply "${FILESDIR}/tkabber.tcl.site.plugins.patch"
		sed -i -e 's#TKABBER_SITE_PLUGINS_PATH_PLACEHOLDER#'"${TKABBER_SITE_PLUGINS}"'#' \
			tkabber.tcl || die "Failed to fix default site plugins path in tkabber.tcl"
	fi

	default
}

src_compile() {
	if use 3rd-party-plugins && has vimage ${TKABBER_PLUGINS}; then
		cd "${THIRD_PARTY_TKABBER_PLUGINS_DIR}/vimage/lib/tkImageTools" \
			|| die "Cannot cd to tkImageTools"
		# Replace hardcoded tcl version
		if has_version ">=dev-lang/tcl-8.6"; then
			sed -i -e 's/MINOR_VERSION = 5/MINOR_VERSION = 6/' Makefile \
				|| die "Cannot patch tkImageTools Makefile"
		fi
		emake
	fi
}

src_install() {
	insinto "/usr/share/${PN}"
	cd "${S}/tkabber/" || die "Can't chdir to ${S}/tkabber/"

	local x
	local DOCSDIRS="doc examples contrib"

	for x in *; do
		if [[ -d "${x}" ]] ; then
			if ! has "${x}" ${DOCSDIRS} ; then
				doins -r "${x}"
			fi
		fi
	done

	sed -i -e 's#\[fullpath ChangeLog\]#"/usr/share/doc/'"$PF"'/ChangeLog"#' tkabber.tcl \
		|| die "Failed to fix Changelog fullpath in tkabber.tcl"

	doins *.tcl

	emake DESTDIR="${D}" PREFIX="/usr" install-bin

	if use doc ; then
		emake DESTDIR="${D}" PREFIX="/usr" DOCDIR="/usr/share/doc/${PF}" install-doc
	fi

	if use examples ; then
		emake DESTDIR="${D}" PREFIX="/usr" DOCDIR="/usr/share/doc/${PF}" install-examples
	fi

	if use contrib ; then
		insinto "/usr/share/doc/${PF}"
		doins -r contrib
	fi

	doicon "${FILESDIR}/${PN}.png"
	make_desktop_entry ${PN} Tkabber

	if use plugins || use 3rd-party-plugins; then
		TKABBER_PLUGINS="${TKABBER_PLUGINS:-}"

		if use plugins; then
			local EXISTING_OFFICIAL_TKABBER_PLUGINS="$(dirlist "${OFFICIAL_TKABBER_PLUGINS_DIR}")"
		fi
		if use 3rd-party-plugins; then
			local EXISTING_THIRD_PARTY_TKABBER_PLUGINS="$(dirlist "${THIRD_PARTY_TKABBER_PLUGINS_DIR}")"
		fi

		cd "${S}" || die "Can't chdir to ${S}"

		plugins_verify \
			$(use plugins && echo official) \
			$(use 3rd-party-plugins && echo 3rd-party)

		if use plugins; then
			plugins_install official \
				|| die "Failed to install official plugins"
		fi

		if use 3rd-party-plugins; then
			plugins_install 3rd-party \
				|| die "Failed to install 3rd-party plugins"
		fi

		cd "${OFFICIAL_TKABBER_PLUGINS_DIR}" \
			|| die "Can't chdir to ${OFFICIAL_TKABBER_PLUGINS_DIR}"
		newdoc README README.plugins
		newdoc ChangeLog ChangeLog.plugins
	fi
	# Remove the fucking stupid shit
	use vanilla || rm -rf "$D/usr/share/tkabber/plugins/chat/shuffle.tcl" "$D/usr/share/tkabber/site-plugins/flip" || die

	# Remove the server trust (XEP-0146 support)
	use remote-controlling || rm -rf "$D/usr/share/tkabber/plugins/general/remote.tcl" || die
}

pkg_postinst() {
	einfo "By default tkabber uses an internal XML parser. You may want"
	einfo "to use an external one for (dubious) performance reasons,"
	einfo "in which case you may like to emerge dev-tcltk/tdom (and put"
	einfo "\"package require tdom\" in your ~/.tkabber/config.tcl)."
	einfo
	einfo "You may also optionally emerge dev-tcltk/tclx to theoretically"
	einfo "speed some other of tkabber's pure-Tcl operations up,"
	einfo "as you'd get them written in C. Real performance gains are"
	einfo "subject to further tests."
	einfo
	if ! use tkimg; then
		ewarn "dev-tcltk/tkimg adds support for PNG and JPG images, such as avatars,"
		ewarn "photos, non-default emoticons, etc. Some plugins, for example the"
		ewarn "\"alarm\" plugin may not function correctly without dev-tcltk/tkimg"
		ewarn
	fi
	plugins_inform
}

# Getting list of directories in current or specified by argument directory.
dirlist() {
	local i
	local OUTPUT
	local TARGET_DIR
	if [[ -n "${1}" ]]; then
		[[ -d ${1} ]] || die "${1} directory not found"
		TARGET_DIR="${1}/"
	fi
	for i in ${TARGET_DIR}*; do
		[[ -d "${i}" ]] && OUTPUT="${OUTPUT} $(basename ${i})"
	done
	echo ${OUTPUT}
}

plugins_verify() {
	local PLUGINS
	local ABSENT_PLUGINS
	local DEPENDENT_PLUGINS
	local i
	AVAILABLE_PLUGINS=""

	until [ -z "$1" ] ; do
		case "${1}" in
			official)
			AVAILABLE_PLUGINS="${AVAILABLE_PLUGINS} ${EXISTING_OFFICIAL_TKABBER_PLUGINS}"
			;;
			3rd-party)
			fix_existing_third_party_tkabber_plugins
			AVAILABLE_PLUGINS="${AVAILABLE_PLUGINS} ${EXISTING_THIRD_PARTY_TKABBER_PLUGINS}"
			;;
			*)
			die "$0: wrong argument"
			;;
		esac
		shift
	done

	# Verifying plugins existence.
	if [[ -n "$TKABBER_PLUGINS" ]]; then
		PLUGINS=( ${TKABBER_PLUGINS} )
		TKABBER_PLUGINS=""
		for i in "${PLUGINS[@]}"; do
			if has "${i}" ${AVAILABLE_PLUGINS}; then
				TKABBER_PLUGINS="${TKABBER_PLUGINS} ${i}"
			else
				ABSENT_PLUGINS="${ABSENT_PLUGINS} ${i}"
			fi
		done
		if [[ -n "${ABSENT_PLUGINS}" ]]; then
			ewarn
			ewarn "Following plugins specified in the TKABBER_PLUGINS environment variable"
			ewarn "are not present in the svn repositories:"
			ewarn
			ewarn "${ABSENT_PLUGINS}"
			ewarn
		fi
	fi

	if ! use tkimg; then
		PLUGINS=( ${TKABBER_PLUGINS:-${AVAILABLE_PLUGINS}} )
		for i in "${PLUGINS[@]}"; do
			if has "${i}" ${TKIMG_DEPENDENT_PLUGINS}; then
				DEPENDENT_PLUGINS="${DEPENDENT_PLUGINS} ${i}"
			fi
		done
		if [[ -n "${DEPENDENT_PLUGINS}" ]]; then
			eerror
			eerror "The \"tkimg\" USE-flag is not enabled, but the following plugins depend on dev-tcltk/tkimg:"
			eerror
			eerror "${DEPENDENT_PLUGINS}"
			eerror
			eerror "Please activate the \"tkimg\" USE-flag before installing these plugins"
			eerror
			die "\"tkimg\" USE-flag required, but not enabled."
		fi
	fi
}

plugins_inform() {
	if ! use plugins && ! use 3rd-party-plugins; then
		return
	fi

	if [[ -z "${TKABBER_PLUGINS}" ]]; then
		einfo "You selected to install plugins via the plugins and/or 3rd-party-plugins"
		einfo "USE variables. Please note, that if you wish to install only particular"
		einfo "plugins from all available ones, you need to specify them in the"
		einfo "TKABBER_PLUGINS variable in make.conf."
		einfo
		einfo "Currently the following plugins are available:"
		einfo
		einfo "${AVAILABLE_PLUGINS}"
		einfo
	fi
}

plugins_install() {
	insinto "${TKABBER_SITE_PLUGINS}"
	local PLUGINS
	local EXISTING_PLUGINS
	local PLUGINS_DIR

	case "${1}" in
		official)
		EXISTING_PLUGINS="${EXISTING_OFFICIAL_TKABBER_PLUGINS}"
		PLUGINS_DIR="${OFFICIAL_TKABBER_PLUGINS_DIR}"
		;;
		3rd-party)
		EXISTING_PLUGINS="${EXISTING_THIRD_PARTY_TKABBER_PLUGINS}"
		PLUGINS_DIR="${THIRD_PARTY_TKABBER_PLUGINS_DIR}"
		;;
		*)
		die "$0: wrong argument"
		;;
	esac

	PLUGINS=( ${TKABBER_PLUGINS:-${EXISTING_PLUGINS}} )

	[[ -d "${D}/${TKABBER_SITE_PLUGINS}" ]] || mkdir "${D}/${TKABBER_SITE_PLUGINS}"
	for i in "${PLUGINS[@]}"; do
		if has "${i}" ${EXISTING_PLUGINS}; then
			doins -r "${PLUGINS_DIR}/${i}"
		fi
	done
}

# Fixing EXISTING_THIRD_PARTY_TKABBER_PLUGINS for avoiding collision of same plugins
# from different svn repositories and installation unix-incompatible plugins.
fix_existing_third_party_tkabber_plugins() {
	local PLUGINS=( ${EXISTING_THIRD_PARTY_TKABBER_PLUGINS} )
	local CONFLICTING_PLUGINS
	EXISTING_THIRD_PARTY_TKABBER_PLUGINS=""

	for i in "${PLUGINS[@]}"; do
		if ! has "${i}" ${EXISTING_OFFICIAL_TKABBER_PLUGINS}; then
			if ! has "${i}" ${INCOMPATIBLE_PLUGINS}; then
				EXISTING_THIRD_PARTY_TKABBER_PLUGINS="${EXISTING_THIRD_PARTY_TKABBER_PLUGINS} ${i}"
			fi
		else
			CONFLICTING_PLUGINS="${CONFLICTING_PLUGINS} ${i}"
		fi
	done

	if [[ -n "${CONFLICTING_PLUGINS}" ]]; then
		ewarn
		ewarn "Repositories have the following plugins duplicated,"
		ewarn "official versions of this plugins will be prefered:"
		ewarn "${CONFLICTING_PLUGINS}"
		ewarn
	fi
}