# use markdown template for po4a, or some custom one?
HTMLTEMPLATE = text

# 1:source 2:locales
define SOURCE_template
$(1): $$($(1)_MODULES) $(dummy_MODULES)

.PHONY: $(1)
endef
$(foreach source,$(SOURCES),$(eval $(call SOURCE_template,$(source),$($(source)_LOCALES))))



# Initially clone, and later pull, all Git repositories:
# * Clone master branches from remote origin
# * Clone each non-master from local master

# 1:moduledir 2:locale 3:mastermodule 4:source 5:flavor
define MODULE_template
$(3)_BRANCHES += $$(subst -FLAVOR,$(5:%=-$(5)),$$(subst -LOCALE,$(2:%=-$(2)),$$($(4)_BRANCH)))

$(4): $(1)
ifneq ($(2),)
$(1): $$(subst module,$(3),$$(masterdir))
endif

$(1): origin = $$(if $(2)$(5),$(3),$$(subst MODULE,$(3),$$($(4)_ORIGIN)))
$(1): master = $$(subst -FLAVOR,$(5:%=-$(5)),$$(subst -LOCALE,$(2:%=-$(2)),$$($(4)_BRANCH)))
$(1): branches = $$(if $(2)$(5),,$$(filter-out $$(master),$$($(3)_BRANCHES)))
$(1):
	@[ -d "$$(dir $$@)" ] || ( echo mkdir -p "$$(dir $$@)" && mkdir -p "$$(dir $$@)" )
	@[ -d "$$@" ] || ( echo git clone -o "$(4)" "$$(origin)" "$$@" && git clone -o "$(4)" "$$(origin)" "$$@" )
	@$(MAKE) -f "$$(CURDIR)/make/git.mk" -C "$$@" master="$$(master)" branches="$$(branches)" origin="$(4)" update

# WARNING: this may wipe unrelated files too!
ultraclean::
	rm -rf "$(1)"
ifneq ($(2),)
	rm -rf "$(dir $(1))"
endif

.PHONY: $(1)
endef
$(foreach source,$(SOURCES),$(foreach module,$($(source)_MODULES),$(eval $(call MODULE_template,$(masterdir),,$(module),$(source)))))
$(foreach source,$(SOURCES),$(foreach module,$($(source)_MODULES),$(foreach locale,$($(source)_LOCALES),$(eval $(call MODULE_template,$(l10ndir),$(locale),$(module),$(source))))))
#$(foreach source,$(SOURCES),$(foreach module,$($(source)_MODULES),$(foreach flavor,$(patsubst $(module)-%,%,$($(source)_MODULEFLAVORS)),$(eval $(call MODULE_template,$(flavordir),,$(module),$(source),$(flavor))))))
#$(foreach source,$(SOURCES),$(foreach module,$($(source)_MODULES),$(foreach flavor,$(patsubst $(module)-%,%,$($(source)_MODULEFLAVORS)),$(foreach locale,$($(source)_LOCALES),$(eval $(call MODULE_template,$(flavorl10ndir),$(locale),$(module),$(source),$(flavor)))))))
$(foreach source,$(SOURCES),$(foreach module,$($(source)_MODULES),$(foreach flavor,$($(source)_$(module)_FLAVORS),$(eval $(call MODULE_template,$(flavordir),,$(module),$(source),$(flavor))))))
$(foreach source,$(SOURCES),$(foreach module,$($(source)_MODULES),$(foreach flavor,$($(source)_$(module)_FLAVORS),$(foreach locale,$($(source)_LOCALES),$(eval $(call MODULE_template,$(flavorl10ndir),$(locale),$(module),$(source),$(flavor)))))))



# Override po4a with local Markdown-supportive text module
export PERL5LIB = $(CURDIR)/perl

# 1:moduledir 2:locale 3:mastermodule 4:source
define POT_template
fileformat = $(if $(filter templates,$(3)),$(HTMLTEMPLATE),text)
filetype = $(if $(filter templates,$(3)),tmpl,mdwn)
ALL_POTFILES += $(podir)/$(3).pot
$(3)_L10NFILES = $$(patsubst $(1)/%,%,$$(shell find $(1) -type f -name '*.$$(filetype)' | LANG=C sort))
MASTER_L10NFILES += $$(patsubst %,$(1)/%,$$($(3)_L10NFILES))

$(podir)/$(3).pot: $(1)
	$(MAKE) -f "$$(CURDIR)/make/po4a.mk" -C "$(1)" fileformat="$$(fileformat)" l10nfiles="$$($(3)_L10NFILES)" potfile="$(CURDIR)/$$@" mkpot; \

