################################################################################
## Document Parameters #########################################################
################################################################################

# Name of the main file, without the .tex extension.
DOCUMENT_FILENAME ?= main

################################################################################
## Binaries ####################################################################
################################################################################
BIBTEX ?= bibtex
GLOSSARIES ?= makeglossaries
INKSCAPE ?= inkscape
M4 ?= m4
PDFLATEX ?= pdflatex

################################################################################
## Deducing Main Target ########################################################
################################################################################
ifeq ($(strip $(PDFVIEWER)),)
main_target: compile

else
main_target: view

endif

################################################################################
## Basic Makefile Shenanigans ##################################################
################################################################################
COMMA =,

################################################################################
## Localising Relevant Files ###################################################
################################################################################
TEX_FILES = $(shell find ${CURDIR} -iname \*.tex)
SVG_FILES = $(shell find ${CURDIR} -type f -iname \*.svg)
MACRO_FILES = $(shell find ${CURDIR} -iname \*.m4t)
MACRO_MAIN_FILES = $(shell find ${CURDIR} -iname \*.m4)

#### Handling Bibliography #####################################################
BIBLIO_LINE = $(shell grep -o -h -r "^\\\\bibliography{.*}" ${CURDIR})

ifeq ($(strip $(BIBLIO_LINE)),)
BIBLIO_FILES =
BIBLIO_CMD = echo 'Bibtex: No biblio, skipping...'
else
BIBLIO_LIST = $(patsubst \bibliography{%},%$(COMMA),$(BIBLIO_LINE))
BIBLIO_FILES = $(subst $(COMMA),.bib ,$(BIBLIO_LIST))
BIBLIO_CMD = $(BIBTEX) $(DOCUMENT_FILENAME)
endif

################################################################################
## Managing Preprocessor Scripts ###############################################
################################################################################
MACRO_FILE_RESULTS = $(patsubst %.m4t,%,$(MACRO_FILES))

$(MACRO_FILE_RESULTS): %: %.m4t $(MACRO_MAIN_FILES)
	m4 -P $< > $@

preprocessor_target: $(MACRO_FILE_RESULTS)

################################################################################
## Managing SVG to PDF Conversion ##############################################
################################################################################
PDF_IMG_FILES = $(patsubst %.svg,%.pdf,$(SVG_FILES))

ifeq ($(shell which $(INKSCAPE)),)
$(PDF_IMG_FILES): %.pdf: %.svg
	$(warning $@ is outdated, but $(INKSCAPE) is not available to re-create it)
else
$(PDF_IMG_FILES): %.pdf: %.svg
	$(INKSCAPE) -z $< --export-pdf=$@
endif

svg_conversion_target: $(PDF_IMG_FILES)

################################################################################
## Making the Actual PDF #######################################################
################################################################################
$(DOCUMENT_FILENAME).pdf:\
		$(TEX_FILES) $(BIBLIO_FILES) $(PDF_IMG_FILES) $(MACRO_FILE_RESULTS) \
		Makefile
	$(PDFLATEX) $(DOCUMENT_FILENAME).tex
	$(BIBLIO_CMD)
	$(GLOSSARIES) $(DOCUMENT_FILENAME)
	$(PDFLATEX) $(DOCUMENT_FILENAME).tex
	$(PDFLATEX) $(DOCUMENT_FILENAME).tex
	grep -i "\\(Reference\\|Citation\\).*undefined" $(DOCUMENT_FILENAME).log || true

################################################################################
## Secondary Targets ###########################################################
################################################################################

view: compile
	$(PDFVIEWER) $(DOCUMENT_FILENAME).pdf

compile: preprocessor_target svg_conversion_target $(DOCUMENT_FILENAME).pdf
	$(MAKE) clean_mess

edit:
	$(EDITOR) $(TEX_FILES)

clean:
	rm -f $(filter-out $(DOCUMENT_FILENAME).tex,$(wildcard $(DOCUMENT_FILENAME).*))

################################################################################
clean_mess:
	rm -f \
		$(filter-out $(DOCUMENT_FILENAME).tex, \
			$(filter-out $(DOCUMENT_FILENAME).pdf, \
				$(wildcard $(DOCUMENT_FILENAME)\.*) \
			) \
		)
