CC = gcc
CFLAGS = -O2 -Wall -Wextra -Isrc
LDFLAGS = -lm -lGL
SDL_CFLAGS = $(shell pkg-config --cflags sdl2 SDL2_ttf SDL2_image SDL2_mixer)
SDL_LDFLAGS = $(shell pkg-config --libs sdl2 SDL2_ttf SDL2_image SDL2_mixer)

SRCDIR = src
BUILDDIR = build

.PHONY: all clean maze ray run-maze run-ray win

all: maze ray

$(BUILDDIR):
	mkdir -p $(BUILDDIR)

# --- Maze 2D ---
MAZE_OBJS = $(BUILDDIR)/main.o $(BUILDDIR)/maze_gen.o
maze: $(BUILDDIR)/maze

$(BUILDDIR)/main.o: $(SRCDIR)/main.c $(SRCDIR)/maze.h | $(BUILDDIR)
	$(CC) $(CFLAGS) $(SDL_CFLAGS) -c $< -o $@

$(BUILDDIR)/maze_gen.o: $(SRCDIR)/maze_gen.c $(SRCDIR)/maze.h | $(BUILDDIR)
	$(CC) $(CFLAGS) $(SDL_CFLAGS) -c $< -o $@

$(BUILDDIR)/maze: $(MAZE_OBJS)
	$(CC) $^ -o $@ $(SDL_LDFLAGS) $(LDFLAGS)

run-maze: maze
	cd $(BUILDDIR) && ./maze

# --- Raycaster 3D ---
RAY_OBJS = $(BUILDDIR)/raycaster.o
ray: $(BUILDDIR)/raycaster

$(BUILDDIR)/raycaster.o: $(SRCDIR)/raycaster.c | $(BUILDDIR)
	$(CC) $(CFLAGS) $(SDL_CFLAGS) -c $< -o $@

$(BUILDDIR)/raycaster: $(RAY_OBJS)
	$(CC) $^ -o $@ $(SDL_LDFLAGS) $(LDFLAGS)

run-ray: ray
	cd $(BUILDDIR) && ./raycaster

# --- Windows cross-compile ---
WIN_CC = x86_64-w64-mingw32-gcc
WIN_RC = x86_64-w64-mingw32-windres
WIN_CFLAGS = -O2 -Wall -Wextra -Isrc
WIN_SDL_CFLAGS = $(shell x86_64-w64-mingw32-pkg-config --cflags sdl2 SDL2_ttf SDL2_image SDL2_mixer 2>/dev/null)
WIN_SDL_LDFLAGS = $(shell x86_64-w64-mingw32-pkg-config --libs sdl2 SDL2_ttf SDL2_image SDL2_mixer 2>/dev/null)

win: $(BUILDDIR)/raycaster.exe $(BUILDDIR)/maze.exe

$(BUILDDIR)/raycaster.res.o: $(SRCDIR)/raycaster.rc | $(BUILDDIR)
	$(WIN_RC) --input=$< --output=$@ --input-format=rc --output-format=coff

$(BUILDDIR)/raycaster.exe: $(SRCDIR)/raycaster.c $(BUILDDIR)/raycaster.res.o | $(BUILDDIR)
	$(WIN_CC) $(WIN_CFLAGS) $(WIN_SDL_CFLAGS) $< $(BUILDDIR)/raycaster.res.o -o $@ $(WIN_SDL_LDFLAGS) -lm -lopengl32 -lgdi32 -lshlwapi

$(BUILDDIR)/maze.exe: $(SRCDIR)/main.c $(SRCDIR)/maze_gen.c $(SRCDIR)/maze.h | $(BUILDDIR)
	$(WIN_CC) $(WIN_CFLAGS) $(WIN_SDL_CFLAGS) $(SRCDIR)/main.c $(SRCDIR)/maze_gen.c -o $@ $(WIN_SDL_LDFLAGS) -lm

# --- Installer wrapper EXE ---
WIN_CPP = x86_64-w64-mingw32-g++
WIN_INSTALLER_LIBS = -lshlwapi -lole32 -loleaut32 -lurlmon -lshell32 -luuid -lgdi32 -lzs

$(BUILDDIR)/installer.res.o: installer/installer.rc | $(BUILDDIR)
	$(WIN_RC) --input=$< --output=$@ --input-format=rc --output-format=coff -I.

$(BUILDDIR)/setup.exe: installer/installer_wrapper.cpp $(BUILDDIR)/installer.res.o | $(BUILDDIR)
	$(WIN_CPP) -O2 -Wall -Wextra -static installer/installer_wrapper.cpp $(BUILDDIR)/installer.res.o -o $@ $(WIN_INSTALLER_LIBS)

installer: $(BUILDDIR)/setup.exe

# --- MSI installer (requires wixl from msitools) ---
msi: win
	mkdir -p $(BUILDDIR)
	wixl -D ProjectDir=. -a x86 -o $(BUILDDIR)/ComplexxRaycaster.msi installer/complexx.wxs

clean:
	rm -rf $(BUILDDIR)
