# ─────────────────────────────────────────────────────────
# Makefile — Compila o programa eBPF sockmap
#
# Comandos:
#   make            → Compila tudo
#   make vmlinux    → Gera vmlinux.h do kernel atual
#   make bpf        → Compila o programa BPF
#   make clean      → Limpa arquivos compilados
#   make docker-up  → Sobe os containers Docker
#   make docker-down→ Para os containers
#   make load       → Carrega o eBPF sockmap
#   make unload     → Remove o eBPF sockmap
#   make status     → Mostra status do sockmap
#   make benchmark  → Roda benchmark de latência
# ─────────────────────────────────────────────────────────

# Compilador e flags
CLANG      ?= clang
BPFTOOL    ?= bpftool
ARCH       := $(shell uname -m | sed 's/x86_64/x86/' | sed 's/aarch64/arm64/')

# Diretórios
BPF_SRC    := bpf
BUILD_DIR  := build
LIBBPF_INC := /usr/include

# Arquivos
BPF_PROG   := $(BPF_SRC)/sockmap.bpf.c
BPF_OBJ    := $(BUILD_DIR)/sockmap.bpf.o
VMLINUX_H  := $(BPF_SRC)/vmlinux.h

# Flags de compilação BPF
BPF_CFLAGS := -O2 -g \
              -target bpf \
              -D__TARGET_ARCH_$(ARCH) \
              -I$(BPF_SRC) \
              -I$(LIBBPF_INC) \
              -Wall \
              -Wno-unused-value \
              -Wno-pointer-sign \
              -Wno-compare-distinct-pointer-types \
              -Wno-missing-declarations

# ─── Alvos principais ───
.PHONY: all vmlinux bpf clean docker-up docker-down load unload status benchmark help

all: vmlinux bpf
	@echo ""
	@echo "✅ Compilação concluída! Objeto BPF em: $(BPF_OBJ)"
	@echo ""
	@echo "Próximos passos:"
	@echo "  1. make docker-up    → Subir os containers"
	@echo "  2. make load         → Ativar o eBPF sockmap"
	@echo "  3. make benchmark    → Testar a latência"

# ─── Gerar vmlinux.h ───
vmlinux: $(VMLINUX_H)

$(VMLINUX_H):
	@echo "🔧 Gerando vmlinux.h a partir do kernel $(shell uname -r)..."
	@mkdir -p $(BPF_SRC)
	$(BPFTOOL) btf dump file /sys/kernel/btf/vmlinux format c > $(VMLINUX_H)
	@echo "✅ vmlinux.h gerado com sucesso!"

# ─── Compilar programa BPF ───
bpf: $(BPF_OBJ)

$(BPF_OBJ): $(BPF_PROG) $(VMLINUX_H)
	@echo "🔧 Compilando programa eBPF..."
	@mkdir -p $(BUILD_DIR)
	$(CLANG) $(BPF_CFLAGS) -c $(BPF_PROG) -o $(BPF_OBJ)
	@echo "✅ Programa BPF compilado: $(BPF_OBJ)"
	@echo ""
	@echo "📋 Programas e mapas no objeto:"
	@$(BPFTOOL) prog show --bpffs 2>/dev/null || true
	@echo ""

# ─── Docker ───
docker-up:
	@echo "🐳 Subindo containers Docker..."
	cd docker && docker compose up -d --build
	@echo ""
	@echo "✅ Containers rodando! Acesse http://localhost:8080"

docker-down:
	@echo "🐳 Parando containers Docker..."
	cd docker && docker compose down -v
	@echo "✅ Containers parados."

docker-logs:
	cd docker && docker compose logs -f

# ─── eBPF Sockmap ───
load:
	@echo "⚡ Carregando eBPF sockmap..."
	sudo bash scripts/loader.sh load

unload:
	@echo "⚡ Removendo eBPF sockmap..."
	sudo bash scripts/loader.sh unload

status:
	@sudo bash scripts/loader.sh status

# ─── Benchmark ───
benchmark:
	@echo "📊 Rodando benchmark de latência..."
	@echo "   Acesse: http://localhost:8080/benchmark"
	@curl -s http://localhost:8080/benchmark | python3 -m json.tool 2>/dev/null || \
		curl -s http://localhost:8080/benchmark
	@echo ""

# ─── Limpeza ───
clean:
	rm -rf $(BUILD_DIR)
	rm -f $(VMLINUX_H)
	@echo "🧹 Limpeza concluída."

# ─── Ajuda ───
help:
	@echo "eBPF Sockmap — Acelerador de comunicação entre containers Docker"
	@echo ""
	@echo "Comandos disponíveis:"
	@echo "  make            Compila o programa eBPF (vmlinux.h + .o)"
	@echo "  make vmlinux    Gera apenas o vmlinux.h"
	@echo "  make bpf        Compila apenas o programa BPF"
	@echo "  make docker-up  Sobe os containers (nginx + node + mysql + postgres)"
	@echo "  make docker-down Para e remove os containers"
	@echo "  make docker-logs Mostra logs dos containers"
	@echo "  make load       Carrega e ativa o eBPF sockmap"
	@echo "  make unload     Remove o eBPF sockmap"
	@echo "  make status     Mostra status e estatísticas"
	@echo "  make benchmark  Roda teste de latência"
	@echo "  make clean      Limpa arquivos compilados"
	@echo ""
