#!/usr/bin/make -f

SRC_FILES := $(shell find program skins plugins -path program/js/tinymce -prune -o -type f -print)
PLUGINS := $(patsubst plugins/%/composer.json,%,$(wildcard plugins/*/composer.json))
SKINS := $(patsubst skins/%/meta.json,%,$(wildcard skins/*/meta.json))
CORE_PLUGINS = filesystem_attachments jqueryui

# don't use bin/install-jsdeps.sh on purpose: we need to export to the right place and minify manually
JSDEPS_FILES = program/js/publickey.js \
	$(shell find tinymce/js/tinymce -path tinymce/js/tinymce/plugins/compat3x -prune -o \
		\( \! -path tinymce/js/tinymce/license.txt \! -path tinymce/js/tinymce/langs/readme.md -type f \) \
		-printf "program/js/tinymce/%P\\n" )
JSDEPS_FILES_NOSHRINK = $(patsubst tinymce-langs/%,program/js/tinymce/langs/%,$(wildcard tinymce-langs/*.js))

%:
	dh $@ --with phpcomposer

program/js/publickey.js: $(wildcard debian/missing-sources/publickey-*.js)
	install -m0644 -DT -- $< $@

program/js/tinymce/%: tinymce/js/tinymce/%
	install -m0644 -DT -- $< $@

program/js/tinymce/langs/%.js: tinymce-langs/%.js
	install -m0644 -DT -- $< $@

JS_MINFILES = $(patsubst %.js,%.min.js,$(filter-out %.min.js,$(filter %.js,$(SRC_FILES) $(JSDEPS_FILES))))
CSS_MINFILES = $(patsubst %.css,%.min.css,$(filter-out %.min.css, \
		$(filter %.css,$(SRC_FILES) $(JSDEPS_FILES))) $(CSS_GENFILES_ELASTIC)) \
	$(addprefix program/js/tinymce/skins/lightgray/,skin.min.css skin.mobile.min.css \
		content.mobile.min.css content.min.css content.inline.min.css)
CSS_GENFILES_ELASTIC = $(addprefix skins/elastic/styles/,styles.css print.css embed.css)
, = ,

# Minify JS: generate .min.js from .js source (cf. bin/jsshrink.sh)
%.min.js: %.js
	uglifyjs --compress --mangle $(if $(filter $@.map,$(GENERATED_MAPFILES)),--source-map "base='$(dir $@)'$(,)url='$(notdir $@).map'",) \
		-o $@ -- $<

# Minify CSS: generate .min.css from .css source (cf. bin/cssshrink.sh)
CSS_STAMPFILE = updatecss-stamp
%.min.css: %.css $(CSS_STAMPFILE)
	cd $(dir $@) && cleancss $(if $(filter $@.map,$(GENERATED_MAPFILES)),--source-map,) -o $(notdir $@) -- $(notdir $<)

# XXX bin/updatecss.sh edits CSS sources in place, so auto_clean might
# not cleanup; it is idempotent so it doesn't matter too much for us though
updatecss: $(CSS_STAMPFILE)
$(CSS_STAMPFILE): $(filter-out %.min.css,$(filter %.css,$(SRC_FILES))) $(CSS_GENFILES_ELASTIC)
	env ROUNDCUBE_CONFIG_DIR=$(CURDIR)/config bin/updatecss.sh
	touch -- $@
.PHONY: updatecss

# Cf. skins/elastic/README.md
$(CSS_GENFILES_ELASTIC): skins/elastic/%.css: skins/elastic/%.less
	cd skins/elastic && lessc --source-map "$*.less" "$*.css"

# Cf. tinymce/Gruntfile.js
program/js/tinymce/skins/lightgray/skin.min.css: \
		tinymce/src/skins/lightgray/main/less/desktop/Skin.less
	lessc --compress --js "$<" "$@"
program/js/tinymce/skins/lightgray/skin.mobile.min.css: \
		tinymce/src/skins/lightgray/main/less/mobile/app/mobile-less.less
	lessc --compress "$<" "$@"
program/js/tinymce/skins/lightgray/content.mobile.min.css: \
		tinymce/src/skins/lightgray/main/less/mobile/content.less
	lessc --compress "$<" "$@"
program/js/tinymce/skins/lightgray/content.min.css: \
		tinymce/src/skins/lightgray/main/less/desktop/Content.less
	lessc --compress "$<" "$@"
program/js/tinymce/skins/lightgray/content.inline.min.css: \
		tinymce/src/skins/lightgray/main/less/desktop/Content.Inline.less
	lessc --compress "$<" "$@"

# For each plugin with a config.inc.php.dist, we create a config.inc.php with dummy content
PLUGINS_CONFIGURABLE = $(patsubst plugins/%/config.inc.php.dist,%, \
	$(wildcard $(patsubst %,plugins/%/config.inc.php.dist,$(PLUGINS))))
PLUGIN_CONF_GEN = $(patsubst %,plugins/%/config.inc.php,$(PLUGINS_CONFIGURABLE))
$(PLUGIN_CONF_GEN): plugins/%/config.inc.php: plugins/%/config.inc.php.dist
	$(file >$@,<?php)
	$(file >>$@,// Empty configuration for $*)
	$(file >>$@,// See /usr/share/roundcube/plugins/$*/config.inc.php.dist for instructions)
	$(file >>$@,// Check the access right of the file if you put sensitive information in it.)
	$(file >>$@,$$config=array();)
	$(file >>$@,?>)

GENERATED_FILES = $(PLUGIN_CONF_GEN) $(JSDEPS_FILES) $(JSDEPS_FILES_NOSHRINK) \
	$(JS_MINFILES) $(CSS_MINFILES) $(CSS_GENFILES_ELASTIC)

# Skip source map creation for the bundled stuff
GENERATED_MAPFILES = $(addsuffix .map,$(filter-out program/js/publickey.min.js program/js/tinymce/%, \
	$(filter %.css %.js,$(JS_MINFILES) $(CSS_MINFILES) $(CSS_GENFILES_ELASTIC))))
GENERATED_FILES += $(GENERATED_MAPFILES)
$(GENERATED_MAPFILES): %.map: | % ;

# Pre-compress minified files (and also tinymce-langs/*.js and embed.css,
# since for these the client never requests the minified version)
COMPRESSED_FILES = $(JS_MINFILES) $(CSS_MINFILES) \
	$(filter %.css %.js,$(JSDEPS_FILES_NOSHRINK) $(CSS_GENFILES_ELASTIC))
COMPRESSED_FILES := $(addsuffix .gz,$(COMPRESSED_FILES))
GENERATED_FILES += $(COMPRESSED_FILES)
$(COMPRESSED_FILES): %.gz: %
	pigz -11 -mnk -- $<

execute_after_dh_auto_clean:
	debconf-updatepo
	@rm -f -- $(GENERATED_FILES) $(CSS_STAMPFILE)
	@rm -rf -- program/js/tinymce

override_dh_auto_build: $(GENERATED_FILES) ;
.SECONDARY:

override_dh_auto_test:
	env RCUBE_INSTALL_PATH=$(CURDIR) phpunit -c tests/phpunit.xml

execute_after_dh_install:
	install -m0644 .htaccess debian/roundcube-core/etc/roundcube/htaccess
	install -m0644 composer.json-dist debian/roundcube-core/usr/share/roundcube/composer.json

	# database intial
	install -m0644 -DT SQL/mysql.initial.sql    debian/roundcube-core/usr/share/dbconfig-common/data/roundcube/install/mysql
	install -m0644 -DT SQL/postgres.initial.sql debian/roundcube-core/usr/share/dbconfig-common/data/roundcube/install/pgsql
	install -m0644 -DT SQL/sqlite.initial.sql   debian/roundcube-core/usr/share/dbconfig-common/data/roundcube/install/sqlite3

	# database update
	cp -rt debian/roundcube-core/usr/share/dbconfig-common/data/roundcube/upgrade debian/sql/*

	# install plugins
ifneq ($(CORE_PLUGINS),)
	dh_install -proundcube-core $(addprefix plugins/,$(CORE_PLUGINS)) \
		usr/share/roundcube/plugins
endif
ifneq ($(filter-out $(CORE_PLUGINS),$(PLUGINS)),)
	dh_install -proundcube-plugins $(addprefix plugins/,$(filter-out $(CORE_PLUGINS),$(PLUGINS))) \
		usr/share/roundcube/plugins
endif

	# install plugin configuration
	$(foreach plugin,$(PLUGINS_CONFIGURABLE), \
		dh_install -p$(if $(filter $(plugin),$(CORE_PLUGINS)),roundcube-core,roundcube-plugins) \
			plugins/$(plugin)/config.inc.php etc/roundcube/plugins/$(plugin) && \
		) true

	# setup /usr/share/bug/$PACKAGE/control files
	$(foreach pkg,$(shell dh_listpackages), \
		install -m0644 -DT -- debian/bug.control debian/$(pkg)/usr/share/bug/$(pkg)/control && \
		) true

	# remove irrelevant upstream stuff from binary packages
	find debian/roundcube-*/usr/share/roundcube -name .gitignore -type f -delete
	rm -rf debian/roundcube-*/usr/share/roundcube/plugins/*/tests/

override_dh_installdocs:
	dh_installdocs --link-doc=roundcube-core -proundcube -proundcube-core
	dh_installdocs -proundcube-mysql -proundcube-pgsql -proundcube-sqlite3 -proundcube-plugins

	# remove documentation from /usr/share/roundcube/ and install into /usr/share/doc/roundcube-*/
	rm -f debian/roundcube-*/usr/share/roundcube/program/lib/Roundcube/README.md \
		debian/roundcube-*/usr/share/roundcube/skins/*/README* \
		debian/roundcube-*/usr/share/roundcube/plugins/*/README*

	$(foreach doc,$(wildcard skins/*/README* $(patsubst %,plugins/%/README*,$(CORE_PLUGINS))), \
		install -m0644 -DT $(doc) debian/roundcube-core/usr/share/doc/roundcube-core/$(doc) && \
		) true
	$(foreach doc,$(wildcard $(patsubst %,plugins/%/README*,$(filter-out $(CORE_PLUGINS),$(PLUGINS)))), \
		install -m0644 -DT $(doc) debian/roundcube-plugins/usr/share/doc/roundcube-plugins/$(doc) && \
		) true

	install -m0755 -Dd debian/$(if $(filter managesieve,$(CORE_PLUGINS)),roundcube-core,roundcube-plugins)/usr/share/doc/roundcube-plugins/plugins/managesieve
	mv -nt debian/$(if $(filter managesieve,$(CORE_PLUGINS)),roundcube-core,roundcube-plugins)/usr/share/doc/roundcube-plugins/plugins/managesieve \
		debian/$(if $(filter managesieve,$(CORE_PLUGINS)),roundcube-core,roundcube-plugins)/usr/share/roundcube/plugins/managesieve/helpdocs

