.DEFAULT_GOAL = all

PDFLATEX = lualatex
PDFTOPPM = pdftoppm
PDFUNITE = pdfunite


PDFTOPPM_FLAGS = -singlefile -png -r 300

COMMON_TEX_FILES = common.tex libs.tex colors.tex tikzcards.tex

# The full path to the Makefile
MAKEFILE_PATH := $(abspath $(lastword $(MAKEFILE_LIST)))
# The path to the directory of the Makefile
MAKEFILE_DIR := $(dir $(MAKEFILE_PATH))

LATEX_ROOT := $(MAKEFILE_DIR)
GAME_ROOT := $(MAKEFILE_DIR)/..
DATA_ROOT := $(GAME_ROOT)/data
CARDS_YML_DIR := $(DATA_ROOT)/cards

# the default language
LANGUAGE ?= en

CARDS_TEX_DIR := $(LATEX_ROOT)/cards/$(LANGUAGE)

BUILDDIR := $(LATEX_ROOT)/build/$(LANGUAGE)

ASSETS_PATH := $(GAME_ROOT)/assets
PDFLATEX_ENV := TEXINPUTS=".:$(ASSETS_PATH):"

GENERATE_CARD := $(GAME_ROOT)/scripts/generate_card.py
GENERATE_CARD_FLAGS := --language=$(LANGUAGE)

SETS := $(shell find $(CARDS_YML_DIR) -mindepth 1 -type d -printf "%f\n")
SETS_SOURCEDIRS := $(foreach set, $(SETS), $(addprefix $(CARDS_YML_DIR)/, $(set)))

SETS_TEXDIRS := $(foreach set, $(SETS), $(addprefix $(CARDS_TEX_DIR)/, $(set)))
SETS_BUILDDIRS := $(foreach set, $(SETS), $(addprefix $(BUILDDIR)/, $(set)))

# tex directory for sets collection tex
SETS_TEX_DIR := $(LATEX_ROOT)/sets/$(LANGUAGE)
SETS_TEX := $(foreach set, $(SETS), $(addprefix $(SETS_TEX_DIR)/, $(set).tex))
SETS_PDF_DIR := $(BUILDDIR)
SETS_PDF := $(foreach set, $(SETS), $(addprefix $(SETS_PDF_DIR)/, $(set).pdf))

# Add all dirs to VPATH where we generate or store dependencies
VPATH = $(SETS_SOURCEDIRS) $(SETS_TEXDIRS) $(SETS_TEX_DIR) $(CARDS_TEX_DIR)

