# C-Relay Makefile

CC = gcc
CFLAGS = -Wall -Wextra -std=c99 -g -O2
INCLUDES = -I. -Inostr_core_lib -Inostr_core_lib/nostr_core -Inostr_core_lib/cjson -Inostr_core_lib/nostr_websocket
LIBS = -lsqlite3 -lwebsockets -lz -ldl -lpthread -lm -L/usr/local/lib -lsecp256k1 -lssl -lcrypto -L/usr/local/lib -lcurl

# Build directory
BUILD_DIR = build

# Source files
MAIN_SRC = src/main.c src/config.c
NOSTR_CORE_LIB = nostr_core_lib/libnostr_core_x64.a

# Architecture detection
ARCH = $(shell uname -m)
ifeq ($(ARCH),x86_64)
    TARGET = $(BUILD_DIR)/c_relay_x86
else ifeq ($(ARCH),aarch64)
    TARGET = $(BUILD_DIR)/c_relay_arm64
else ifeq ($(ARCH),arm64)
    TARGET = $(BUILD_DIR)/c_relay_arm64
else
    TARGET = $(BUILD_DIR)/c_relay_$(ARCH)
endif

# Default target
all: $(TARGET)

# Create build directory
$(BUILD_DIR):
	mkdir -p $(BUILD_DIR)

# Check if nostr_core_lib is built
$(NOSTR_CORE_LIB):
	@echo "Building nostr_core_lib..."
	cd nostr_core_lib && ./build.sh

# Generate version.h from git tags
src/version.h:
	@if [ -d .git ]; then \
		echo "Generating version.h from git tags..."; \
		VERSION=$$(git describe --tags --always --dirty 2>/dev/null || echo "unknown"); \
		if echo "$$VERSION" | grep -q "^v[0-9]"; then \
			CLEAN_VERSION=$$(echo "$$VERSION" | sed 's/^v//'); \
			MAJOR=$$(echo "$$CLEAN_VERSION" | cut -d. -f1); \
			MINOR=$$(echo "$$CLEAN_VERSION" | cut -d. -f2); \
			PATCH=$$(echo "$$CLEAN_VERSION" | cut -d. -f3 | cut -d- -f1); \
		else \
			CLEAN_VERSION="0.0.0-$$VERSION"; \
			MAJOR=0; MINOR=0; PATCH=0; \
		fi; \
		echo "/* Auto-generated version information */" > src/version.h; \
		echo "#ifndef VERSION_H" >> src/version.h; \
		echo "#define VERSION_H" >> src/version.h; \
		echo "" >> src/version.h; \
		echo "#define VERSION \"$$VERSION\"" >> src/version.h; \
		echo "#define VERSION_MAJOR $$MAJOR" >> src/version.h; \
		echo "#define VERSION_MINOR $$MINOR" >> src/version.h; \
		echo "#define VERSION_PATCH $$PATCH" >> src/version.h; \
		echo "" >> src/version.h; \
		echo "#endif /* VERSION_H */" >> src/version.h; \
		echo "Generated version.h with version: $$VERSION"; \
	elif [ ! -f src/version.h ]; then \
		echo "Git not available and version.h missing, creating fallback version.h..."; \
		VERSION="unknown"; \
		echo "/* Auto-generated version information */" > src/version.h; \
		echo "#ifndef VERSION_H" >> src/version.h; \
		echo "#define VERSION_H" >> src/version.h; \
		echo "" >> src/version.h; \
		echo "#define VERSION \"$$VERSION\"" >> src/version.h; \
		echo "#define VERSION_MAJOR 0" >> src/version.h; \
		echo "#define VERSION_MINOR 0" >> src/version.h; \
		echo "#define VERSION_PATCH 0" >> src/version.h; \
		echo "" >> src/version.h; \
		echo "#endif /* VERSION_H */" >> src/version.h; \
		echo "Created fallback version.h with version: $$VERSION"; \
	else \
		echo "Git not available, preserving existing version.h"; \
	fi

# Force version.h regeneration (useful for development)
force-version:
	@echo "Force regenerating version.h..."
	@rm -f src/version.h
	@$(MAKE) src/version.h

# Build the relay
$(TARGET): $(BUILD_DIR) src/version.h $(MAIN_SRC) $(NOSTR_CORE_LIB)
	@echo "Compiling C-Relay for architecture: $(ARCH)"
	$(CC) $(CFLAGS) $(INCLUDES) $(MAIN_SRC) -o $(TARGET) $(NOSTR_CORE_LIB) $(LIBS)
	@echo "Build complete: $(TARGET)"

# Build for specific architectures
x86: $(BUILD_DIR) src/version.h $(MAIN_SRC) $(NOSTR_CORE_LIB)
	@echo "Building C-Relay for x86_64..."
	$(CC) $(CFLAGS) $(INCLUDES) $(MAIN_SRC) -o $(BUILD_DIR)/c_relay_x86 $(NOSTR_CORE_LIB) $(LIBS)
	@echo "Build complete: $(BUILD_DIR)/c_relay_x86"

