GO ?= go
DOCKER_COMPOSE ?= docker compose

CONFIG ?= configs/lab.toml
DEVICE_ID ?= device-001
BACKEND_CLIENT_ID ?= lab-backend
SIMULATOR_CLIENT_ID ?= lab-simulator-$(DEVICE_ID)
BIN_DIR ?= bin

.PHONY: help build configcheck broker-up broker-down broker-logs backend simulator lab-up

help: ## List available commands
	@awk 'BEGIN {FS = ":.*##"} /^[a-zA-Z0-9_-]+:.*##/ {printf "%-16s %s\n", $$1, $$2}' $(MAKEFILE_LIST)

build: ## Build the backend, simulator, and config checker into $(BIN_DIR)/
	@mkdir -p $(BIN_DIR)
	$(GO) build -o $(BIN_DIR)/backend ./cmd/backend
	$(GO) build -o $(BIN_DIR)/simulator ./cmd/simulator
	$(GO) build -o $(BIN_DIR)/configcheck ./cmd/configcheck

configcheck: ## Validate the lab configuration and credentials
	$(GO) run ./cmd/configcheck -config $(CONFIG) -username backend

broker-up: ## Start the Mosquitto lab broker in the background
	$(DOCKER_COMPOSE) -f compose.yml up -d broker

broker-down: ## Stop the broker without deleting its volumes
	$(DOCKER_COMPOSE) -f compose.yml down

broker-logs: ## Follow broker logs
	$(DOCKER_COMPOSE) -f compose.yml logs --follow broker

backend: broker-up ## Ensure the broker is running, then run the backend (Ctrl+C to stop)
	$(GO) run ./cmd/backend -config $(CONFIG) -username backend -client-id $(BACKEND_CLIENT_ID) -device-id $(DEVICE_ID)

simulator: broker-up ## Ensure the broker is running, then run the simulator (Ctrl+C to stop)
	$(GO) run ./cmd/simulator -config $(CONFIG) -username simulator -client-id $(SIMULATOR_CLIENT_ID) -device-id $(DEVICE_ID)

lab-up: build ## Build everything, start the broker, then run both services together
	$(DOCKER_COMPOSE) -f compose.yml up -d broker
	@set -m; \
		trap 'kill "$$simulator_pid" "$$backend_pid" 2>/dev/null || true; wait "$$simulator_pid" "$$backend_pid" 2>/dev/null || true' EXIT INT TERM; \
		$(BIN_DIR)/simulator -config $(CONFIG) -username simulator -client-id $(SIMULATOR_CLIENT_ID) -device-id $(DEVICE_ID) & simulator_pid=$$!; \
		$(BIN_DIR)/backend -config $(CONFIG) -username backend -client-id $(BACKEND_CLIENT_ID) -device-id $(DEVICE_ID) & backend_pid=$$!; \
		wait "$$simulator_pid" "$$backend_pid"
