CXX ?= g++

ROOT := $(abspath .)

CXXFLAGS := \
	-std=c++17 \
	-O2 \
	-Wall \
	-Wextra \
	-Wpedantic \
	-Iinclude \
	-DFACE_CLUSTERING_ROOT=\"$(ROOT)\"

LDFLAGS := \
	-L$(ROOT)/lib \
	-Wl,-rpath,$(ROOT)/lib

LDLIBS := \
	-lrknnrt \
	-ldl \
	-lpthread

BIN_DIR := bin
BUILD_DIR := build

ENGINE_SOURCE := src/face_engine.cc
ENGINE_OBJECT := $(BUILD_DIR)/face_engine.o

FACE_RECOGNITION_SOURCE := src/face_recognition.cc
FACE_RECOGNITION_OBJECT := $(BUILD_DIR)/face_recognition.o
FACE_RECOGNITION_BINARY := $(BIN_DIR)/face_recognition

FACE_SCAN_SOURCE := src/face_scan.cc
FACE_SCAN_OBJECT := $(BUILD_DIR)/face_scan.o
FACE_SCAN_BINARY := $(BIN_DIR)/face_scan

.PHONY: all clean test info

all: \
	$(FACE_RECOGNITION_BINARY) \
	$(FACE_SCAN_BINARY)

$(BUILD_DIR):
	mkdir -p $(BUILD_DIR)

$(BIN_DIR):
	mkdir -p $(BIN_DIR)

$(ENGINE_OBJECT): $(ENGINE_SOURCE) include/face_engine.h | $(BUILD_DIR)
	$(CXX) $(CXXFLAGS) -c $< -o $@

$(FACE_RECOGNITION_OBJECT): \
	$(FACE_RECOGNITION_SOURCE) \
	include/face_engine.h \
	include/face_config.h \
	| $(BUILD_DIR)
	$(CXX) $(CXXFLAGS) -c $< -o $@

$(FACE_SCAN_OBJECT): \
	$(FACE_SCAN_SOURCE) \
	include/face_engine.h \
	include/face_config.h \
	| $(BUILD_DIR)
	$(CXX) $(CXXFLAGS) -c $< -o $@

$(FACE_RECOGNITION_BINARY): \
	$(ENGINE_OBJECT) \
	$(FACE_RECOGNITION_OBJECT) \
	| $(BIN_DIR)
	$(CXX) $^ $(LDFLAGS) $(LDLIBS) -o $@

$(FACE_SCAN_BINARY): \
	$(ENGINE_OBJECT) \
	$(FACE_SCAN_OBJECT) \
	| $(BIN_DIR)
	$(CXX) $^ $(LDFLAGS) $(LDLIBS) -o $@

test: all
	./bin/face_recognition \
		test/test.jpg \
		test/test3f.jpg
	./bin/face_scan \
		test/test3f.jpg \
		> /tmp/face_scan_test.json
	python3 -m json.tool \
		/tmp/face_scan_test.json \
		> /dev/null
	@echo "Tests completed successfully"

info:
	@echo "ROOT=$(ROOT)"
	@echo "CXX=$(CXX)"
	@echo "CXXFLAGS=$(CXXFLAGS)"
	@echo "LDFLAGS=$(LDFLAGS)"

clean:
	rm -rf $(BUILD_DIR)
	rm -f $(FACE_RECOGNITION_BINARY)
	rm -f $(FACE_SCAN_BINARY)
