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

EAPI=5

PYTHON_COMPAT=( python2_7 )

inherit eutils qt4-r2 fdo-mime python-single-r1 toolchain-funcs

DESCRIPTION="Qt based clone of the Origin plotting package"
HOMEPAGE="http://soft.proindependent.com/qtiplot.html
	http://www.staff.science.uu.nl/~zeven101/qtiplot.html"
SRC_URI="
	https://dev.gentoo.org/~dilfridge/distfiles/${P}.tar.bz2
	https://dev.gentoo.org/~dilfridge/distfiles/${P}-origin.patch.bz2"

LICENSE="GPL-2 GPL-3"
SLOT="0"
KEYWORDS="~amd64 ~x86 ~amd64-linux ~x86-linux"
IUSE="bindist doc mono latex python"

LANGS="cn cz de es fr ja ro ru sv"
for l in ${LANGS}; do
	lu=${l/cz/cs}
	lu=${lu/cn/zh_CN}
	IUSE="${IUSE} linguas_${lu}"
done

REQUIRED_USE="python? ( ${PYTHON_REQUIRED_USE} )"

# qwtplot3d much modified from original upstream
# >=x11-libs/qwt-5.3 they are using trunk checkouts
CDEPEND="
	media-libs/libemf
	dev-qt/qthelp:4
	dev-qt/qtgui:4
	dev-qt/qtopengl:4
	dev-qt/qt3support:4
	dev-qt/qthelp:4[compat]
	dev-qt/qtsvg:4
	>=x11-libs/gl2ps-1.3.5[png]
	>=dev-cpp/muParser-1.32
	>=dev-libs/boost-1.35.0:=
	dev-libs/quazip
	media-libs/libpng:=
	sci-libs/alglib:=
	sci-libs/gsl
	sci-libs/tamu_anova
	latex? ( dev-tex/qtexengine )
	mono? ( dev-dotnet/libgdiplus )
	python? (
		${PYTHON_DEPS}
		>=dev-python/PyQt4-4.11.3[X,${PYTHON_USEDEP}]
		)"
DEPEND="${CDEPEND}
	virtual/pkgconfig
	python? ( >=dev-python/sip-4.16.5[${PYTHON_USEDEP}] )
	doc? (
		>=app-text/docbook-sgml-utils-0.6.14-r1
		>=app-text/docbook-xml-dtd-4.4-r2:4.4 )"

RDEPEND="${CDEPEND}"

PATCHES=(
	"${DISTDIR}"/${P}-origin.patch.bz2
	"${FILESDIR}"/${P}-origin-2.patch
	"${FILESDIR}"/${P}-qt48.patch
	"${FILESDIR}"/${PN}-0.9.8.8-system-gl2ps.patch
	"${FILESDIR}"/${PN}-0.9.7.10-dont-install-qwt.patch
	"${FILESDIR}"/${PN}-0.9.8.6-gold.patch
	"${FILESDIR}"/${PN}-0.9.8.7-kde.patch
	"${FILESDIR}"/${P}-set_col_values.patch
	"${FILESDIR}"/${P}-adopt_to_alglib3.patch
	"${FILESDIR}"/${P}-crasher_without_internet.patch
	"${FILESDIR}"/${P}-private.patch
	"${FILESDIR}"/${P}-sip-4.15.patch
	"${FILESDIR}"/${P}-PyQt4-4.11.3.patch
	)

RESTRICT="!bindist? ( bindist )"

pkg_setup() {
	use python && python-single-r1_pkg_setup
}

