# ──────────────────────────────────────────────────────────────
#  BanGUI — Project Makefile
#
#  Compatible with both Docker Compose and Podman Compose.
#  Auto-detects which compose binary is available.
#
#  Usage:
#    make up           — start the debug stack
#    make down         — stop the debug stack
#    make build        — (re)build the backend image without starting
#    make clean        — stop, remove all containers, volumes, and local images
#    make logs         — tail logs for all debug services
#    make restart      — restart the debug stack
#    make dev-ban-test — one-command smoke test of the ban pipeline
#    make e2e          — run the Robot Framework E2E test suite
# ──────────────────────────────────────────────────────────────

COMPOSE_FILE := Docker/compose.debug.yml

# Compose project name (matches `name:` in compose.debug.yml).
PROJECT := bangui-dev

# All named volumes declared in compose.debug.yml.
# Compose prefixes them with the project name.
DEV_VOLUMES := \
	$(PROJECT)_bangui-dev-data \
	$(PROJECT)_frontend-node-modules \
	$(PROJECT)_fail2ban-dev-config \
	$(PROJECT)_fail2ban-dev-run

# Locally-built images (compose project name + service name).
# Public images (fail2ban, node) are intentionally excluded.
DEV_IMAGES := \
	$(PROJECT)_backend

# Detect available compose binary.
COMPOSE := $(shell command -v podman-compose 2>/dev/null \
             || echo "podman compose")

# Detect available container runtime (podman or docker).
RUNTIME := $(shell command -v podman 2>/dev/null || echo "docker")

.PHONY: up down build restart logs clean dev-ban-test e2e

## Start the debug stack (detached).
## Ensures log stub files exist so fail2ban can open them on first start.
up:
	@mkdir -p Docker/logs
	@touch Docker/logs/auth.log
	$(COMPOSE) -f $(COMPOSE_FILE) up -d

## Stop the debug stack.
down:
	$(COMPOSE) -f $(COMPOSE_FILE) down

## (Re)build the backend image without starting containers.
build:
	$(COMPOSE) -f $(COMPOSE_FILE) build

## Restart the debug stack.
restart: down up

## Tail logs for all debug services.
logs:
	$(COMPOSE) -f $(COMPOSE_FILE) logs -f

## Stop containers, remove ALL debug volumes and locally-built images.
## The next 'make up' will rebuild images from scratch and start fresh.
clean:
	$(COMPOSE) -f $(COMPOSE_FILE) down --remove-orphans
	$(RUNTIME) volume rm $(DEV_VOLUMES) 2>/dev/null || true
	$(RUNTIME) rmi $(DEV_IMAGES) 2>/dev/null || true
	@echo "All debug volumes and local images removed. Run 'make up' to rebuild and start fresh."

## Run the Robot Framework E2E test suite.
## Requires: stack up (make up), BANGUI_SESSION_SECRET env var set.
## Installs: pip install -r e2e/requirements.txt && rfbrowser init
e2e: up
	@echo "Waiting for stack to be healthy..."
	@timeout=120; \
	until curl -sf http://localhost:8000/api/health > /dev/null 2>&1; do \
	  sleep 5; timeout=$$((timeout-5)); \
	  if [ $$timeout -le 0 ]; then echo "Backend not healthy after 120s"; exit 1; fi; \
	done
	pip install -r e2e/requirements.txt -q
	rfbrowser init --quiet
	robot --outputdir e2e/results e2e/tests/

## One-command smoke test for the ban pipeline:
##   1. Start fail2ban, 2. write failure lines, 3. check ban status.
dev-ban-test:
	$(COMPOSE) -f $(COMPOSE_FILE) up -d fail2ban
	sleep 5
	bash Docker/simulate_failed_logins.sh
	sleep 3
	bash Docker/check_ban_status.sh
