# ==============================================================================
# Fortress Chat - server daemon (fortress-chatd)
# ==============================================================================
# Blind relay server. Links the shared libfccommon.a plus libsodium only.
# Build:  make            (or `make apps` / `make -C apps/server` from root)
# Test:   make test
# ==============================================================================

CC := gcc

COMMON_DIR  := ../common
COMMON_LIB  := $(COMMON_DIR)/build/libfccommon.a
INCLUDE_DIR := ../../include
LOCAL_INC   := $(HOME)/.local/include
LOCAL_LIB   := $(HOME)/.local/lib

BUILD_DIR := build
OBJ_DIR   := $(BUILD_DIR)/obj
BIN_DIR   := $(BUILD_DIR)/bin

CFLAGS := -std=c11
CFLAGS += -I. -I$(COMMON_DIR) -I$(COMMON_DIR)/tests -I$(INCLUDE_DIR) -I$(LOCAL_INC)
CFLAGS += -Wall -Wextra -Werror -O2
CFLAGS += -fstack-protector-strong -D_FORTIFY_SOURCE=2
CFLAGS += $(EXTRA_CFLAGS)

LDFLAGS := -L$(LOCAL_LIB) $(EXTRA_LDFLAGS)
LIBS    := -lsodium

DAEMON      := $(BIN_DIR)/fortress-chatd
DAEMON_OBJS := $(OBJ_DIR)/server.o $(OBJ_DIR)/storage.o

TEST_SRCS := $(wildcard tests/*.c)
TEST_BINS := $(patsubst tests/%.c,$(BIN_DIR)/%,$(TEST_SRCS))

.PHONY: all test clean dirs

all: dirs $(DAEMON)

dirs:
	@mkdir -p $(OBJ_DIR) $(BIN_DIR)

# Build the common library on demand for a standalone `make -C apps/server`.
$(COMMON_LIB):
	@$(MAKE) -C $(COMMON_DIR) EXTRA_CFLAGS="$(EXTRA_CFLAGS)" EXTRA_LDFLAGS="$(EXTRA_LDFLAGS)"

$(OBJ_DIR)/%.o: %.c | dirs
	@echo "[CC] $<"
	@$(CC) $(CFLAGS) -c -o $@ $<

$(DAEMON): $(DAEMON_OBJS) $(COMMON_LIB) | dirs
	@echo "[LD] $@"
	@$(CC) $(CFLAGS) -o $@ $(DAEMON_OBJS) $(COMMON_LIB) $(LDFLAGS) $(LIBS)

# test_storage links the storage object directly; test_smoke drives the daemon.
$(BIN_DIR)/test_storage: tests/test_storage.c $(OBJ_DIR)/storage.o $(COMMON_LIB) | dirs
	@echo "[CC] test $<"
	@$(CC) $(CFLAGS) -o $@ $< $(OBJ_DIR)/storage.o $(COMMON_LIB) $(LDFLAGS) $(LIBS)

$(BIN_DIR)/test_smoke: tests/test_smoke.c $(COMMON_LIB) $(DAEMON) | dirs
	@echo "[CC] test $<"
	@$(CC) $(CFLAGS) -o $@ $< $(COMMON_LIB) $(LDFLAGS) $(LIBS)

test: all $(TEST_BINS)
	@echo "Running fortress-chatd tests..."
	@FORTRESS_CHATD=$(abspath $(DAEMON)); export FORTRESS_CHATD; \
	for t in $(TEST_BINS); do \
		echo "=== $$t ==="; \
		$$t || exit 1; \
	done
	@echo "All fortress-chatd tests passed!"

clean:
	@rm -rf $(BUILD_DIR)
