#!/usr/bin/make -f

## System-wide installation of python/node ?
SYSTEM_INSTALL=0

## Configure this part if you wish to
DEPLOY_REPO=
DEPLOY_OPTS=

## Input directories
SLIDES_DIR=slides
DOCS_DIR=docs
IMAGES_DIR=images
BUILD_DIR=_build
CACHE_DIR=_cache

## Internal directories
CACHE_SLIDES_DIR=$(CACHE_DIR)/slides
CACHE_DOCS_DIR=$(CACHE_DIR)/docs

## Output directories
BUILD_SLIDES_DIR=$(BUILD_DIR)/slides
BUILD_DOCS_DIR=$(BUILD_DIR)/docs
BUILD_IMAGES_DIR=images

BUILD_VERSION := v$(shell date "+%Y%m%d-%H%M")

## Ports
DOCS_PORT=5100
SLIDES_PORT=5200

## Find .md slides
SLIDES_MDPP := $(shell find -L $(SLIDES_DIR) -regextype sed \( -name '*.mdpp' ! -regex '.*/_.*' \))
SLIDES_MDPP_MD := $(patsubst $(SLIDES_DIR)/%.mdpp,$(CACHE_SLIDES_DIR)/%.mdpp.md,$(SLIDES_MDPP))
SLIDES_MDPP_MD_PDF := $(patsubst $(CACHE_SLIDES_DIR)/%.mdpp.md,$(BUILD_SLIDES_DIR)/%.pdf,$(SLIDES_MDPP_MD))
SLIDES_MDPP_MD_PPTX := $(patsubst $(CACHE_SLIDES_DIR)/%.mdpp.md,$(BUILD_SLIDES_DIR)/%.pptx,$(SLIDES_MDPP_MD))

SLIDES_MD := $(shell find -L $(SLIDES_DIR) -regextype sed \( -name '*.md' ! -regex '.*/_.*' \)) $(SLIDES_MDPP_MD)
SLIDES_MD_PDF := $(patsubst $(SLIDES_DIR)/%.md,$(BUILD_SLIDES_DIR)/%.pdf,$(SLIDES_MD))
SLIDES_MD_PPTX := $(patsubst $(SLIDES_DIR)/%.md,$(BUILD_SLIDES_DIR)/%.pptx,$(SLIDES_MD))

SLIDES_MD_ALL := $(SLIDES_MDPP_MD) $(SLIDES_MD) $(SLIDES_DIR)/autoslide.md
SLIDES_PDF_ALL := $(SLIDES_MDPP_MD_PDF) $(SLIDES_MD_PDF) $(BUILD_SLIDES_DIR)/autoslide.pdf
SLIDES_PPTX_ALL := $(SLIDES_MDPP_MD_PPTX) $(SLIDES_MD_PPTX) $(BUILD_SLIDES_DIR)/autoslide.pptx

DOCS_MD=$(shell find -L $(DOCS_DIR) -regextype sed \( -name '*.md' ! -regex '.*/_.*' \))

## Find .uml graphs
DOCS_IMAGES_UML := $(shell find -L $(IMAGES_DIR) -regextype sed \( -name '*.uml' ! -regex '.*/_.*' \))
DOCS_IMAGES_UML_SVG := $(patsubst $(IMAGES_DIR)/%.uml,$(BUILD_IMAGES_DIR)/%.uml.svg,$(DOCS_IMAGES_UML))

## Find .dot graphs
DOCS_IMAGES_DOT := $(shell find -L $(IMAGES_DIR) -regextype sed \( -name '*.dot' ! -regex '.*/_.*' \))
DOCS_IMAGES_DOT_SVG := $(patsubst $(IMAGES_DIR)/%.dot,$(BUILD_IMAGES_DIR)/%.dot.svg,$(DOCS_IMAGES_DOT))

