# Compiler and tools
CC = emcc
XXD = xxd
FETCH = ./fetch_libs.sh

# Directories
SRC_DIR = src
LIB_DIR = lib
SHADER_DIR = $(SRC_DIR)/shaders
GENERATED_DIR = $(SRC_DIR)/generated

# Output
TARGET = app.html

# Source files
C_SOURCES = $(SRC_DIR)/main.c
IMGUI_SOURCES = $(LIB_DIR)/imgui/imgui/imgui.cpp \
                $(LIB_DIR)/imgui/imgui/imgui_draw.cpp \
                $(LIB_DIR)/imgui/imgui/imgui_tables.cpp \
                $(LIB_DIR)/imgui/imgui/imgui_widgets.cpp \
                $(LIB_DIR)/imgui/cimgui.cpp
CGLM_SOURCES = $(wildcard $(LIB_DIR)/cglm/src/*.c)

# Dynamic shader processing
SHADER_FILES = $(wildcard $(SHADER_DIR)/*.wgsl)
SHADER_HEADERS = $(patsubst $(SHADER_DIR)/%.wgsl,$(GENERATED_DIR)/%.h,$(SHADER_FILES))

# Compiler flags
EMCC_FLAGS = --use-port=emdawnwebgpu \
             -sWASM_BIGINT \
             -sALLOW_MEMORY_GROWTH \
             -msimd128 \
             -sFILESYSTEM=0 \
			 -sMALLOC=emmalloc \
             -flto

# Shell template
SHELL_FILE = shell.html

# Default target
all: $(FETCH) $(TARGET)

# Main build target
$(TARGET): $(SHADER_HEADERS) $(C_SOURCES) $(IMGUI_SOURCES) $(CGLM_SOURCES) $(SHELL_FILE)
	$(CC) $(C_SOURCES) $(IMGUI_SOURCES) $(CGLM_SOURCES) \
		-o $(TARGET) \
		$(EMCC_FLAGS) \
		-O3 \
		--closure 1 \
		-I$(LIB_DIR)/sokol \
		-I$(LIB_DIR)/imgui \
		-I$(LIB_DIR)/imgui/imgui \
		-I$(LIB_DIR)/util \
		-I$(LIB_DIR)/cglm/include \
		--shell-file=$(SHELL_FILE)

# Shader header generation
$(GENERATED_DIR)/%.h: $(SHADER_DIR)/%.wgsl | $(GENERATED_DIR)
	@echo "Generating header for $<"
	$(XXD) -i $< $@

# Create generated directory if it doesn't exist
$(GENERATED_DIR):
	mkdir -p $(GENERATED_DIR)

debug: $(FETCH) $(SHADER_HEADERS) $(C_SOURCES) $(IMGUI_SOURCES) $(CGLM_SOURCES) $(SHELL_FILE)
	$(CC) $(C_SOURCES) $(IMGUI_SOURCES) $(CGLM_SOURCES) \
		-o $(TARGET) \
		$(EMCC_FLAGS) \
		-g --profiling-funcs -gsource-map \
		-sASSERTIONS \
		-I$(LIB_DIR)/sokol \
		-I$(LIB_DIR)/imgui \
		-I$(LIB_DIR)/imgui/imgui \
		-I$(LIB_DIR)/util \
		-I$(LIB_DIR)/cglm/include \
		--shell-file=$(SHELL_FILE)

# Clean build artifacts
clean:
	rm -f $(TARGET) app.js app.wasm
	rm -rf $(GENERATED_DIR)

# Rebuild everything
rebuild: clean all

# List all shader files (for debugging)
list-shaders:
	@echo "Shader files found:"
	@echo "$(SHADER_FILES)"
	@echo ""
	@echo "Generated headers:"
	@echo "$(SHADER_HEADERS)"

# Phony targets
.PHONY: all clean rebuild list-shaders $(FETCH)