PANDOC ?= pandoc
YQ ?= yq
OPEN ?= open

BOOK_META_FILE ?= book.yaml
OUT_DIR ?= out

READEST_APP ?= Readest

DOCX_FILTER_FILE := filters/docx-double-paragraphs.lua

CHAPTERS := $(sort $(wildcard [0-9][0-9]-*.md))
TITLE_SLUG := $(shell $(YQ) -r '.title // "book"' $(BOOK_META_FILE) | tr '[:upper:]' '[:lower:]' | sed 's/[^a-z0-9]/-/g' | sed 's/--*/-/g' | sed 's/^-//;s/-$$//')

HTML_FILES := $(patsubst %.md,$(OUT_DIR)/%.html,$(CHAPTERS))
EPUB_FILES := $(patsubst %.md,$(OUT_DIR)/%.epub,$(CHAPTERS))
ODT_FILES := $(patsubst %.md,$(OUT_DIR)/%.odt,$(CHAPTERS))
DOCX_FILES := $(patsubst %.md,$(OUT_DIR)/%.docx,$(CHAPTERS))
ALL_EPUB := $(OUT_DIR)/$(TITLE_SLUG).epub

PANDOC_METADATA := --metadata-file=$(BOOK_META_FILE)
EPUB_OPTIONS := $(PANDOC_METADATA) --toc --toc-depth=3
DOCX_OPTIONS := --lua-filter=$(DOCX_FILTER_FILE) $(PANDOC_METADATA)

.PHONY: all html epub odt docx readest clean check-tools date-start date-end

all: check-tools date-start docx $(ALL_EPUB) date-end

html: check-tools $(HTML_FILES)
epub: check-tools $(EPUB_FILES)
odt: check-tools $(ODT_FILES)
docx: check-tools $(DOCX_FILES)

readest: check-tools $(ALL_EPUB)
	$(OPEN) -a "$(READEST_APP)" "$<"

check-tools:
	@command -v $(PANDOC) >/dev/null 2>&1 || { echo "Missing required tool: $(PANDOC). Install pandoc before building."; exit 1; }
	@command -v $(YQ) >/dev/null 2>&1 || { echo "Missing required tool: $(YQ). Install yq before building."; exit 1; }

date-start date-end:
	@echo "Date: $(shell date)"

$(OUT_DIR):
	mkdir -p $@

$(OUT_DIR)/%.html: %.md $(BOOK_META_FILE) | $(OUT_DIR)
	$(PANDOC) $< $(PANDOC_METADATA) -o $@

$(OUT_DIR)/%.epub: %.md $(BOOK_META_FILE) | $(OUT_DIR)
	$(PANDOC) $< $(EPUB_OPTIONS) -o $@

$(ALL_EPUB): $(CHAPTERS) $(BOOK_META_FILE) | $(OUT_DIR)
	build_time="$$(date -u '+%Y-%m-%dT%H:%M:%SZ')"; \
	$(PANDOC) $(CHAPTERS) $(EPUB_OPTIONS) --metadata date="$$build_time" --metadata modified="$$build_time" -o $@

$(OUT_DIR)/%.odt: %.md $(BOOK_META_FILE) | $(OUT_DIR)
	$(PANDOC) $< $(PANDOC_METADATA) -o $@

$(OUT_DIR)/%.docx: %.md $(BOOK_META_FILE) $(DOCX_FILTER_FILE) | $(OUT_DIR)
	$(PANDOC) $< $(DOCX_OPTIONS) -o $@

clean:
	rm -rf $(OUT_DIR)
