.PHONY: help install build up down restart logs health backup deploy clean \
        ummahid-logs wallet-logs ramz-logs mocknet-logs api-logs app-logs \
        db-shell db-backup db-restore redis-shell redis-flush \
        stats ps setup env-check test test-watch test-coverage

# Falah OS v1.3 — Docker Compose management
# Usage: make help

help: ## Show available commands
	@echo "Falah OS v1.3"
	@echo ""
	@echo "Usage: make [command]"
	@echo ""
	@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "  \033[36m%-18s\033[0m %s\n", $$1, $$2}'

# ---------------------------------------------------------------------------
# Core lifecycle
# ---------------------------------------------------------------------------

install: ## Full install: generate secrets, write .env, start stack, health check
	@bash install.sh

setup: ## First-time setup: copy .env.example → .env (manual secret entry)
	@if [ -f .env ]; then echo ".env already exists, skipping."; else cp .env.example .env && echo "Created .env — fill in secrets before running 'make up'"; fi

env-check: ## Verify required env vars are set
	@missing=0; \
	for var in JWT_SECRET ENCRYPTION_KEY ADMIN_SECRET POSTGRES_PASSWORD REDIS_PASSWORD; do \
		if [ -z "$$(grep -E "^$$var=.+" .env 2>/dev/null | cut -d= -f2)" ]; then \
			echo "MISSING: $$var"; missing=1; \
		fi; \
	done; \
	[ $$missing -eq 0 ] && echo "All required env vars are set." || exit 1

test: ## Run all tests
	npm test

test-watch: ## Run tests in watch mode
	npm run test:watch

test-coverage: ## Run tests with coverage report
	npm run test:coverage

build: ## Build all service images
	docker compose build

up: env-check ## Start the full stack
	docker compose up -d
	@echo "Waiting for services..."
	@sleep 8
	@$(MAKE) health

down: ## Stop and remove containers (preserves volumes)
	docker compose down

restart: ## Restart all containers
	docker compose restart

logs: ## Tail logs from all services
	docker compose logs -f --tail=100

health: ## Run health checks against all services
	@./scripts/health-check.sh

ps: ## Show container status
	docker compose ps

stats: ## Live container resource usage
	docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.NetIO}}"

# ---------------------------------------------------------------------------
# Per-service logs
# ---------------------------------------------------------------------------

ummahid-logs: ## Tail Ummah ID logs
	docker compose logs -f ummahid

wallet-logs: ## Tail Wallet logs
	docker compose logs -f wallet

ramz-logs: ## Tail RAMZ logs
	docker compose logs -f ramz

mocknet-logs: ## Tail Mock-Net logs
	docker compose logs -f mocknet

falahd-logs: ## Tail falahd daemon logs
	docker compose logs -f falahd

api-logs: ## Tail API Gateway logs
	docker compose logs -f api-gateway

app-logs: ## Tail App logs
	docker compose logs -f app

# ---------------------------------------------------------------------------
# Database
# ---------------------------------------------------------------------------

db-shell: ## Open PostgreSQL shell
	docker compose exec postgres psql -U $${POSTGRES_USER:-postgres}

db-backup: ## Dump all databases to backups/
	@mkdir -p backups
	docker compose exec postgres pg_dumpall -U $${POSTGRES_USER:-postgres} \
		| gzip > backups/postgres_$$(date +%Y%m%d_%H%M%S).sql.gz
	@echo "Backup saved to backups/"

db-restore: ## Restore from backup: make db-restore FILE=backups/postgres_xxx.sql.gz
	@[ -n "$(FILE)" ] || (echo "Usage: make db-restore FILE=backups/postgres_xxx.sql.gz" && exit 1)
	gunzip -c $(FILE) | docker compose exec -T postgres psql -U $${POSTGRES_USER:-postgres}

# ---------------------------------------------------------------------------
# Redis
# ---------------------------------------------------------------------------

redis-shell: ## Open Redis CLI
	docker compose exec redis redis-cli -a $${REDIS_PASSWORD}

redis-flush: ## Flush all Redis data (will prompt for confirmation)
	@echo "WARNING: this deletes all Redis data."
	@read -p "Type 'yes' to confirm: " c && [ "$$c" = "yes" ] || exit 1
	docker compose exec redis redis-cli -a $${REDIS_PASSWORD} FLUSHALL

# ---------------------------------------------------------------------------
# Cleanup
# ---------------------------------------------------------------------------

clean: ## Remove containers AND volumes (destroys all data — prompts first)
	@echo "WARNING: this destroys all Falah OS containers and volumes."
	@read -p "Type 'yes' to confirm: " c && [ "$$c" = "yes" ] || exit 1
	docker compose down -v
	@echo "Done. Run 'make up' to start fresh."
