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

EAPI=5

PYTHON_COMPAT=( python2_7 )
AUTOTOOLS_AUTORECONF=yes

inherit autotools-utils multilib gnome2-utils eutils python-single-r1

DESCRIPTION="An email client (and news reader) based on GTK+"
HOMEPAGE="http://www.claws-mail.org/"

SRC_URI="http://www.claws-mail.org/download.php?file=releases/${P}.tar.xz"

SLOT="0"
LICENSE="GPL-3"
KEYWORDS="~alpha ~amd64 ~arm ~hppa ~mips ~ppc ~ppc64 ~sparc ~x86 ~x86-fbsd"

IUSE="archive bogofilter calendar clamav dbus debug doc gdata gtk3 +imap ipv6 ldap +libcanberra +libindicate +libnotify networkmanager nntp +notification pda pdf perl +pgp python rss session sieve smime spamassassin spam-report spell +gnutls startup-notification valgrind webkit xface"
REQUIRED_USE="libcanberra? ( notification )
	libindicate? ( notification )
	libnotify? ( notification )
	networkmanager? ( dbus )
	smime? ( pgp )"

# Plugins are all integrated or dropped since 3.9.1
PLUGINBLOCK="!!mail-client/claws-mail-acpi-notifier
	!!mail-client/claws-mail-archive
	!!mail-client/claws-mail-att-remover
	!!mail-client/claws-mail-attachwarner
	!!mail-client/claws-mail-clamd
	!!mail-client/claws-mail-fancy
	!!mail-client/claws-mail-fetchinfo
	!mail-client/claws-mail-gdata
	!!mail-client/claws-mail-geolocation
	!!mail-client/claws-mail-gtkhtml
	!!mail-client/claws-mail-mailmbox
	!!mail-client/claws-mail-newmail
	!!mail-client/claws-mail-notification
	!!mail-client/claws-mail-perl
	!!mail-client/claws-mail-python
	!!mail-client/claws-mail-rssyl
	!!mail-client/claws-mail-spam-report
	!!mail-client/claws-mail-tnef-parse
	!!mail-client/claws-mail-vcalendar
	!!mail-client/claws-mail-address_keeper
	!!mail-client/claws-mail-pdf-viewer"

COMMONDEPEND=">=sys-devel/gettext-0.12.1
	gdata? ( >=dev-libs/libgdata-0.17.1 )
	gtk3? ( x11-libs/gtk+:3 )
	!gtk3? ( >=x11-libs/gtk+-2.20:2 )
	pda? ( >=app-pda/jpilot-0.99 )
	gnutls? ( >=net-libs/gnutls-2.2.0 )
	ldap? ( >=net-nds/openldap-2.0.7 )
	pgp? ( >=app-crypt/gpgme-0.4.5 )
	valgrind? ( dev-util/valgrind )
	dbus? ( >=dev-libs/dbus-glib-0.60 )
	spell? ( >=app-text/enchant-1.0.0 )
	imap? ( >=net-libs/libetpan-0.57 )
	nntp? ( >=net-libs/libetpan-0.57 )
	startup-notification? ( x11-libs/startup-notification )
	session? ( x11-libs/libSM
			x11-libs/libICE )
	archive? ( app-arch/libarchive
		>=net-misc/curl-7.9.7 )
	bogofilter? ( mail-filter/bogofilter )
	notification? (
		libnotify? ( x11-libs/libnotify )
		libcanberra? (  media-libs/libcanberra[gtk] )
		libindicate? ( dev-libs/libindicate:3[gtk] )
		dev-libs/glib:2
	)
	smime? ( >=app-crypt/gpgme-0.4.5 )
	calendar? ( >=net-misc/curl-7.9.7 )
	pdf? ( app-text/poppler[cairo] )
	spam-report? ( >=net-misc/curl-7.9.7 )
	webkit? ( >=net-libs/webkit-gtk-1.0:2 )
"

DEPEND="${PLUGINBLOCK}
	${COMMONDEPEND}
	app-arch/xz-utils
	xface? ( >=media-libs/compface-1.4 )
	virtual/pkgconfig"

