# ============================================================================
# ViBe3 Physics - Resource Packer Tool Makefile
# ============================================================================

# Directorios
DIR_ROOT       := $(dir $(abspath $(dir $(MAKEFILE_LIST))))
DIR_SOURCES    := $(DIR_ROOT)source/
DIR_TOOLS      := $(DIR_ROOT)tools/
DIR_DATA       := $(DIR_ROOT)data/

# Archivos fuente
PACK_SOURCES   := $(DIR_TOOLS)pack_resources.cpp $(DIR_SOURCES)resource_pack.cpp
PACK_INCLUDES  := -I$(DIR_ROOT)

# Compilador y flags
CXX            := g++
CXXFLAGS       := -std=c++20 -Wall -Os -ffunction-sections -fdata-sections

# Variables específicas por sistema operativo
ifeq ($(OS),Windows_NT)
    # Windows
    PACK_TOOL      := pack_resources.exe
    RESOURCE_PACK  := ../resources.pack
    TEST_PACK      := test_resources.pack
    LDFLAGS        := -Wl,--gc-sections -static-libstdc++ -static-libgcc
    RMFILE         := del /Q
    MKDIR          := mkdir
    FixPath        = $(subst /,\,$1)
else
    UNAME_S := $(shell uname -s)
    ifeq ($(UNAME_S),Linux)
        # Linux
        PACK_TOOL      := pack_resources
        RESOURCE_PACK  := ../resources.pack
        TEST_PACK      := test_resources.pack
        LDFLAGS        := -Wl,--gc-sections
        RMFILE         := rm -f
        MKDIR          := mkdir -p
        FixPath        = $1
    endif
    ifeq ($(UNAME_S),Darwin)
        # macOS
        PACK_TOOL      := pack_resources
        RESOURCE_PACK  := ../resources.pack
        TEST_PACK      := test_resources.pack
        LDFLAGS        :=
        RMFILE         := rm -f
        MKDIR          := mkdir -p
        FixPath        = $1
    endif
endif

# Detectar todos los archivos en data/ como dependencias
DATA_FILES := $(shell find ../data -type f 2>/dev/null)

# ============================================================================
# Targets principales
# ============================================================================

.PHONY: all pack_tool resource_pack test_pack clean help

# Target por defecto: compilar herramienta
all: pack_tool

# Compilar herramienta de empaquetado
pack_tool: $(PACK_TOOL)

$(PACK_TOOL): $(PACK_SOURCES)
	@echo "=========================================="
	@echo "Compilando herramienta de empaquetado..."
	@echo "=========================================="
	$(CXX) $(CXXFLAGS) $(PACK_INCLUDES) $(PACK_SOURCES) $(LDFLAGS) -o $(PACK_TOOL)
ifeq ($(OS),Windows_NT)
	@echo.
else
	@echo ""
endif
	@echo "✓ Herramienta compilada: $(PACK_TOOL)"
ifeq ($(OS),Windows_NT)
	@echo.
else
	@echo ""
endif

# Crear pack de recursos final
resource_pack: $(PACK_TOOL)
	@echo "=========================================="
	@echo "Generando resources.pack..."
	@echo "=========================================="
	@echo "Directorio de datos: ../data"
	@echo "Archivo de salida: $(RESOURCE_PACK)"
ifeq ($(OS),Windows_NT)
	@echo.
else
	@echo ""
endif
	./$(PACK_TOOL) ../data $(RESOURCE_PACK)
ifeq ($(OS),Windows_NT)
	@echo.
else
	@echo ""
endif
	@echo "✓ Pack de recursos creado exitosamente"
ifeq ($(OS),Windows_NT)
	@echo.
else
	@echo ""
endif

# Crear pack de recursos de prueba
test_pack: $(PACK_TOOL)
	@echo "=========================================="
	@echo "Generando pack de prueba..."
	@echo "=========================================="
	@echo "Directorio de datos: ../data"
	@echo "Archivo de salida: $(TEST_PACK)"
ifeq ($(OS),Windows_NT)
	@echo.
else
	@echo ""
endif
	./$(PACK_TOOL) ../data $(TEST_PACK)
ifeq ($(OS),Windows_NT)
	@echo.
else
	@echo ""
endif
	@echo "✓ Pack de prueba creado: $(TEST_PACK)"
ifeq ($(OS),Windows_NT)
	@echo.
else
	@echo ""
endif

# Limpiar archivos generados
clean:
	@echo "Limpiando archivos generados..."
ifeq ($(OS),Windows_NT)
	@if exist "$(PACK_TOOL)" $(RMFILE) "$(PACK_TOOL)"
	@if exist "$(TEST_PACK)" $(RMFILE) "$(TEST_PACK)"
else
	@$(RMFILE) $(PACK_TOOL) $(TEST_PACK)
endif
	@echo "✓ Limpieza completada"

# Mostrar ayuda
help:
	@echo "=========================================="
	@echo "ViBe3 Physics - Resource Packer Makefile"
	@echo "=========================================="
ifeq ($(OS),Windows_NT)
	@echo.
else
	@echo ""
endif
	@echo "Comandos disponibles:"
ifeq ($(OS),Windows_NT)
	@echo.
else
	@echo ""
endif
	@echo "  make              - Compilar herramienta (equivalente a 'make pack_tool')"
	@echo "  make pack_tool    - Compilar herramienta de empaquetado"
	@echo "  make resource_pack - Crear ../resources.pack desde ../data"
	@echo "  make test_pack    - Crear pack de prueba (test_resources.pack)"
	@echo "  make clean        - Limpiar archivos generados"
	@echo "  make help         - Mostrar esta ayuda"
ifeq ($(OS),Windows_NT)
	@echo.
else
	@echo ""
endif
	@echo "Ejemplos de uso:"
ifeq ($(OS),Windows_NT)
	@echo.
else
	@echo ""
endif
	@echo "  cd tools"
	@echo "  make                    # Compilar herramienta"
	@echo "  make resource_pack      # Crear pack de recursos"
	@echo "  ./$(PACK_TOOL) --help   # Ver ayuda de la herramienta"
ifeq ($(OS),Windows_NT)
	@echo.
else
	@echo ""
endif