# Create a list of yaml card definitions
CARDS_YML := $(foreach dir,$(SETS_SOURCEDIRS),$(wildcard $(dir)/*.yml))
CARDS_TEX := $(subst $(CARDS_YML_DIR),$(CARDS_TEX_DIR),$(CARDS_YML:.yml=.tex))
CARDS_PDF := $(subst $(CARDS_YML_DIR),$(BUILDDIR),$(CARDS_YML:.yml=.pdf))
CARDS_PNG = $(CARDS_PDF:.pdf=.png)

SPECIAL_CARDS_TEX := unit_explanation.tex
SPECIAL_CARDS_PDF := $(foreach card, $(SPECIAL_CARDS_TEX), $(addprefix $(BUILDDIR)/, $(card:.tex=.pdf)))
SPECIAL_CARDS_PNG := $(SPECIAL_CARDS_PDF:.pdf=.png)

VERBOSE ?= @

MAKEFILE_LIST = Makefile

define generateSetTexRules
$(SETS_TEX_DIR)/$(1).tex: $(wildcard $(CARDS_TEX_DIR)/$(1)/*.tex) $(MAKEFILE_LIST)
	@echo "generating $(1) tex"
	@if test \( ! \( -d $$(@D) \) \) ;then mkdir -p $$(@D);fi
	$(VERBOSE) echo "\documentclass[a4paper,landscape]{article}" > $$@
	$(VERBOSE) echo "\usepackage[margin=6mm,top=5mm]{geometry}" >> $$@
	$(VERBOSE) echo "\input{libs.tex}" >> $$@
	$(VERBOSE) echo "\input{colors.tex}" >> $$@
	$(VERBOSE) echo "\input{tikzcards.tex}" >> $$@
	$(VERBOSE) echo "\usepackage{standalone}" >> $$@
	$(VERBOSE) echo "\begin{document}" >> $$@
	$(VERBOSE) echo "\begin{center}" >> $$@
	$(VERBOSE) echo "\pagestyle{empty}" >> $$@
	$(VERBOSE)for card in $(wildcard $(CARDS_TEX_DIR)/$(1)/*.tex); do \
		rel_card=$$$${card#"$(LATEX_ROOT)/"}; \
		echo "\includestandalone{$$$${rel_card%.tex}}" >> $$@; done
	$(VERBOSE) echo "\end{center}" >> $$@
	$(VERBOSE) echo "\end{document}" >> $$@
endef

# Generate set tex rules
$(foreach set, $(SETS), $(eval $(call generateSetTexRules,$(set))))

define generateCardTexRules
$(1)/%.tex: %.yml $(GENERATE_CARD)
	@echo building		 $$@
	@if test \( ! \( -d $$(@D) \) \) ;then mkdir -p $$(@D);fi
	$(VERBOSE)$(GENERATE_CARD) $(GENERATE_CARD_FLAGS) $$< > $$@
endef

# Generate cards tex rules
$(foreach texdir, $(SETS_TEXDIRS), $(eval $(call generateCardTexRules, $(texdir))))

define generatePdfRules
$(1)/%.pdf: %.tex $(COMMON_TEX_FILES) $(MAKEFILE_LIST)
	@echo building		 $$@
	@if test \( ! \( -d $$(@D) \) \) ;then mkdir -p $$(@D);fi
	$(VERBOSE)$(PDFLATEX_ENV) $(PDFLATEX) --output-directory $$(@D) $$<
endef

# Generate cards pdf rules
$(foreach pdfdir, $(SETS_BUILDDIRS), $(eval $(call generatePdfRules, $(pdfdir))))
# Generate sets pdf rule
$(eval $(call generatePdfRules, $(SETS_PDF_DIR)))


.PHONY: all de en
all: de en
de:
	$(MAKE) LANGUAGE=de cards-all sets

en:
	$(MAKE) cards-all sets

.PHONY: sets sets-tex sets-pdf
sets: sets-tex sets-pdf
sets-tex: $(SETS_TEX)
sets-pdf: $(SETS_PDF)

.PHONY: cards-all cards-tex cards-pdf cards-png
cards-all: cards-tex cards-pdf cards-png
	@echo "building		$(LANGUAGE) cards"

cards-tex: $(CARDS_TEX)
cards-pdf: $(CARDS_PDF) $(SPECIAL_CARDS_PDF) $(BUILDDIR)/cards.pdf
cards-png: $(CARDS_PNG) $(SPECIAL_CARDS_PNG)

$(BUILDDIR)/cards.pdf: $(CARDS_PDF) $(MAKEFILE_LIST)
	@echo "building ›  ›   $@"
	@if test \( ! \( -d $(@D) \) \) ;then mkdir -p $(@D);fi
	$(VERBOSE)$(PDFUNITE) $(CARDS_PDF) $@

%.png: %.pdf $(MAKEFILE_LIST)
	@echo "png ›   $@"
	@if test \( ! \( -d $(@D) \) \) ;then mkdir -p $(@D);fi
	$(VERBOSE)$(PDFTOPPM) $(PDFTOPPM_FLAGS) $< $*

.PHONY: clean-build clean-tex clean-both tabula-rasa

clean-build:
	rm -rf $(BUILDDIR)

clean-tex:
	rm -rf $(CARDS_TEX_DIR)

clean-both: clean-build clean-tex

tabula-rasa:
	$(MAKE) LANGUAGE=en clean-both
	$(MAKE) LANGUAGE=de clean-both