RDEPEND="${COMMONDEPEND}
	pdf? ( app-text/ghostscript-gpl )
	clamav? ( app-antivirus/clamav )
	networkmanager? ( net-misc/networkmanager )
	perl? ( dev-lang/perl:= )
	python? ( ${PYTHON_DEPS}
		>=dev-python/pygtk-2.10.3 )
	rss? ( net-misc/curl
		dev-libs/libxml2 )
	app-misc/mime-types
	x11-misc/shared-mime-info"

src_configure() {
	# Don't use libsoup-gnome (bug #565924)
	export HAVE_LIBSOUP_GNOME=no

	local myeconfargs=(
		$(use_enable debug crash-dialog)
		$(use_enable valgrind valgrind)
		$(use_enable doc manual)
		$(use_enable gtk3)
		$(use_enable ipv6)
		$(use_enable ldap)
		$(use_enable dbus dbus)
		$(use_enable networkmanager)
		$(use_enable pda jpilot)
		$(use_enable session libsm)
		$(use_enable spell enchant)
		$(use_enable gnutls)
		$(use_enable startup-notification)
		$(use_enable xface compface)
		$(use_enable archive archive-plugin)
		$(use_enable bogofilter bogofilter-plugin)
		$(use_enable calendar vcalendar-plugin)
		$(use_enable clamav clamd-plugin)
		$(use_enable gdata gdata-plugin)
		$(use_enable notification notification-plugin)
		$(use_enable pdf pdf_viewer-plugin)
		$(use_enable perl perl-plugin)
		$(use_enable pgp pgpmime-plugin)
		$(use_enable pgp pgpinline-plugin)
		$(use_enable pgp pgpcore-plugin)
		$(use_enable python python-plugin)
		$(use_enable rss rssyl-plugin)
		$(use_enable spamassassin spamassassin-plugin)
		$(use_enable sieve managesieve-plugin)
		$(use_enable smime smime-plugin)
		$(use_enable spam-report spam_report-plugin)
		$(use_enable webkit fancy-plugin)
		--enable-alternate-addressbook
		--enable-nls
		--enable-acpi_notifier-plugin
		--enable-address_keeper-plugin
		--enable-att_remover-plugin
		--enable-attachwarner-plugin
		--enable-fetchinfo-plugin
		--enable-mailmbox-plugin
		--enable-newmail-plugin
		--enable-tnef_parse-plugin
		--disable-generic-umpc
		--disable-bsfilter-plugin
	)

	# libetpan is needed if user wants nntp or imap functionality
	if use imap || use nntp; then
		myeconfargs+=( --enable-libetpan )
	else
		myeconfargs+=( --disable-libetpan )
	fi

	autotools-utils_src_configure
}

src_install() {
	local DOCS=( AUTHORS ChangeLog* INSTALL* NEWS README* TODO* )
	autotools-utils_src_install

	# Makefile install claws-mail.png in /usr/share/icons/hicolor/48x48/apps
	# => also install it in /usr/share/pixmaps for other desktop envs
	# => also install higher resolution icons in /usr/share/icons/hicolor/...
	insinto /usr/share/pixmaps
	doins ${PN}.png
	local res resdir
	for res in 64x64 128x128 ; do
		resdir="/usr/share/icons/hicolor/${res}/apps"
		insinto ${resdir}
		newins ${PN}-${res}.png ${PN}.png
	done

	docinto tools
	dodoc tools/README*

	domenu ${PN}.desktop

	einfo "Installing extra tools"
	cd "${S}"/tools
	exeinto /usr/$(get_libdir)/${PN}/tools
	doexe *.pl *.py *.conf *.sh
	doexe tb2claws-mail update-po uudec uuooffice

	# kill useless files
	rm -f "${D}"/usr/lib*/claws-mail/plugins/*.{a,la}
}

pkg_preinst() {
	gnome2_icon_savelist
}

pkg_postinst() {
	ewarn "When upgrading from version 3.9.0 or below some changes have happened:"
	ewarn "- There are no individual plugins in mail-client/claws-mail-* anymore, but they are integrated mostly controlled through USE flags"
	ewarn "- Plugins with no special dependencies are just built and can be loaded through the interface"
	ewarn "- The gtkhtml2, dillo and trayicon plugins have been dropped entirely"
	gnome2_icon_cache_update
}

pkg_postrm() {
	gnome2_icon_cache_update
}