.PHONY: $(1)
endef
$(foreach source,$(SOURCES),$(foreach module,$($(source)_POMODULES),$(eval $(call POT_template,$(masterdir),,$(module),$(source)))))



# 1:moduledir 2:locale 3:mastermodule 4:source 5:originmodule
define INITPO_template
fileformat = $(if $(filter templates,$(3)),$(HTMLTEMPLATE),text)
filetype = $(if $(filter templates,$(3)),tmpl,mdwn)
ALL_POFILES += $(podir)/$(3).$(2).po
LOCALE_L10NFILES += $$(patsubst %,$(1)/%,$$($(3)_L10NFILES))

$(4)_POMODULES := $(filter-out $(3),$$($(4)_POMODULES))
$(4)_POLOCALES := $(filter-out $(2),$$($(4)_POLOCALES))

$(podir)/$(3).$(2).po: $(3) $(5)
	$(MAKE) -f "$$(CURDIR)/make/po4a.mk" -C "$(3)" fileformat="$$(fileformat)" l10nfiles="$$($(3)_L10NFILES)" masterdir="$$(CURDIR)/$(1)" pofile="$(CURDIR)/$$@" mkpo

# TODO: Implement the below for automated tests, after unfuzzing the above like this:
#	grep -v '^#, fuzzy$' | sed 's/^#, fuzzy,/#,/'
#
#$$(patsubst %,$(1)/%,$$($(3)_L10NFILES)): $(podir)/$(3).$(2).po
#	mkdir -p $(1)
#	$(MAKE) -f "$$(CURDIR)/make/po4a.mk" -C "$(1)" fileformat="$$(fileformat)" l10nfiles="$$($(3)_L10NFILES)" masterdir="$$(CURDIR)/$(3)" pofile="$(CURDIR)/$(podir)/$(3).$(locale).po" threshold=0 "$(CURDIR)/$$@"
endef
$(foreach source,$(SOURCES),$(foreach module,$(po-init-modules),$(foreach locale,$(po-init-locales),$(eval $(call INITPO_template,$(l10ndir),$(locale),$(module),$(source),$(if $(po-init-fromlocale),$(module)_l10n/$(po-init-fromlocale),$(module)))))))



# 1:moduledir 2:locale 3:mastermodule 4:source
define PO_template
fileformat = $(if $(filter templates,$(3)),$(HTMLTEMPLATE),text)
filetype = $(if $(filter templates,$(3)),tmpl,mdwn)
ALL_POFILES += $(podir)/$(3).$(2).po
LOCALE_L10NFILES += $$(patsubst %,$(1)/%,$$($(3)_L10NFILES))

$(podir)/$(3).$(2).po: $(3)
	$(MAKE) -f "$$(CURDIR)/make/po4a.mk" -C "$(3)" fileformat="$$(fileformat)" l10nfiles="$$($(3)_L10NFILES)" pofile="$(CURDIR)/$$@" updatepo

$$(patsubst %,$(1)/%,$$($(3)_L10NFILES)): $(podir)/$(3).$(2).po
	mkdir -p $(1)
	$(MAKE) -f "$$(CURDIR)/make/po4a.mk" -C "$(1)" fileformat="$$(fileformat)" l10nfiles="$$($(3)_L10NFILES)" masterdir="$$(CURDIR)/$(3)" pofile="$(CURDIR)/$(podir)/$(3).$(locale).po" "$$(patsubst $(1)/%,%,$$@)"
endef
# Only update if not initializing - can't do both at once
ifeq ($(po-init-modules),)
$(foreach source,$(SOURCES),$(foreach module,$($(source)_POMODULES),$(foreach locale,$($(source)_POLOCALES),$(eval $(call PO_template,$(l10ndir),$(locale),$(module),$(source))))))
endif



# 1:dummydir
define DUMMYMODULE_template
$(1):
	mkdir -p $$@

# WARNING: this may wipe unrelated files too!
ultraclean::
	rm -rf "$(1)"
endef
$(foreach module,$(dummy_MODULES),$(eval $(call DUMMYMODULE_template,$(masterdir))))



# 1:configfile
define CONFIG_template
$(1):
	mkdir -p $$@

# WARNING: this may wipe unrelated files too!
install::
	ikiwiki --setup $(1) --rebuild
endef
$(foreach config,$(CONFIGS),$(eval $(call CONFIG_template,$(config))))