.DEFAULT_GOAL = all
SHELL := /usr/bin/bash

PDFLATEX ?= pdflatex
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 := $(realpath $(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

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

GENERATE_DECK := $(GAME_ROOT)/scripts/generate_deck.py
GENERATE_DECK_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))

DECKS_SOURCEDIR := $(DATA_ROOT)/decks
DECKS := $(shell find $(DECKS_SOURCEDIR) -mindepth 1 -type f -name "*.deck" -printf "%f\n")
DECKS := $(foreach deck, $(DECKS), $(subst .deck,,$(deck)))

DECKS_TEX_DIR := $(LATEX_ROOT)/decks/$(LANGUAGE)
DECKS_TEX := $(foreach deck, $(DECKS), $(addprefix $(DECKS_TEX_DIR)/, $(deck).tex))

DECKS_PDF_DIR := $(BUILDDIR)/decks
DECKS_PDF :=  $(foreach deck, $(DECKS), $(addprefix $(DECKS_PDF_DIR)/, $(deck).pdf))

# Add all dirs to VPATH where we generate or store dependencies
VPATH = $(SETS_SOURCEDIRS) $(SETS_TEXDIRS) $(SETS_TEX_DIR) $(DECKS_SOURCEDIR) $(DECKS_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)

CARDFMT = $(LATEX_ROOT)/card.fmt
$(CARDFMT): $(COMMON_TEX_FILES)
	$(PDFLATEX) -ini -jobname="card" "&$(PDFLATEX)" mylatexformat.ltx $(CARDS_TEX_DIR)/base/archer.tex

MATERIAL_DIR := $(LATEX_ROOT)/material
MATERIAL_BUILDDIR := $(BUILDDIR)/material
PLAYER_TABLEAU_DIR := $(MATERIAL_DIR)/player-tableau/$(LANGUAGE)
PLAYER_TABLEAU_BUILDDIR := $(MATERIAL_BUILDDIR)/player-tableau
PLAYER_TABLEAU_TEX := $(wildcard $(PLAYER_TABLEAU_DIR)/player-tableau-*.tex)
PLAYER_TABLEAU_PDF := $(subst $(PLAYER_TABLEAU_DIR),$(MATERIAL_BUILDDIR)/player-tableau,$(PLAYER_TABLEAU_TEX:.tex=.pdf))

MATERIAL := $(PLAYER_TABLEAU_PDF)

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))))

$(DECKS_TEX_DIR)/%.tex: $(DECKS_SOURCEDIR)/%.deck $(GENERATE_DECK)
	@echo generating		 $@
	@if test \( ! \( -d $(@D) \) \) ;then mkdir -p $(@D);fi
	$(VERBOSE) $(GENERATE_DECK) $(GENERATE_DECK_FLAGS) $< > $@

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: $(2)%.tex $(COMMON_TEX_FILES) $(MAKEFILE_LIST)
	@echo building		 $$@
	@if test \( ! \( -d $$(@D) \) \) ;then mkdir -p $$(@D);fi
	$(VERBOSE) TEXINPUTS=".:$(ASSETS_PATH):$(2):" $(PDFLATEX) --output-directory $$(@D) $$<

endef

define generateCardPdfRules
$(1)/%.pdf: %.tex $(COMMON_TEX_FILES) $(CARDFMT) $(MAKEFILE_LIST)
	@echo building		 $$@
	@if test \( ! \( -d $$(@D) \) \) ;then mkdir -p $$(@D);fi
	$(VERBOSE) TEXINPUTS=".:$(ASSETS_PATH):$(2):" $(PDFLATEX) --fmt $(CARDFMT) --output-directory $$(@D) $$<
endef

# Generate cards pdf rules
$(foreach pdfdir, $(SETS_BUILDDIRS), $(eval $(call generateCardPdfRules, $(pdfdir),)))
# Misc cards not in a set
$(eval $(call generatePdfRules, $(BUILDDIR),))
# Generate sets pdf rule
$(eval $(call generatePdfRules, $(SETS_PDF_DIR),$(SETS_TEX_DIR)/))
# Generate decks pdf rule
$(eval $(call generatePdfRules, $(DECKS_PDF_DIR),$(DECKS_TEX_DIR)/))
# Misc player tableau pdf rules
$(eval $(call generatePdfRules, $(PLAYER_TABLEAU_BUILDDIR),$(PLAYER_TABLEAU_DIR)/))


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

en:
	$(MAKE) cards-all sets decks material

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

.PHONY: decks decks-tex decks-pdf
decks: decks-tex decks-pdf
sets-tex: $(DECKS_TEX)
sets-pdf: $(DECKS_PDF)

.PHONY: material
material: $(MATERIAL)

.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 $(LATEX_ROOT)/cards/*

clean-both: clean-build clean-tex

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

sync-with-website:
	rsync -ruvz --include='*/' --include='*.pdf' --include='*.png' --exclude='*' \
	      $(LATEX_ROOT)/build/ muhq.space:html/muhqs-game/latex/build
	ssh muhq.space 'chmod -R u=rwX,go=rX ~/html'
