CXX = g++
CC = gcc
CXXFLAGS = -Wall -O2 -fPIC
CFLAGS = -Wall -O2
AR = ar
ARFLAGS = rcs

# Paths
EXTERNAL_HEADERS = ./include/
SQLITE_LIB = ./libs/libsqlite3.a

# Header library sources, add more sources in "UCIS SOURCES" with space!
UCIS_SOURCES = ucis.cpp dvt_ucis.cpp
UCIS_OBJECTS = $(UCIS_SOURCES:.cpp=.o)
UCIS_LIB = libucis.a
TEMP_DIR = temp

# Main program
MAIN_SRC = main.c
MAIN_OBJ = main.o
MAIN_TARGET = main_test

# Default target
all: $(MAIN_TARGET)

# Rule for ucislib - creates the combined static library
ucislib: $(UCIS_LIB)

# Compile C++ source files to object files
%.o: %.cpp
	$(CXX) $(CXXFLAGS) -c $< -I$(EXTERNAL_HEADERS) -o $@

# Create combined static library
$(UCIS_LIB): $(UCIS_OBJECTS) $(SQLITE_LIB)
	@echo "Extracting objects from external library..."
	@mkdir -p $(TEMP_DIR)
	cd $(TEMP_DIR) && $(AR) x ../$(SQLITE_LIB)
	@echo "Creating combined library..."
	$(AR) $(ARFLAGS) $@ $(UCIS_OBJECTS) $(TEMP_DIR)/*.o
	@echo "Cleaning up temporary files..."
	@rm -rf $(TEMP_DIR)
	@echo "Done! Created $@"

# Compile main.c
$(MAIN_OBJ): $(MAIN_SRC)
	$(CC) $(CFLAGS) -c $< -o $@

# Rule for main - builds the final executable
main: $(MAIN_TARGET)

# Link main program with the combined library
$(MAIN_TARGET): $(MAIN_OBJ) $(UCIS_LIB)
	$(CXX) $(MAIN_OBJ) $(UCIS_LIB) -lstdc++ -o $@
	@echo "Done! Created $@"

# Clean build artifacts
clean:
	rm -f $(UCIS_OBJECTS) $(UCIS_LIB) $(MAIN_OBJ) $(MAIN_TARGET)
	rm -rf $(TEMP_DIR)

# Clean only library files
clean-ucis:
	rm -f $(UCIS_OBJECTS) $(UCIS_LIB)
	rm -rf $(TEMP_DIR)

# Clean only main program files
clean-main:
	rm -f $(MAIN_OBJ) $(MAIN_TARGET)

# Phony targets
.PHONY: all ucislib main clean clean-ucis clean-main

# Show variables (for debugging)
info:
	@echo "Header sources: $(UCIS_SOURCES)"
	@echo "Header objects: $(UCIS_OBJECTS)"
	@echo "Header library: $(UCIS_LIB)"
	@echo "Main source: $(MAIN_SRC)"
	@echo "Main target: $(MAIN_TARGET)"