# Makefile for Formal Languages Course Presentation
# Variables
LATEX = lualatex
MMDC = mmdc
BIBER = biber
ZIP = zip

# Directories
SRC_DIR = .
PICS_DIR = pics
OUT_DIR = build
DIST_DIR = dist
TEX_FILE = lec-1.tex
MAIN_PDF = $(basename $(TEX_FILE)).pdf

# Colors
RED = \033[0;31m
GREEN = \033[0;32m
YELLOW = \033[0;33m
BLUE = \033[0;34m
NC = \033[0m

# Source files
TEX_SOURCES = $(wildcard *.tex)
MD_DIAGRAMS = $(wildcard $(PICS_DIR)/*.md)
PDF_DIAGRAMS = $(MD_DIAGRAMS:.md=.pdf)
MMD_DIAGRAMS = $(wildcard $(PICS_DIR)/*.mmd)
MMD_PDF_DIAGRAMS = $(MMD_DIAGRAMS:.mmd=.pdf)
MAKEFILE = Makefile

# Distribution
DIST_NAME = formal-langs-lecture1-$(shell date +%Y%m%d)
DIST_FILES = $(TEX_SOURCES) $(MMD_DIAGRAMS) $(MAKEFILE)

# Pattern rules
$(OUT_DIR)/%.pdf: %.tex | $(OUT_DIR)
	@echo "$(YELLOW)Compiling LaTeX: $< -> $@$(NC)"
	@$(LATEX) -output-directory=$(OUT_DIR) $<

$(PICS_DIR)/%.pdf: $(PICS_DIR)/%.md
	@echo "$(BLUE)Converting Mermaid: $< -> $@$(NC)"
	@$(MMDC) -i $< -o $@ -t forest --width 1600 --height 1200

$(PICS_DIR)/%.pdf: $(PICS_DIR)/%.mmd
	@echo "$(BLUE)Converting Mermaid: $< -> $@$(NC)"
	@if $(MMDC) -i $< -o $@ -t forest --pdfFit 2>/dev/null; then \
		echo "$(GREEN)✓ Success: $@$(NC)"; \
	else \
		echo "$(RED)✗ Failed: $< - check syntax$(NC)"; \
		exit 1; \
	fi

# Directory creation
$(OUT_DIR):
	@mkdir -p $(OUT_DIR)

$(DIST_DIR):
	@mkdir -p $(DIST_DIR)

# Main targets
.PHONY: all clean clean-all diagrams pdf view watch help dist package test

all: diagrams pdf

# Build diagrams
diagrams: $(PDF_DIAGRAMS) $(MMD_PDF_DIAGRAMS)
	@echo "$(GREEN)✓ All diagrams built$(NC)"

# Build PDF
pdf: diagrams $(OUT_DIR)/$(MAIN_PDF)
	@echo "$(GREEN)✓ PDF presentation built: $(OUT_DIR)/$(MAIN_PDF)$(NC)"

# Quick build (single LaTeX run)
quick: diagrams
	@echo "$(YELLOW)Quick build (single pass)...$(NC)"
	@$(LATEX) -output-directory=$(OUT_DIR) $(TEX_FILE)

# View PDF
view: pdf
	@if command -v xdg-open > /dev/null; then \
		xdg-open $(OUT_DIR)/$(MAIN_PDF) & \
	elif command -v open > /dev/null; then \
		open $(OUT_DIR)/$(MAIN_PDF) & \
	else \
		echo "$(RED)Could not detect PDF viewer$(NC)"; \
	fi

# Distribution package
dist: clean-all all | $(DIST_DIR)
	@echo "$(YELLOW)Creating distribution package...$(NC)"
	@mkdir -p $(DIST_DIR)/$(DIST_NAME)/src
	@mkdir -p $(DIST_DIR)/$(DIST_NAME)/diagrams
	@mkdir -p $(DIST_DIR)/$(DIST_NAME)/build

	# Copy source files
	@echo "$(BLUE)Copying source files...$(NC)"
	@cp $(TEX_SOURCES) $(DIST_DIR)/$(DIST_NAME)/src/
	@cp $(MAKEFILE) $(DIST_DIR)/$(DIST_NAME)/src/
	@mkdir -p $(DIST_DIR)/$(DIST_NAME)/src/$(PICS_DIR)
	@cp $(MMD_DIAGRAMS) $(DIST_DIR)/$(DIST_NAME)/src/$(PICS_DIR)/

	# Copy compiled diagrams
	@echo "$(BLUE)Copying compiled diagrams...$(NC)"
	@cp $(MMD_PDF_DIAGRAMS) $(DIST_DIR)/$(DIST_NAME)/diagrams/

	# Copy final PDF
	@echo "$(BLUE)Copying presentation PDF...$(NC)"
	@cp $(OUT_DIR)/$(MAIN_PDF) $(DIST_DIR)/$(DIST_NAME)/

	# Create README for distribution
	@echo "$(BLUE)Creating README...$(NC)"
	@echo "# Formal Languages Lecture 1" > $(DIST_DIR)/$(DIST_NAME)/README.md
	@echo "Distribution package created on $(shell date)" >> $(DIST_DIR)/$(DIST_NAME)/README.md
	@echo "" >> $(DIST_DIR)/$(DIST_NAME)/README.md
	@echo "## Contents" >> $(DIST_DIR)/$(DIST_NAME)/README.md
	@echo "- \`src/\` - Source files (LaTeX, Mermaid diagrams, Makefile)" >> $(DIST_DIR)/$(DIST_NAME)/README.md
	@echo "- \`diagrams/\` - Compiled diagram PDFs" >> $(DIST_DIR)/$(DIST_NAME)/README.md
	@echo "- \`$(MAIN_PDF)\` - Final presentation PDF" >> $(DIST_DIR)/$(DIST_NAME)/README.md
	@echo "- \`README.md\` - This file" >> $(DIST_DIR)/$(DIST_NAME)/README.md
	@echo "" >> $(DIST_DIR)/$(DIST_NAME)/README.md
	@echo "## Rebuilding" >> $(DIST_DIR)/$(DIST_NAME)/README.md
	@echo "To rebuild everything from source:" >> $(DIST_DIR)/$(DIST_NAME)/README.md
	@echo "\`\`\`bash" >> $(DIST_DIR)/$(DIST_NAME)/README.md
	@echo "cd src" >> $(DIST_DIR)/$(DIST_NAME)/README.md
	@echo "make all" >> $(DIST_DIR)/$(DIST_NAME)/README.md
	@echo "\`\`\`" >> $(DIST_DIR)/$(DIST_NAME)/README.md

	# Create ZIP archive
	@echo "$(BLUE)Creating ZIP archive...$(NC)"
	@cd $(DIST_DIR) && $(ZIP) -r $(DIST_NAME).zip $(DIST_NAME)/

	@echo "$(GREEN)✓ Distribution package created: $(DIST_DIR)/$(DIST_NAME).zip$(NC)"
	@echo "$(YELLOW)Contents:$(NC)"
	@echo "  - Source files: $(DIST_NAME)/src/"
	@echo "  - Compiled diagrams: $(DIST_NAME)/diagrams/"
	@echo "  - Presentation PDF: $(DIST_NAME)/$(MAIN_PDF)"
	@echo "  - README: $(DIST_NAME)/README.md"

# Alias for dist
package: dist

# Test Mermaid diagrams
test:
	@echo "$(YELLOW)Testing Mermaid diagrams...$(NC)"
	@for file in $(MMD_DIAGRAMS); do \
		echo "Testing: $$file"; \
		$(MMDC) -i $$file -o /tmp/test.pdf 2>/dev/null && echo "$(GREEN)✓ OK$(NC)" || echo "$(RED)✗ FAILED$(NC)"; \
	done

# List available diagrams
list-diagrams:
	@echo "$(BLUE)Available Mermaid diagrams:$(NC)"
	@for diagram in $(MMD_DIAGRAMS); do \
		echo "  $$diagram"; \
	done

# Test Mermaid installation
test-mermaid:
	@echo "$(YELLOW)Testing Mermaid installation...$(NC)"
	@$(MMDC) --version || echo "$(RED)Mermaid CLI not found. Install with: npm install -g @mermaid-js/mermaid-cli$(NC)"

# Clean targets
clean:
	@echo "$(YELLOW)Cleaning build files...$(NC)"
	@rm -f $(OUT_DIR)/*.aux $(OUT_DIR)/*.log $(OUT_DIR)/*.out \
	       $(OUT_DIR)/*.toc $(OUT_DIR)/*.nav $(OUT_DIR)/*.snm \
	       $(OUT_DIR)/*.vrb $(OUT_DIR)/*.bbl $(OUT_DIR)/*.blg \
	       $(OUT_DIR)/*.lof $(OUT_DIR)/*.lot

clean-all:
	@echo "$(RED)Cleaning all generated files...$(NC)"
	@rm -rf $(OUT_DIR)
	@rm -rf $(DIST_DIR)
	@rm -f $(PICS_DIR)/*.pdf

# Watch for changes (requires inotify-tools on Linux or fswatch on macOS)
watch:
	@echo "$(YELLOW)Watching for changes...$(NC)"
	@while true; do \
		inotifywait -e modify -e create -e delete $(TEX_SOURCES) $(MMD_DIAGRAMS) 2>/dev/null || \
		fswatch -1 $(TEX_SOURCES) $(MMD_DIAGRAMS) 2>/dev/null; \
		make quick; \
	done

# Test Mermaid installation
test-mermaid:
	@echo "$(YELLOW)Testing Mermaid installation...$(NC)"
	@$(MMDC) --version || echo "$(RED)Mermaid CLI not found. Install with: npm install -g @mermaid-js/mermaid-cli$(NC)"

# Help
help:
	@echo "$(GREEN)Formal Languages Presentation Makefile$(NC)"
	@echo ""
	@echo "$(YELLOW)Available targets:$(NC)"
	@echo "  $(GREEN)all$(NC)        - Build everything (default)"
	@echo "  $(GREEN)diagrams$(NC)   - Build only Mermaid diagrams"
	@echo "  $(GREEN)pdf$(NC)        - Build PDF presentation"
	@echo "  $(GREEN)quick$(NC)      - Quick build (single LaTeX pass)"
	@echo "  $(GREEN)view$(NC)       - Build and open PDF"
	@echo "  $(GREEN)watch$(NC)      - Watch for changes and rebuild"
	@echo "  $(GREEN)dist$(NC)       - Create distribution ZIP package"
	@echo "  $(GREEN)package$(NC)    - Alias for dist"
	@echo "  $(GREEN)clean$(NC)      - Clean temporary files"
	@echo "  $(GREEN)clean-all$(NC)  - Clean all generated files"
	@echo "  $(GREEN)list-diagrams$(NC) - List available diagrams"
	@echo "  $(GREEN)test-mermaid$(NC) - Test Mermaid installation"
	@echo "  $(GREEN)test$(NC)       - Test all Mermaid diagrams"
	@echo "  $(GREEN)help$(NC)       - Show this help"
	@echo ""
	@echo "$(YELLOW)Variables:$(NC)"
	@echo "  LATEX: $(LATEX)"
	@echo "  MMDC: $(MMDC)"
	@echo "  PICS_DIR: $(PICS_DIR)"
	@echo "  OUT_DIR: $(OUT_DIR)"
	@echo "  DIST_DIR: $(DIST_DIR)"

# Dependencies
$(OUT_DIR)/$(MAIN_PDF): $(TEX_SOURCES) $(PDF_DIAGRAMS) $(MMD_PDF_DIAGRAMS)

# Prevent deletion of intermediate files
.SECONDARY: $(PDF_DIAGRAMS) $(MMD_PDF_DIAGRAMS)

# Default target
.DEFAULT_GOAL := help
