CC = cc

CFLAGS = -std=gnu23
CFLAGS_WARNINGS = -Wall -Wextra
CFLAGS_RELEASE = -O2 -fstack-protector-strong -fpie -s
CFLAGS_DEBUG = -O0 -ggdb -DDEBUG -fsanitize=address -static-libasan

TEST_LIBS = -lcmocka
TEST_INCLUDES = $(shell pkg-config --cflags cmocka)
CFLAGS_TEST = -O0 -ggdb -DTEST -fsanitize=address -static-libasan -fprofile-instr-generate -fcoverage-mapping $(TEST_LIBS) $(TEST_INCLUDES)

prefix = /usr/local
exec_prefix = $(prefix)
bindir = $(exec_prefix)/bin

SOURCE_FOLDER = src
SOURCE = main.c
TARGET = wamf
TARGET_DEBUG = wamf-debug
OUTPUT_FOLDER = output
OUTPUT = $(OUTPUT_FOLDER)/$(TARGET)
OUTPUT_DEBUG = $(OUTPUT_FOLDER)/$(TARGET_DEBUG)

TEST_FOLDER = test
TEST_SOURCE = test.c
TEST_OUTPUT_FOLDER = $(OUTPUT_FOLDER)/test
TEST_OUTPUT = $(TEST_OUTPUT_FOLDER)/test

REMOTE_USER = root
REMOTE_HOST = innovation.pvv.ntnu.no
REMOTE_DIR = /tmp/wamf
REMOTE_PATH = $(REMOTE_USER)@$(REMOTE_HOST):$(REMOTE_DIR)

.PHONY: all install release debug clean deploy remote-build remote-clean remote-run help test

all: $(OUTPUT)

$(OUTPUT_FOLDER):
	mkdir $(OUTPUT_FOLDER)

$(TEST_OUTPUT_FOLDER): $(OUTPUT_FOLDER)
	mkdir $(TEST_OUTPUT_FOLDER)

$(OUTPUT) release: $(SOURCE_FOLDER)/$(SOURCE) $(OUTPUT_FOLDER)
	$(CC) $(CFLAGS) $(CFLAGS_WARNINGS) $(CFLAGS_RELEASE) -o $(OUTPUT) $(SOURCE_FOLDER)/$(SOURCE)

$(OUTPUT_DEBUG) debug: $(SOURCE_FOLDER)/$(SOURCE) $(OUTPUT_FOLDER)
	$(CC) $(CFLAGS) $(CFLAGS_WARNINGS) $(CFLAGS_DEBUG) -o $(OUTPUT_DEBUG) $(SOURCE_FOLDER)/$(SOURCE)

$(TEST_OUTPUT): $(TEST_FOLDER)/$(TEST_SOURCE) $(TEST_OUTPUT_FOLDER)
	$(CC) $(CFLAGS) $(CFLAGS_WARNINGS) $(CFLAGS_TEST) -o $(TEST_OUTPUT) $(TEST_FOLDER)/$(TEST_SOURCE)

install: $(OUTPUT)
	install -Dm755 $(OUTPUT) -t $(bindir)

clean:
	rm -rf $(OUTPUT_FOLDER)

deploy:
	@echo "Creating remote directory..."
	ssh $(REMOTE_USER)@$(REMOTE_HOST) "mkdir -p $(REMOTE_DIR)"
	@echo "Copying source files to $(REMOTE_HOST)..."
	scp $(SOURCE_FOLDER)/$(SOURCE) $(REMOTE_PATH)/$(SOURCE_FOLDER)
	scp Makefile $(REMOTE_PATH)
	@echo "Files deployed successfully"

remote-build: deploy
	@echo "Building on remote server..."
	ssh $(REMOTE_USER)@$(REMOTE_HOST) "cd $(REMOTE_DIR) && make all"
	@echo "Build completed on remote server"

remote-clean:
	@echo "Cleaning remote build..."
	ssh $(REMOTE_USER)@$(REMOTE_HOST) "cd $(REMOTE_DIR) && make clean"

remote-run: remote-build
	@echo "Running on remote server..."
	ssh $(REMOTE_USER)@$(REMOTE_HOST) "cd $(REMOTE_DIR) && ./$(TARGET)"

check: $(TEST_OUTPUT)
	@echo "Running tests..."
	./$(TEST_OUTPUT)

help:
	@echo "Available targets:"
	@echo "  all          - Build locally"
	@echo "  clean        - Clean local build"
	@echo "  deploy       - Copy files to remote server"
	@echo "  remote-build - Deploy and build on remote server"
	@echo "  remote-clean - Clean remote build"
	@echo "  remote-run   - Build and run on remote server"
	@echo "  check        - Run tests"
