# Directorios
DIR_ROOT   := $(dir $(abspath $(MAKEFILE_LIST)))
DIR_SOURCES:= $(addsuffix /, $(DIR_ROOT)source)
DIR_BIN    := $(addsuffix /, $(DIR_ROOT))
DIR_BUILD  := $(addsuffix /, $(DIR_ROOT)build)

# Variables
TARGET_NAME   := coffee_crisis_arcade_edition
TARGET_FILE   := $(DIR_BIN)$(TARGET_NAME)
APP_NAME      := Coffee Crisis Arcade Edition
RELEASE_FOLDER:= ccae_release
RELEASE_FILE  := $(RELEASE_FOLDER)/$(TARGET_NAME)
VERSION       := v0.01

# Nombres para los ficheros de lanzamiento
WINDOWS_RELEASE            := $(TARGET_FILE)-$(VERSION)-win32-x64.zip
MACOS_INTEL_RELEASE        := $(TARGET_FILE)-$(VERSION)-macos-intel.dmg
MACOS_APPLE_SILICON_RELEASE:= $(TARGET_FILE)-$(VERSION)-macos-apple-silicon.dmg
LINUX_RELEASE              := $(TARGET_FILE)-$(VERSION)-linux.tar.gz

# Includes
INCLUDES:= -I$(DIR_SOURCES)

