# Makefile for SLS project

CC ?= gcc
CFLAGS ?= -std=c11 -Wall -Wextra -g -Iinclude
LDFLAGS ?=

SRCDIR := src
OBJDIR := obj
BINDIR := bin
TESTDIR := tests

TARGET := $(BINDIR)/sls
TEST_TARGET := $(BINDIR)/sls_tests

SOURCES := $(wildcard $(SRCDIR)/*.c)
OBJECTS := $(patsubst $(SRCDIR)/%.c,$(OBJDIR)/%.o,$(SOURCES))

TEST_SOURCES := $(wildcard $(TESTDIR)/*.c)
TEST_OBJECTS := $(patsubst $(TESTDIR)/%.c,$(OBJDIR)/%.o,$(TEST_SOURCES))

.PHONY: all compile run test clean

# Default: build main program
all: $(TARGET)

# Compile object files
build: $(OBJECTS)

# Rule to compile .c -> .o
$(OBJDIR)/%.o: $(SRCDIR)/%.c | $(OBJDIR)
	$(CC) $(CFLAGS) -c $< -o $@

# Rule to compile test .c -> .o
$(OBJDIR)/%.o: $(TESTDIR)/%.c | $(OBJDIR)
	$(CC) $(CFLAGS) -c $< -o $@

# Link main program
$(TARGET): $(OBJECTS) | $(BINDIR)
	$(CC) $(LDFLAGS) $^ -o $@

# Run main program
run: $(TARGET)
	@echo "Running $(TARGET)..."
	./$(TARGET)

# Build test runner executable
$(TEST_TARGET): $(TEST_OBJECTS) $(OBJECTS) | $(BINDIR)
	$(CC) $(LDFLAGS) $^ -o $@

# Run tests
test: $(TEST_TARGET)
	@echo "Running tests..."
	./$(TEST_TARGET)

# Create directories if missing
$(BINDIR):
	mkdir -p $(BINDIR)

$(OBJDIR):
	mkdir -p $(OBJDIR)

# Remove build artifacts
clean:
	rm -rf $(OBJDIR) $(BINDIR)