override_dh_phpcomposer:
	dh_phpcomposer --sourcedirectory=$(CURDIR)/debian/roundcube-core/usr/share/roundcube

execute_after_dh_link:
	# symlink plugin configuration (and delete existing usr/share/roundcube/plugins/*/config.inc.php
	# file which we installed as etc/roundcube/plugins/*/config.inc.php instead)
	$(foreach plugin,$(PLUGINS_CONFIGURABLE), \
		dh_link -p$(if $(filter $(plugin),$(CORE_PLUGINS)),roundcube-core,roundcube-plugins) \
			etc/roundcube/plugins/$(plugin)/config.inc.php usr/share/roundcube/plugins/$(plugin)/config.inc.php && \
		) true

	# symlink plugin directories to var/lib/roundcube/plugins
	$(foreach plugin,$(PLUGINS), \
		dh_link -p$(if $(filter $(plugin),$(CORE_PLUGINS)),roundcube-core,roundcube-plugins) \
			usr/share/roundcube/plugins/$(plugin) var/lib/roundcube/plugins/$(plugin) && \
		) true

	# symlink skin directories to var/lib/roundcube/skins
	$(foreach skin,$(SKINS), \
		dh_link -proundcube-core usr/share/roundcube/skins/$(skin) var/lib/roundcube/skins/$(skin) && \
		) true

	# fix library path
	dh_link -p$(if $(filter jqueryui,$(CORE_PLUGINS)),roundcube-core,roundcube-plugins) \
		usr/share/javascript/jquery-minicolors/jquery.minicolors.min.js usr/share/roundcube/plugins/jqueryui/js/jquery.minicolors.min.js \
		usr/share/javascript/jquery-ui/jquery-ui.js                     usr/share/roundcube/plugins/jqueryui/js/jquery-ui.js \
		usr/share/javascript/jquery-ui/jquery-ui.min.js                 usr/share/roundcube/plugins/jqueryui/js/jquery-ui.min.js \
		usr/share/javascript/jquery-ui/ui/i18n                          usr/share/roundcube/plugins/jqueryui/js/i18n
	dh_link -p$(if $(filter managesieve,$(CORE_PLUGINS)),roundcube-core,roundcube-plugins) \
		usr/share/javascript/codemirror/addon/selection usr/share/roundcube/plugins/managesieve/codemirror/addon/selection \
		usr/share/javascript/codemirror/lib             usr/share/roundcube/plugins/managesieve/codemirror/lib \
		usr/share/javascript/codemirror/mode/sieve      usr/share/roundcube/plugins/managesieve/codemirror/mode/sieve

execute_after_dh_fixperms:
	# roundcube-core only make scripts in bin dir executable
	find debian/roundcube-core/usr/share/roundcube     -type f -exec chmod -x -- {} +
	find debian/roundcube-core/usr/share/roundcube/bin -type f -exec chmod +x -- {} +

	# plugins: make everything non executable
	find debian/roundcube-plugins/usr/share/roundcube -type f -exec chmod -x -- {} +
	chmod 0755 debian/$(if $(filter password,$(CORE_PLUGINS)),roundcube-core,roundcube-plugins)/usr/share/roundcube/plugins/password/helpers/*.p[ly] \
	           debian/roundcube-*/usr/share/roundcube/plugins/*/bin/*.sh
