# Personal Internet Cell - Makefile
# Provides easy commands for managing the cell

.PHONY: help start stop restart status logs clean setup check-deps init-peers build build-api build-webui

# Detect docker compose command (v2 plugin preferred, fallback to v1 standalone)
DC := $(shell docker compose version >/dev/null 2>&1 && echo "docker compose" || echo "docker-compose")

# Default target
help:
	@echo "Personal Internet Cell - Management Commands"
	@echo ""
	@echo "Setup (run once on a fresh host):"
	@echo "  setup          - Create dirs, generate WireGuard keys, write configs, then: make start"
	@echo "                   Env vars: CELL_NAME=mycell  CELL_DOMAIN=cell  VPN_ADDRESS=10.0.0.1/24  WG_PORT=51820"
	@echo "  init-peers     - Reset peer list to empty"
	@echo ""
	@echo "Management:"
	@echo "  start          - Start all services (docker compose up -d)"
	@echo "  stop           - Stop all services"
	@echo "  restart        - Restart all services"
	@echo "  status         - Show container status + API health"
	@echo "  logs           - Follow logs from all services"
	@echo ""
	@echo "Build:"
	@echo "  build          - Rebuild API image"
	@echo "  build-api      - Rebuild API image (no cache)"
	@echo "  build-webui    - Rebuild Web UI image (no cache)"
	@echo ""
	@echo "Individual Services:"
	@echo "  start-dns      - Start DNS service only"
	@echo "  start-api      - Start API service only"
	@echo "  start-wg       - Start WireGuard service only"
	@echo ""
	@echo "Maintenance:"
	@echo "  clean          - Remove all containers and volumes"
	@echo "  backup         - Backup configuration and data"
	@echo "  restore        - Restore from backup"

# Setup commands
check-deps:
	@echo "Checking system dependencies..."
	@which python3 >/dev/null 2>&1 || \
		{ echo "Installing python3..." && sudo -n apt-get install -y python3 2>/dev/null || \
		  { echo "ERROR: python3 not found. Run: sudo apt-get install -y python3" ; exit 1 ; } ; }
	@python3 -c "import cryptography" 2>/dev/null || { \
		echo "Installing python3-cryptography..." ; \
		sudo -n apt-get install -y python3-cryptography 2>/dev/null || \
		python3 -m pip install --user cryptography 2>/dev/null || \
		{ python3 -m ensurepip --upgrade 2>/dev/null && python3 -m pip install --user cryptography 2>/dev/null ; } || \
		{ echo "ERROR: Cannot install python3-cryptography. Run: sudo apt-get install python3-cryptography" ; exit 1 ; } ; }
	@python3 -c "import cryptography" >/dev/null 2>&1 || \
		{ echo "ERROR: python3-cryptography still not found. Run: sudo apt-get install python3-cryptography" ; exit 1 ; }
	@echo "Dependencies OK."

setup: check-deps
	@echo "Setting up Personal Internet Cell..."
	@sudo chown -R $$(id -u):$$(id -g) config/ data/ 2>/dev/null || true
	CELL_NAME=$(or $(CELL_NAME),mycell) \
	CELL_DOMAIN=$(or $(CELL_DOMAIN),cell) \
	VPN_ADDRESS=$(or $(VPN_ADDRESS),10.0.0.1/24) \
	WG_PORT=$(or $(WG_PORT),51820) \
	WG_PRIVATE_KEY="$(WG_PRIVATE_KEY)" \
	WG_PUBLIC_KEY="$(WG_PUBLIC_KEY)" \
	python3 scripts/setup_cell.py

init-peers:
	@echo "Initializing peer configuration..."
	@echo '[]' > data/api/peers.json
	@echo "Peer configuration initialized."

# Management commands
start:
	@echo "Starting Personal Internet Cell..."
	PUID=$$(id -u) PGID=$$(id -g) $(DC) up -d --build
	@echo "Services started. Check status with 'make status'"

stop:
	@echo "Stopping Personal Internet Cell..."
	PUID=$$(id -u) PGID=$$(id -g) $(DC) down
	@echo "Services stopped."

restart:
	@echo "Restarting Personal Internet Cell..."
	PUID=$$(id -u) PGID=$$(id -g) $(DC) restart
	@echo "Services restarted."

