.PHONY: all build-gui build-game run-desktop clean web

CXX = g++

WSL = wsl --shell-type login
WEB_CXX = $(WSL) em++
# EMSCRIPTE_H_PATH = "//wsl.localhost/archlinux/home/shadow/dev/external/emsdk/upstream/emscripten/system/include/emscripten.h"
BROWSER = "C:\Program Files\Mozilla Firefox\firefox.exe"
# upstream/emscripten/system/include/emscripten.h
ASSETS = "data.dat" 


LDFLAGS = -L./external/raylib/lib \
		  -L./external/box2d/build/src \
		  -L./external/asset_packer/bin \

WEB_LDFLAGS = -L./external/raylib-web/lib \
			  -L./external/asset_packer/bin \
			  -sUSE_GLFW=3 \
			  --preload-file $(ASSETS)

LIBS = -lraylib -lwinmm -lgdi32 -lbox2d -lassetpacker

WEB_LIBS = -lraylib.web  -lassetpacker.web

CXXFLAGS = -std=c++20 -O2 \
		   -MMD -MP

DEBUGFLAGS = -std=c++20 -g -O0

INCLUDES = -I./external/raylib/include \
		   -I./external/entt/single_include \
		   -I./src/include \
		   -I./external/imgui \
		   -I./external/rlImGui \
		   -I./external/box2d/include \
		   -I./external/nhlohmann_json_3.12.0/ \
		   -I./external/asset_packer/bin/include \

WEB_INCLUDES = -I./external/raylib-web/include \
			   -I./external/entt/single_include \
			   -I./src/include \
			   -I./external/imgui \
			   -I./external/rlImGui \
			   -I./external/box2d/include \
			   -I./external/nhlohmann_json_3.12.0/ \
			   -I./external/asset_packer/bin/include \
			   # -I./external/emscripten/include \

IMGUI_SRCS =	./external/imgui/imgui.cpp \
				./external/imgui/imgui_demo.cpp \
				./external/imgui/imgui_draw.cpp \
				./external/imgui/imgui_tables.cpp \
				./external/imgui/imgui_widgets.cpp \

IMGUI_BACKEND = ./external/rlImGui/rlImGui.cpp



SRC_FILES = ./src/asset.cpp \
			./src/movement.cpp \
			./src/player.cpp \
			./src/render.cpp \
			./src/scenes/scene.cpp \
			./src/scenes/game_play_scene.cpp \
			./src/scenes/menu_scene.cpp

ENTRY_POINT = ./src/main.cpp
TEST_ENTRY_POINT = ./src/test.cpp

IMGUI_OBJS =			$(patsubst ./external/imgui/%.cpp,./bin/%.o,$(IMGUI_SRCS))
IMGUI_BACKEND_OBJS =	$(patsubst ./external/rlImGui/%.cpp,./bin/%.o,$(IMGUI_BACKEND))
OBJS_FILES = 			$(patsubst ./src/%.cpp,./bin/%.o,$(SRC_FILES))

DEP_FILES = $(patsubst ./bin/%.o,./bin/%.d,$(OBJS_FILES))


all: build-game run-desktop

./bin/%.o: ./external/imgui/%.cpp
	@mkdir -p bin
	$(CXX) $(CXXFLAGS) $(INCLUDES) -c $< -o $@

./bin/%.o: ./external/rlImGui/%.cpp
	@mkdir -p bin
	$(CXX) $(CXXFLAGS) $(INCLUDES) -c $< -o $@

./bin/%.o: ./src/%.cpp
	@mkdir -p bin
	@mkdir -p $(dir $@)
	$(CXX) $(CXXFLAGS) $(INCLUDES) -c $< -o $@

ccj: clean
	@echo "Generating compile_commands.json..."
	bear -- $(MAKE)

ccj-web: clean 
	@echo "Generating web compile_commands.json..."
	$(WSL) bear -- $(MAKE) web-native
	@sed -i '$$ s/,$$//' compile_commands.json
	@sed -i 's|"/home/|"\\\\\\\\wsl.localhost\\\\archlinux\\\\home\\\\|g' compile_commands.json
	@sed -i 's|=/home/|=\\\\\\\\wsl.localhost\\\\archlinux\\\\home\\\\|g' compile_commands.json
	@sed -i 's|"/mnt/c/|"C:/|g' compile_commands.json

-include $(DEP_FILES)

build-gui: $(IMGUI_OBJS)

build-gui-backend: $(IMGUI_BACKEND_OBJS)

build-core: $(OBJS_FILES)

build-game: $(OBJS_FILES) $(IMGUI_OBJS) $(IMGUI_BACKEND_OBJS) 
	@mkdir -p bin
	$(CXX) $(CXXFLAGS) $(INCLUDES) $(ENTRY_POINT) $(OBJS_FILES) $(IMGUI_OBJS) $(IMGUI_BACKEND_OBJS) $(LDFLAGS) $(LIBS) -o ./bin/main.exe
	cp ./assets ./bin -rf

build-test: $(OBJS_FILES) $(IMGUI_OBJS) $(IMGUI_BACKEND_OBJS) 
	@mkdir -p bin
	$(CXX) $(CXXFLAGS) $(INCLUDES) $(TEST_ENTRY_POINT) $(OBJS_FILES) $(IMGUI_OBJS) $(IMGUI_BACKEND_OBJS) $(LDFLAGS) $(LIBS) -o ./bin/test.exe
	cp ./assets ./bin -rf


build-debug:
	@mkdir -p debug
	$(CXX) $(DEBUGFLAGS) $(INCLUDES) $(ENTRY_POINT) $(SRC_FILES) $(IMGUI_OBJS) $(IMGUI_BACKEND_OBJS) $(LDFLAGS) $(LIBS) -o ./debug/d.exe
	cp ./data.dat ./debug -rf

web:
	@mkdir -p web
	$(WEB_CXX) $(CXXFLAGS) $(WEB_INCLUDES) $(ENTRY_POINT) $(SRC_FILES) $(IMGUI_SRCS) $(IMGUI_BACKEND) $(WEB_LDFLAGS) $(WEB_LIBS) -o ./web/web.html 

web-native:
	@mkdir -p web
	em++ $(CXXFLAGS) $(WEB_INCLUDES) $(ENTRY_POINT) $(SRC_FILES) $(IMGUI_SRCS) $(IMGUI_BACKEND) $(WEB_LDFLAGS) $(WEB_LIBS) -o ./web/web.html 

clean-desktop: 
	@rm -r -f ./bin
	@rm -f compile_commands.json

clean-debug: 
	@rm -r -f ./debug

clean-web: 
	@rm -r -f ./web

clean: clean-desktop clean-debug clean-web

run-desktop:
	./bin/main.exe

open-browser:
	$(BROWSER)

start-server:
	$(WSL) python -m http.server 3000 -d ./web
run-web:
	$(BROWSER) http://localhost:3000/web.html
	$(WSL) python -m http.server 3000 -d ./web
	# $(WSL) node ./web/web.js

run-debug:
	./debug/d.exe

run-test: build-test
	./bin/test.exe

