CC ?= cc
CFLAGS ?= -std=c11 -O2 -Wall -Wextra -Wpedantic
PKG_CONFIG ?= pkg-config
SDL_CFLAGS := $(shell $(PKG_CONFIG) --cflags sdl3)
SDL_LIBS := $(shell $(PKG_CONFIG) --libs sdl3)

PREFIX ?= /usr/local
BINDIR ?= $(PREFIX)/bin
DATADIR ?= $(PREFIX)/share
APPLICATIONSDIR ?= $(DATADIR)/applications

# Windows cross-build (Linux -> Windows x86-64 via MinGW-w64).
# Download SDL3-devel-<version>-mingw.tar.gz from the official SDL release,
# extract it, and point SDL3_MINGW at the extracted SDL3-<version> directory.
MINGW_CC ?= x86_64-w64-mingw32-gcc
SDL3_MINGW ?=
WIN_ARCH := x86_64-w64-mingw32
WIN_OUT := build/windows-x86_64
WIN_EXE := $(WIN_OUT)/future-doom.exe
WIN_DLL := $(WIN_OUT)/SDL3.dll

future-doom: src/main.c src/audio.h src/music.h
	$(CC) $(CFLAGS) $(SDL_CFLAGS) -o $@ src/main.c $(SDL_LIBS)

music2mid: tools/music2mid.c src/music.h
	$(CC) $(CFLAGS) -o $@ tools/music2mid.c

midi: music2mid
	./music2mid stage1.mid

windows-check:
	@command -v $(MINGW_CC) >/dev/null 2>&1 || { echo "Missing $(MINGW_CC). On EndeavourOS: sudo pacman -S mingw-w64-gcc"; exit 1; }
	@test -n "$(SDL3_MINGW)" || { echo "Set SDL3_MINGW to the extracted SDL3 MinGW development directory."; echo "Example: make windows SDL3_MINGW=$$HOME/Downloads/SDL3-3.4.16"; exit 1; }
	@test -f "$(SDL3_MINGW)/$(WIN_ARCH)/include/SDL3/SDL.h" || { echo "SDL3 headers not found under $(SDL3_MINGW)/$(WIN_ARCH)"; exit 1; }
	@test -f "$(SDL3_MINGW)/$(WIN_ARCH)/lib/libSDL3.dll.a" || { echo "SDL3 MinGW import library not found."; exit 1; }
	@test -f "$(SDL3_MINGW)/$(WIN_ARCH)/bin/SDL3.dll" || { echo "SDL3.dll not found."; exit 1; }

windows: windows-check
	@mkdir -p "$(WIN_OUT)"
	$(MINGW_CC) $(CFLAGS) \
		-I"$(SDL3_MINGW)/$(WIN_ARCH)/include" \
		-L"$(SDL3_MINGW)/$(WIN_ARCH)/lib" \
		-o "$(WIN_EXE)" src/main.c -lSDL3 -mwindows
	cp "$(SDL3_MINGW)/$(WIN_ARCH)/bin/SDL3.dll" "$(WIN_DLL)"
	cp README.md COPYING "$(WIN_OUT)/"
	@echo
	@echo "Windows build ready in $(WIN_OUT)/"
	@echo "Test future-doom.exe on an actual Windows machine before release."

windows-zip: windows
	@command -v zip >/dev/null 2>&1 || { echo "Missing zip utility."; exit 1; }
	rm -f future-doom-v1.0.25-windows-x86_64.zip
	cd build && zip -9 -r ../future-doom-v1.0.25-windows-x86_64.zip windows-x86_64
	@echo "Created future-doom-v1.0.25-windows-x86_64.zip"

install: future-doom
	mkdir -p "$(DESTDIR)$(BINDIR)" "$(DESTDIR)$(APPLICATIONSDIR)"
	install -m 755 future-doom "$(DESTDIR)$(BINDIR)/future-doom"
	install -m 644 packaging/future-doom.desktop "$(DESTDIR)$(APPLICATIONSDIR)/future-doom.desktop"

uninstall:
	rm -f "$(DESTDIR)$(BINDIR)/future-doom"
	rm -f "$(DESTDIR)$(APPLICATIONSDIR)/future-doom.desktop"

clean:
	rm -f future-doom music2mid stage1.mid future-doom-v1.0.25-windows-x86_64.zip
	rm -rf build

.PHONY: clean midi install uninstall windows windows-check windows-zip

# PlayStation 2 homebrew build (PS2DEV + separately installed SDL3).
PS2DEV ?= /usr/local/ps2dev
PS2SDK ?= $(PS2DEV)/ps2sdk
GSKIT ?= $(PS2DEV)/gsKit
PS2_CC := $(PS2DEV)/ee/bin/mips64r5900el-ps2-elf-gcc
PS2_OUT := build/ps2/future-doom.elf

.PHONY: ps2
ps2:
	@mkdir -p build/ps2
	$(PS2_CC) -std=c11 -O2 -Wall -Wextra -DPS2 -D__PS2__ -D_EE -G0 \
		-I$(PS2SDK)/ports/include -I$(PS2SDK)/ee/include -I$(PS2SDK)/common/include -I$(GSKIT)/include \
		-L$(PS2SDK)/ports/lib -L$(PS2SDK)/ee/lib -L$(GSKIT)/lib \
		-o $(PS2_OUT) src/main.c \
		-lSDL3 -lps2_drivers -lmc -lpatches -lgskit_toolkit -lgskit -ldmakit -laudsrv -lpad -lmtap -latomic
	@echo "PS2 ELF ready: $(PS2_OUT)"