status:
	@echo "Personal Internet Cell Status:"
	@echo "================================"
	$(DC) ps
	@echo ""
	@echo "API Status:"
	@curl -s http://localhost:3000/health || echo "API not responding"

logs:
	@echo "Showing logs from all services..."
	$(DC) logs -f

# Individual service commands
start-dns:
	@echo "Starting DNS service..."
	$(DC) up -d dns

start-api:
	@echo "Starting API service..."
	$(DC) up -d api

start-wg:
	@echo "Starting WireGuard service..."
	$(DC) up -d wireguard

start-webui:
	@echo "Starting WebUi service..."
	$(DC) up -d webui

# Maintenance commands
clean:
	@echo "Cleaning up containers and volumes..."
	$(DC) down -v
	docker system prune -f
	@echo "Cleanup complete."

backup:
	@echo "Creating backup..."
	@mkdir -p backups
	@tar -czf backups/cell-backup-$(shell date +%Y%m%d-%H%M%S).tar.gz \
		config/ data/ docker-compose.yml Makefile README.md
	@echo "Backup created in backups/ directory."

restore:
	@echo "Available backups:"
	@ls -la backups/cell-backup-*.tar.gz 2>/dev/null || echo "No backups found"
	@echo ""
	@echo "To restore, run: tar -xzf backups/cell-backup-YYYYMMDD-HHMMSS.tar.gz"

# Development commands
dev:
	@echo "Starting development environment..."
	$(DC) -f docker-compose.yml -f docker-compose.dev.yml up -d

build:
	@echo "Building API service..."
	$(DC) build api

build-api:
	@echo "Rebuilding API (no cache)..."
	$(DC) build --no-cache api
	$(DC) up -d api

build-webui:
	@echo "Rebuilding Web UI (no cache)..."
	$(DC) build --no-cache webui
	$(DC) up -d webui

# Testing commands
test:
	@echo "Running all unit and integration tests with pytest..."
	pytest tests/ api/tests/

test-all:
	@echo "Running all tests using the unified test runner..."
	python3 api/tests/run_tests.py

# Remove or update old test targets that reference non-existent files
test-unit:
	@echo "Running unit tests only..."
	pytest tests/

test-coverage:
	@echo "Running tests with coverage..."
	pytest tests/ api/tests/ --cov=api --cov-report=html --cov-report=term-missing -v

test-api:
	@echo "Testing API endpoints..."
	cd api && python3 -m pytest tests/test_api_endpoints.py -v

test-cli:
	@echo "Testing CLI tool..."
	cd api && python3 -m pytest tests/test_cli_tool.py -v

test-phase1:
	@echo "Testing Phase 1 (Network Foundation)..."
	cd api && python3 -m pytest tests/test_network_manager.py tests/test_phase1_endpoints.py -v

test-phase2:
	@echo "Testing Phase 2 (WireGuard & Peer Registry)..."
	cd api && python3 -m pytest tests/test_wireguard_manager.py tests/test_phase2_endpoints.py -v

test-phase3:
	@echo "Testing Phase 3 (Core Digital Services)..."
	cd api && python3 -m pytest tests/test_phase3_managers.py tests/test_phase3_endpoints.py -v

test-phase4:
	@echo "Testing Phase 4 (VPN Gateway & Routing)..."
	cd api && python3 -m pytest tests/test_phase4_routing.py tests/test_phase4_endpoints.py -v

test-all-phases:
	@echo "Testing all phases..."
	cd api && python3 -m pytest tests/ -v

# Network commands
show-routes:
	@echo "Current routing table:"
	@docker exec cell-wireguard wg show || echo "WireGuard not running"

add-peer:
	@echo "Usage: make add-peer PEER_NAME=name PEER_IP=ip PEER_KEY=public_key"
	@if [ -n "$(PEER_NAME)" ] && [ -n "$(PEER_IP)" ] && [ -n "$(PEER_KEY)" ]; then \
		curl -X POST http://localhost:3000/api/peers \
		-H "Content-Type: application/json" \
		-d '{"name":"$(PEER_NAME)","ip":"$(PEER_IP)","public_key":"$(PEER_KEY)"}'; \
	else \
		echo "Please provide PEER_NAME, PEER_IP, and PEER_KEY parameters"; \
	fi

list-peers:
	@echo "Configured peers:"
	@curl -s http://localhost:3000/api/peers | python3 -m json.tool || echo "API not responding" 