# Variables según el sistema operativo
ifeq ($(OS),Windows_NT)
    FixPath = $(subst /,\,$1)
	SOURCES := source/*.cpp
	CXXFLAGS:= -std=c++20 -Wall -Os -ffunction-sections -fdata-sections -Wl,--gc-sections -static-libstdc++ -Wl,-subsystem,windows
	CXXFLAGS_DEBUG:= -std=c++20 -Wall -g
	LDFLAGS := -lmingw32 -lws2_32 -lSDL2main -lSDL2 -lopengl32
	RM = del /Q
	MKD:= mkdir
else
    FixPath = $1
	SOURCES := $(shell find $(DIR_SOURCES) -name '*.cpp')
	SOURCES := source/*.cpp
	CXXFLAGS:= -std=c++20 -Wall -Os -ffunction-sections -fdata-sections
	CXXFLAGS_DEBUG:= -std=c++20 -Wall -g
	LDFLAGS := -lSDL2
	RM = rm -f
	MKD:= mkdir -p
	UNAME_S := $(shell uname -s)
    ifeq ($(UNAME_S),Linux)
        LDFLAGS += -lGL
    endif
    ifeq ($(UNAME_S),Darwin)
		CXXFLAGS += -Wno-deprecated
		CXXFLAGS_DEBUG += -Wno-deprecated
        LDFLAGS += -framework OpenGL
    endif
endif

OBJECTS     := $(subst $(DIR_SOURCES), $(DIR_BUILD), $(SOURCES))
OBJECTS     := $(OBJECTS:.cpp=.o)
DEPENDENCIES:= $(OBJECTS:.o=.d)


###############################################################################
#                                                                             #
#     RULES                                                                   #
#                                                                             #
###############################################################################

.PHONY: all a1

all: a1

a1: $(TARGET_FILE)

$(TARGET_FILE): $(OBJECTS)
	$(MKD) $(@D)
	$(CXX) $(OBJECTS) $(LDFLAGS) -o $(TARGET_FILE)

$(DIR_BUILD)%.o: $(DIR_SOURCES)%.cpp
	$(MKD) $(@D)
	$(CXX) -c $< $(CXXFLAGS) $(INCLUDES) -o $@

-include $(DEPENDENCIES)

###############################################################################
#                                                                             #
#     CLEAN                                                                   #
#                                                                             #
###############################################################################

.PHONY: clean

clean:
	$(RM) $(call FixPath,$(DIR_BUILD))

###############################################################################
#                                                                             #
#     PRINT-VARIABLES                                                         #
#                                                                             #
###############################################################################

.PHONY: print-variables

print-variables:
	@echo MAKEFILE_LIST: $(MAKEFILE_LIST)
	
	@echo "DIR_ROOT  :" $(DIR_ROOT)
	@echo "DIR_SOURCES:" $(DIR_SOURCES)
	@echo "DIR_BIN   :" $(DIR_BIN)
	@echo "DIR_BUILD :" $(DIR_BUILD)

	@echo "DIR_IMGUI     :" $(DIR_IMGUI)
	@echo "DIR_IMGUI_SFML:" $(DIR_IMGUI_SFML)
	@echo "INCLUDES      :" $(INCLUDES)

	@echo CXX: $(CXX)
	@echo CXXFLAGS: $(CXXFLAGS)
	@echo LDFLAGS: $(LDFLAGS)

	@echo SOURCES: $(SOURCES)
	@echo OBJECTS: $(OBJECTS)
	@echo DEPENDENCIES: $(DEPENDENCIES)

	@echo TARGET_NAME: $(TARGET_NAME)
	@echo TARGET_FILE: $(TARGET_FILE)

	@echo RM: $(RM)

raspi:
	$(CXX) $(SOURCES) -D ARCADE -D VERBOSE $(CXXFLAGS) $(LDFLAGS) -o $(TARGET_FILE)
	strip -s -R .comment -R .gnu.version $(TARGET_FILE) --strip-unneeded

raspi_debug:
	$(CXX) $(SOURCES) -D ARCADE -D VERBOSE -D DEBUG $(CXXFLAGS_DEBUG) $(LDFLAGS) -o "$(TARGET_FILE)_debug"

windows:
	@echo off
	$(CXX) $(SOURCES) $(CXXFLAGS) $(LDFLAGS) -o "$(TARGET_FILE).exe"
	strip -s -R .comment -R .gnu.version "$(TARGET_FILE).exe" --strip-unneeded

windows_rec:
	@echo off
	$(CXX) $(SOURCES) -D RECORDING $(CXXFLAGS) $(LDFLAGS) -o "$(TARGET_FILE)_rec.exe"

windows_debug:
	@echo off
	$(CXX) $(SOURCES) -D DEBUG -D VERBOSE $(CXXFLAGS_DEBUG) $(LDFLAGS) -o "$(TARGET_FILE)_debug.exe"

windows_release:
	@echo off

# Crea carpeta temporal 'RELEASE_FOLDER'
	powershell if (Test-Path "$(RELEASE_FOLDER)") {Remove-Item "$(RELEASE_FOLDER)" -Recurse -Force}
	powershell if (-not (Test-Path "$(RELEASE_FOLDER)")) {New-Item "$(RELEASE_FOLDER)" -ItemType Directory}

# Copia la carpeta 'data'
	powershell Copy-Item -Path "data" -Destination "$(RELEASE_FOLDER)" -recurse -Force

# Copia los ficheros que estan en la raíz del proyecto
	powershell Copy-Item "LICENSE" -Destination "$(RELEASE_FOLDER)"
	powershell Copy-Item "README.md" -Destination "$(RELEASE_FOLDER)"
	powershell Copy-Item "release\*.dll" -Destination "$(RELEASE_FOLDER)"

# Compila
	$(CXX) $(SOURCES) $(CXXFLAGS) $(LDFLAGS) -o "$(RELEASE_FILE).exe"
	strip -s -R .comment -R .gnu.version "$(RELEASE_FOLDER)/$(TARGET_FILE).exe" --strip-unneeded

# Crea el fichero .zip
	powershell if (Test-Path $(WINDOWS_RELEASE)) {Remove-Item $(WINDOWS_RELEASE)}
	powershell Compress-Archive -Path "$(RELEASE_FOLDER)"/* -DestinationPath $(WINDOWS_RELEASE)

# Elimina la carpeta temporal 'RELEASE_FOLDER'
	powershell if (Test-Path "$(RELEASE_FOLDER)") {Remove-Item "$(RELEASE_FOLDER)" -Recurse -Force}

macos:
	$(CXX) $(SOURCES) $(CXXFLAGS) $(LDFLAGS) -o "$(TARGET_FILE)"

macos_debug:
	$(CXX) $(SOURCES) -D DEBUG -D VERBOSE $(CXXFLAGS_DEBUG) $(LDFLAGS) -o "$(TARGET_FILE)_debug"

macos_release:
# Elimina datos de compilaciones anteriores
	rm -rdf "$(RELEASE_FOLDER)"
	rm -rdf Frameworks
	rm -f tmp.dmg
	rm -f "$(MACOS_INTEL_RELEASE)"
	rm -f "$(MACOS_APPLE_SILICON_RELEASE)"

# Crea la carpeta temporal para hacer el trabajo y las carpetas obligatorias para crear una app de macos
	mkdir -p "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/Frameworks"
	mkdir -p "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/MacOS"
	mkdir -p "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/Resources"
	mkdir -p Frameworks

# Copia carpetas y ficheros
	cp -R data "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/Resources"
	cp -R release/SDL2.framework "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/Frameworks"
	cp -R release/SDL2.framework Frameworks
	cp release/*.icns "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/Resources"
	cp release/Info.plist "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents"
	cp LICENSE "$(RELEASE_FOLDER)"
	cp README.md "$(RELEASE_FOLDER)"

# Crea enlaces
	ln -s /Applications "$(RELEASE_FOLDER)"/Applications

# Compila la versión para procesadores Intel
	$(CXX) $(SOURCES) -D MACOS_BUNDLE $(CXXFLAGS) $(LDFLAGS) -o "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/MacOS/$(TARGET_FILE)" -rpath @executable_path/../Frameworks/ -target x86_64-apple-macos10.12

# Empaqueta el .dmg de la versión Intel
	hdiutil create tmp.dmg -ov -volname "$(APP_NAME)" -fs HFS+ -srcfolder "$(RELEASE_FOLDER)" 
	hdiutil convert tmp.dmg -format UDZO -o "$(MACOS_INTEL_RELEASE)"
	rm -f tmp.dmg

# Compila la versión para procesadores Apple Silicon
	$(CXX) $(SOURCES) -D MACOS_BUNDLE $(CXXFLAGS) $(LDFLAGS) -o "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/MacOS/$(TARGET_FILE)" -rpath @executable_path/../Frameworks/ -target arm64-apple-macos11

# Empaqueta el .dmg de la versión Apple Silicon
	hdiutil create tmp.dmg -ov -volname "$(APP_NAME)" -fs HFS+ -srcfolder "$(RELEASE_FOLDER)" 
	hdiutil convert tmp.dmg -format UDZO -o "$(MACOS_APPLE_SILICON_RELEASE)"
	rm -f tmp.dmg

# Elimina las carpetas temporales
	$(RM) Frameworks
	$(RM) "$(RELEASE_FOLDER)"

linux:
	$(CXX) $(SOURCES) $(CXXFLAGS) $(LDFLAGS) -o "$(TARGET_FILE)"
	strip -s -R .comment -R .gnu.version "$(TARGET_FILE)" --strip-unneeded

linux_debug:
	$(CXX) $(SOURCES) -D DEBUG -D VERBOSE $(CXXFLAGS_DEBUG) $(LDFLAGS) -o "$(TARGET_FILE)_debug"

linux_release:
# Elimina carpetas previas
	$(RM) "$(RELEASE_FOLDER)"

# Crea la carpeta temporal para realizar el lanzamiento
	mkdir -p "$(RELEASE_FOLDER)"

# Copia ficheros
	cp -R data "$(RELEASE_FOLDER)"
	cp LICENSE "$(RELEASE_FOLDER)"
	cp README.md "$(RELEASE_FOLDER)"

# Complia
	$(CXX) $(SOURCES) $(CXXFLAGS) $(LDFLAGS) -o "$(RELEASE_FILE)"
	strip -s -R .comment -R .gnu.version "$(RELEASE_FILE)" --strip-unneeded

# Empaqueta ficheros
	$(RM) "$(LINUX_RELEASE)"
	cd "$(RELEASE_FOLDER)" && tar -czvf "../$(LINUX_RELEASE)" *

# Elimina la carpeta temporal
	$(RM) "$(RELEASE_FOLDER)"

anbernic:
# Elimina carpetas previas
	$(RM) "$(RELEASE_FOLDER)"_anbernic

# Crea la carpeta temporal para realizar el lanzamiento
	mkdir -p "$(RELEASE_FOLDER)"_anbernic

# Copia ficheros
	cp -R data "$(RELEASE_FOLDER)"_anbernic

# Complia
	$(CXX) $(SOURCES) -D ANBERNIC -D NO_SHADERS -D ARCADE -D VERBOSE $(CXXFLAGS) $(LDFLAGS) -o $(RELEASE_FOLDER)_anbernic/$(TARGET_NAME)
	$(CXX) $(SOURCES) -D ANBERNIC -D ARCADE -D VERBOSE $(CXXFLAGS) $(LDFLAGS) -o $(RELEASE_FOLDER)_anbernic/$(TARGET_NAME).shaders