src_prepare() {
	local mylibs

	qt4-r2_src_prepare

	rm -rf 3rdparty/{liborigin,QTeXEngine,/qwtplot3d/3rdparty/gl2ps/,boost,alglib} || die
	sed \
		-e "s:dll:static:g" \
		-e "/INSTALLS/d" \
		-i 3rdparty/qwtplot3d/*.pro

	mylibs="${mylibs} -lquazip"
	use mono && mylibs="${mylibs} $($(tc-getPKG_CONFIG) --libs libgdiplus)"

	# Check build.conf for changes on bump.
	cat > build.conf <<-EOF
	# Automatically generated by Gentoo ebuild
	isEmpty( QTI_ROOT ) {
	  message( "each file including this config needs to set QTI_ROOT to the dir containing this file!" )
	}

	MUPARSER_LIBS = $($(tc-getPKG_CONFIG) --libs muparser)
	GSL_LIBS = $($(tc-getPKG_CONFIG) --libs gsl)
	QWT_INCLUDEPATH = \$\$QTI_ROOT/3rdparty/qwt/src
	QWT_LIBS = \$\$QTI_ROOT/3rdparty/qwt/lib/libqwt.a
	QWT3D_INCLUDEPATH = \$\$QTI_ROOT/3rdparty/qwtplot3d/include
	QWT3D_LIBS = \$\$QTI_ROOT/3rdparty/qwtplot3d/lib/libqwtplot3d.a
	EMF_INCLUDEPATH = "${EPREFIX}/usr/include/libEMF
	SYS_LIBS = -lgl2ps ${mylibs} -lGLU

	LUPDATE = lupdate
	LRELEASE = lrelease

	SCRIPTING_LANGS += muParser

	CONFIG          += release
	CONFIG          += CustomInstall
	DEFINES         += SCRIPTING_CONSOLE

	LIBPNG_LIBS = $($(tc-getPKG_CONFIG) --libs libpng)
	TAMUANOVA_LIBS = -ltamuanova
	TAMUANOVA_INCLUDEPATH = "${EPREFIX}/usr/include/tamu_anova"
	ALGLIB_LIBS = -lalglib

	EOF

	use bindist && echo "DEFINES         += QTIPLOT_SUPPORT" >> build.conf
	use bindist || echo "DEFINES         += QTIPLOT_PRO" >> build.conf
	use python && echo "SCRIPTING_LANGS += Python" >> build.conf
	use python && echo "PYTHON = ${EPYTHON}" >> build.conf
	use latex && echo "TEX_ENGINE_LIBS = -lQTeXEngine" >> build.conf

	sed \
		-e "s:doc/${PN}/manual:doc/${PN}/html:" \
		-e '/INSTALLS.*documentation/d' \
		-e '/INSTALLS.*manual/d' \
		-e "/INSTALLBASE/s: /usr: ${EPREFIX}/usr:g" \
		-e 's:/usr/local/qtiplot:$$INSTALLBASE:g' \
		-i qtiplot/qtiplot.pro || die

	if use python; then
		sed \
			-e "s:/usr/local/${PN}:${EPREFIX}$(python_get_sitedir)/qtiplot:" \
			-i qtiplot/qtiplot.pro || die
	fi

	sed \
		-e "/^target.path/s:/usr:${EPREFIX}/usr:g" \
		-i fitPlugins/*/*.pro || die

	sed -e '/manual/d' -i qtiplot.pro || die

	sed -e "s:QTIPLOT_PRO:QTIPLOT_PROFESSIONAL:g" -i qtiplot/src/core/main.cpp || die

	# Drop langs only if LINGUAS is not empty
	if [[ -n ${LINGUAS} ]]; then
		for l in ${LANGS}; do
			lu=${l/cz/cs}
			lu=${lu/cn/zh_CN}
			use linguas_${lu} || \
				sed -e "s:translations/qtiplot_${l}.[tq][sm]::" \
						-i qtiplot/qtiplot.pro || die
		done
	fi

	sed \
		-e "s:d_python_config_folder + \":\"${EPREFIX}/usr/share/qtiplot:g" \
		-i qtiplot/src/core/ApplicationWindow.cpp || die

	chmod -x qtiplot/qti_wordlist.txt

	# sed out debian paths
	sed -e 's:\(/usr/share/sgml/\)docbook/stylesheet/dsssl/modular\(/html/docbook.dsl\):\1stylesheets/dsssl/docbook\2:' \
		-i manual/qtiplot.dsl || die
	sed -e 's:\(/usr/share/\)xml/docbook/stylesheet/nwalsh\(/html/chunk.xsl\):\1sgml/docbook/xsl-stylesheets\2:' \
		-i manual/qtiplot_html.xsl || die

	sed \
		-e '1i#define OF(x) x' \
		-i 3rdparty/zlib/minigzip.c || die
}

src_configure() {
	use amd64 && export QMAKESPEC="linux-g++-64"
	eqmake4
}

src_compile() {
	emake
	lrelease qtiplot/qtiplot.pro || die
	if use doc; then
		cd manual
		emake web
	fi
}

src_install() {
	qt4-r2_src_install

	insinto /usr/share/qtiplot
	doins qtiplot/qti_wordlist.txt

	newicon qtiplot_logo.png qtiplot.png
	make_desktop_entry qtiplot "QtiPlot Scientific Plotting" qtiplot

	use doc && dohtml -r manual/html/*

	use python && python_optimize

	if [[ -n ${LINGUAS} ]]; then
		insinto /usr/share/${PN}/translations
		for l in ${LANGS}; do
			lu=${l/cz/cs}
			lu=${lu/cn/zh_CN}
			use linguas_${lu} && \
				doins qtiplot/translations/qtiplot_${l}.qm
		done
	fi
}

pkg_postinst() {
	if use python; then
		optfeature "Enhanced python support" \
			dev-python/pygsl dev-python/rpy sci-libs/scipy dev-python/sympy
	fi

	fdo-mime_desktop_database_update
}

pkg_postrm() {
	fdo-mime_desktop_database_update
}
