# ==================== Toolchain ====================

CC_64 := x86_64-w64-mingw32-gcc
NASM  := nasm

# ==================== Project layout ====================

SRC_DIR := src
BIN_DIR := bin

# ==================== Build mode ====================

MODE ?= release

# ==================== TCG Library ====================

TCG_ARCHIVE := tcg20260202.tgz
TCG_URL := https://tradecraftgarden.org/download/$(TCG_ARCHIVE)
TCG_LIBRARY := libtcg/libtcg.x64.zip

# ==================== Flags ====================

COMMON_CFLAGS := \
	-I./$(SRC_DIR) \
	-DWIN_X64 \
	-masm=intel \
	-MMD \
	-MP \
	-fno-stack-protector \
	-fno-builtin \
	-fno-jump-tables \
	-fno-exceptions \
	-fno-asynchronous-unwind-tables \
	-fno-unwind-tables \
	-fno-zero-initialized-in-bss \
	-ffunction-sections \
	-fdata-sections \
	-fno-ident \
	-mno-stack-arg-probe

WARN_CFLAGS := \
	-Wall \
	-Wextra \
	-Wshadow \
	-Wundef \
	-Wno-pointer-arith

RELEASE_CFLAGS := \
	-O1 \
	-fomit-frame-pointer \
	-fno-align-functions \
	-fno-align-jumps \
	-fno-align-loops

DEBUG_CFLAGS := \
	-O0 \
	-g3 \
	-DDEBUG

NASMFLAGS := -f bin -O3 -w-none

ifeq ($(MODE),release)
	MODE_CFLAGS := $(RELEASE_CFLAGS)
else ifeq ($(MODE),debug)
	MODE_CFLAGS := $(DEBUG_CFLAGS)
else
	$(error Unsupported MODE '$(MODE)'. Use MODE=release or MODE=debug)
endif

CFLAGS := $(WARN_CFLAGS) $(COMMON_CFLAGS) $(MODE_CFLAGS)

# ==================== Sources ====================

SRCS := \
	$(SRC_DIR)/core/loader.c \
	$(SRC_DIR)/core/services.c \
	$(SRC_DIR)/evasion/spoof.c \
	$(SRC_DIR)/evasion/hooks.c \
	$(SRC_DIR)/evasion/create_process.c \
	$(SRC_DIR)/evasion/syscalls.c \
	$(SRC_DIR)/evasion/patch.c \
	$(SRC_DIR)/evasion/mask.c \
	$(SRC_DIR)/utils/utils.c \
	$(SRC_DIR)/pico/pico.c

ASM_SRCS := \
	$(SRC_DIR)/asm/draugr.asm \
	$(SRC_DIR)/asm/dummy.asm

# ==================== Outputs ====================

OBJS := $(patsubst $(SRC_DIR)/%.c,$(BIN_DIR)/%.x64.o,$(SRCS))
DEPS := $(OBJS:.o=.d)
ASM_BINS := $(patsubst $(SRC_DIR)/%.asm,$(BIN_DIR)/%.x64.bin,$(ASM_SRCS))

# ==================== Targets ====================

.DEFAULT_GOAL := release

all: release

pre: $(TCG_LIBRARY)
	@echo " * Tradecraft Garden Library is ready"

$(TCG_LIBRARY):
	@echo " * Downloading Tradecraft Garden Library..."
	@curl -fsSL "$(TCG_URL)" -o "$(TCG_ARCHIVE)"
	@tar -xzf "$(TCG_ARCHIVE)"
	@rm -f "$(TCG_ARCHIVE)"
	@$(MAKE) -s -C tcg/libtcg
	@rm -rf libtcg
	@mv tcg/libtcg ./libtcg
	@rm -rf tcg
	@test -f "$(TCG_LIBRARY)"
	@echo "   done..."

release: clean pre
	$(MAKE) build MODE=release
	@echo " * Release build completed"

debug: clean pre
	$(MAKE) build MODE=debug
	@echo " * Debug build completed"

build: $(OBJS) $(ASM_BINS)

$(BIN_DIR)/%.x64.o: $(SRC_DIR)/%.c
	@mkdir -p "$(dir $@)"
	$(CC_64) $(CFLAGS) -c "$<" -o "$@"

$(BIN_DIR)/%.x64.bin: $(SRC_DIR)/%.asm
	@mkdir -p "$(dir $@)"
	$(NASM) "$<" -o "$@" $(NASMFLAGS)

-include $(DEPS)

clean:
	rm -rf "$(BIN_DIR)"

print-vars:
	@echo "MODE=$(MODE)"
	@echo "TCG_LIBRARY=$(TCG_LIBRARY)"
	@echo "CFLAGS=$(CFLAGS)"
	@echo "OBJS=$(OBJS)"
	@echo "ASM_BINS=$(ASM_BINS)"

.PHONY: all release debug build pre clean print-vars