## Find .circo graphs
DOCS_IMAGES_CIRCO := $(shell find -L $(IMAGES_DIR) -regextype sed \( -name '*.circo' ! -regex '.*/_.*' \))
DOCS_IMAGES_CIRCO_SVG := $(patsubst $(IMAGES_DIR)/%.circo,$(BUILD_IMAGES_DIR)/%.circo.svg,$(DOCS_IMAGES_CIRCO))

## Find .ora images
DOCS_IMAGES_ORA := $(shell find -L $(IMAGES_DIR) -regextype sed \( -name '*.ora' ! -regex '.*/_.*' \))
DOCS_IMAGES_ORA_PNG := $(patsubst $(IMAGES_DIR)/%.ora,$(BUILD_IMAGES_DIR)/%.ora.png,$(DOCS_IMAGES_ORA))

## Merge all lists
DOCS_IMAGES_SVG := $(DOCS_IMAGES_DOT_SVG) $(DOCS_IMAGES_CIRCO_SVG) $(DOCS_IMAGES_UML_SVG)
DOCS_IMAGES_PNG := $(DOCS_IMAGES_ORA_PNG)
export

all: help

##
## Install prerequisites
##

.PHONY: prepare
prepare:

images: $(DOCS_IMAGES_SVG) $(DOCS_IMAGES_PNG) ## build images
	@echo "Source:"
	@echo "  ora: $(DOCS_IMAGES_ORA)"
	@echo "  uml: $(DOCS_IMAGES_UML)"
	@echo "  dot: $(DOCS_IMAGES_DOT)"
	@echo "  circo: $(DOCS_IMAGES_CIRCO)"
	@echo "Built: $(DOCS_IMAGES_SVG) $(DOCS_IMAGES_PNG)"
	for dir in $$(find -L $(DOCS_DIR) -type d -regextype sed -regex '.*/[0-9][^/]*/images$$') $(DOCS_DIR)/images ; do \
		rsync -av $$dir/ $(SLIDES_DIR)/images/ || exit 1 ; \
	done

.PHONY: images

%.ora.png: %.ora
	TMPDIR="$$(mktemp -d)" \
		&& unzip -q $< -d "$$TMPDIR" mergedimage.png \
		&& touch "$$TMPDIR/mergedimage.png" \
		&& mv "$$TMPDIR/mergedimage.png" $@

%.uml.svg: %.uml
	plantuml -pipe -tsvg < $< > $@

%.dot.svg: %.dot
	dot -Tsvg $< > $@

%.circo.svg: %.circo
	circo -Tsvg $< > $@

$(CACHE_SLIDES_DIR)/%.mdpp.md: $(SLIDES_DIR)/%.mdpp
	mkdir -p "$$(dirname "$@")"
	m4 -d -I$(SLIDES_DIR) -I$(CACHE_SLIDES_DIR) $< > $@ \
		|| ( rm -f $@ && exit 1 )

watch: ## run development server
	$(MAKE) autoslide
	pipenv run honcho start

serve: watch

.PHONY: watch serve

##
## Build final documents 
##
## slides => PDF
## docs   => static web site
##

build: build-pdf build-html  ## build all documents as PDF and HTML files

build-pptx: ## build both docs and slides as PPTX files
build-html: ## build both docs and slides as HTML files
build-pdf: ## build both docs and slides as PDF files

.PHONY: build

help: ## print this help
	@echo "Usage: make <target>"
	@echo ""
	@echo "With one of following targets:"
	@echo ""
	@awk 'BEGIN {FS = ":.*?## "} \
	  /^[a-zA-Z_-]+:.*?## / \
	  { sub("\\\\n",sprintf("\n%22c"," "), $$2); \
		printf("\033[36m%-20s\033[0m %s\n", $$1, $$2); \
	  }' $(MAKEFILE_LIST) | sort
	@echo ""


##
## Clean
##

clean: # remove generated documents

.PHONY: clean

include tasks/docs.mk
include tasks/slides.mk
include tasks/docker.mk
include tasks/utils.mk
include tasks/images.mk
include tasks/shell.mk