CC       := gcc
CFLAGS   := -O3 -fPIC -Wall -Wextra
LDFLAGS  := -shared

SRCDIR   := engine/src
INCDIR   := engine/include
BUILDDIR := build
LIBNAME  := libchess

# Exclude test.c from the shared lib build
SRC := $(filter-out $(SRCDIR)/test.c,$(wildcard $(SRCDIR)/*.c))
OBJ := $(patsubst $(SRCDIR)/%.c,$(BUILDDIR)/%.o,$(SRC))
LIB := $(BUILDDIR)/$(LIBNAME).so

# ---- test executable (engine/src/test.c) ----
TESTSRC := $(SRCDIR)/test.c
TESTOBJ := $(BUILDDIR)/test.o
TESTBIN := $(BUILDDIR)/print_board

.PHONY: all clean test test-exe run

all: $(LIB)

$(BUILDDIR):
	@mkdir -p $(BUILDDIR)

$(BUILDDIR)/%.o: $(SRCDIR)/%.c | $(BUILDDIR)
	$(CC) $(CFLAGS) -I$(INCDIR) -c $< -o $@

$(LIB): $(OBJ)
	$(CC) $(LDFLAGS) -o $@ $^

c-test-exe: $(TESTBIN)

$(TESTOBJ): $(TESTSRC) | $(BUILDDIR)
	$(CC) -std=c11 -Wall -Wextra -O2 -I$(INCDIR) -c $< -o $@

$(TESTBIN): $(TESTOBJ) $(LIB)
	$(CC) -O2 -o $@ $(TESTOBJ) -L$(BUILDDIR) -lchess -Wl,-rpath,'$$ORIGIN'

run-c-test: test-exe
	LD_LIBRARY_PATH=$(BUILDDIR) $(TESTBIN) $(FEN)

clean:
	@echo "Cleaning build and Python caches..."
	@rm -rf $(BUILDDIR)
	@find . -type d -name "__pycache__"    -exec rm -rf {} +
	@find . -type d -name ".pytest_cache"  -exec rm -rf {} +
	@find . -type f \( -name "*.pyc" -o -name "*.pyo" \) -delete

test:
	@$(MAKE) clean
	@$(MAKE) all
	@python3 -m unittest -v; \
	status=$$?; \
	$(MAKE) clean; \
	exit $$status