arm64: $(BUILD_DIR) src/version.h $(MAIN_SRC) $(NOSTR_CORE_LIB)
	@echo "Cross-compiling C-Relay for ARM64..."
	@if ! command -v aarch64-linux-gnu-gcc >/dev/null 2>&1; then \
		echo "ERROR: ARM64 cross-compiler not found."; \
		echo "Install with: make install-cross-tools"; \
		echo "Or install manually: sudo apt install gcc-aarch64-linux-gnu"; \
		exit 1; \
	fi
	@echo "Checking for ARM64 development libraries..."
	@if ! dpkg -l | grep -q "libssl-dev:arm64\|libsqlite3-dev:arm64"; then \
		echo "ERROR: ARM64 libraries not found. Cross-compilation requires ARM64 versions of:"; \
		echo "  - libssl-dev:arm64"; \
		echo "  - libsqlite3-dev:arm64"; \
		echo "  - libwebsockets-dev:arm64"; \
		echo "  - libsecp256k1-dev:arm64"; \
		echo "  - zlib1g-dev:arm64"; \
		echo "  - libcurl4-openssl-dev:arm64"; \
		echo ""; \
		echo "Install ARM64 libraries with: make install-arm64-deps"; \
		echo "Or use Docker for cross-platform builds."; \
		exit 1; \
	fi
	@echo "Using aarch64-linux-gnu-gcc with ARM64 libraries..."
	PKG_CONFIG_PATH=/usr/lib/aarch64-linux-gnu/pkgconfig:/usr/share/pkgconfig \
	aarch64-linux-gnu-gcc $(CFLAGS) $(INCLUDES) $(MAIN_SRC) -o $(BUILD_DIR)/c_relay_arm64 $(NOSTR_CORE_LIB) \
		-L/usr/lib/aarch64-linux-gnu $(LIBS)
	@echo "Build complete: $(BUILD_DIR)/c_relay_arm64"

# Install ARM64 cross-compilation dependencies
install-arm64-deps:
	@echo "Installing ARM64 cross-compilation dependencies..."
	@echo "This requires adding ARM64 architecture and installing cross-libraries..."
	sudo dpkg --add-architecture arm64
	sudo apt update
	sudo apt install -y \
		gcc-aarch64-linux-gnu \
		libc6-dev-arm64-cross \
		libssl-dev:arm64 \
		libsqlite3-dev:arm64 \
		zlib1g-dev:arm64 \
		libcurl4-openssl-dev:arm64
	@echo "Note: libwebsockets-dev:arm64 and libsecp256k1-dev:arm64 may need manual building"

# Install cross-compilation tools
install-cross-tools:
	@echo "Installing cross-compilation tools..."
	sudo apt update
	sudo apt install -y gcc-aarch64-linux-gnu libc6-dev-arm64-cross

# Check what architectures we can actually build
check-toolchain:
	@echo "Checking available toolchains:"
	@echo "Native compiler: $(shell $(CC) --version | head -1)"
	@if command -v aarch64-linux-gnu-gcc >/dev/null 2>&1; then \
		echo "ARM64 cross-compiler: $(shell aarch64-linux-gnu-gcc --version | head -1)"; \
	else \
		echo "ARM64 cross-compiler: NOT INSTALLED (install with 'make install-cross-tools')"; \
	fi

# Run tests
test: $(TARGET)
	@echo "Running tests..."
	./tests/1_nip_test.sh

# Initialize database
init-db:
	@echo "Initializing database..."
	./db/init.sh --force

# Clean build artifacts
clean:
	rm -rf $(BUILD_DIR)
	rm -f src/version.h
	@echo "Clean complete"

# Clean everything including nostr_core_lib
clean-all: clean
	cd nostr_core_lib && make clean 2>/dev/null || true

# Install dependencies (Ubuntu/Debian)
install-deps:
	@echo "Installing dependencies..."
	sudo apt update
	sudo apt install -y build-essential libsqlite3-dev libssl-dev libcurl4-openssl-dev libsecp256k1-dev zlib1g-dev jq curl

# Help
help:
	@echo "C-Relay Build System"
	@echo ""
	@echo "Targets:"
	@echo "  all              Build the relay for current architecture (default)"
	@echo "  x86              Build specifically for x86_64"
	@echo "  arm64            Build for ARM64 (requires cross-compilation setup)"
	@echo "  test             Build and run tests"
	@echo "  init-db          Initialize the database"
	@echo "  clean            Clean build artifacts"
	@echo "  clean-all        Clean everything including dependencies"
	@echo "  install-deps     Install system dependencies"
	@echo "  install-cross-tools Install basic ARM64 cross-compiler"
	@echo "  install-arm64-deps Install ARM64 cross-compilation libraries"
	@echo "  check-toolchain  Check available compilers"
	@echo "  help             Show this help"
	@echo ""
	@echo "Usage:"
	@echo "  make                     # Build the relay for current arch"
	@echo "  make x86                 # Build for x86_64"
	@echo "  make arm64               # Build for ARM64 (fails if cross-compilation not set up)"
	@echo "  make install-arm64-deps  # Install full ARM64 cross-compilation setup"
	@echo "  make check-toolchain     # Check what compilers are available"
	@echo "  make test                # Run tests"
	@echo "  make init-db             # Set up database"
	@echo "  make force-version       # Force regenerate version.h from git"

.PHONY: all x86 arm64 test init-db clean clean-all install-deps install-cross-tools install-arm64-deps check-toolchain help force-version