.PHONY: help dev dev-full prod down logs logs-dev clean clean-slate drop-db reset-db push-images deploy
.PHONY: test test-backend test-mcp test-frontend test-all test-cov test-integration validate validate-all format-all

VERSION ?= latest
REGISTRY ?= ghcr.io/cardosofelipe/pragma-stack

# Default target
help:
	@echo "Syndarix - AI-Powered Software Consulting Agency"
	@echo ""
	@echo "Development:"
	@echo "  make dev           - Start backend + db + MCP servers (frontend runs separately)"
	@echo "  make dev-full      - Start all services including frontend"
	@echo "  make down          - Stop all services"
	@echo "  make logs-dev      - Follow dev container logs"
	@echo ""
	@echo "Testing:"
	@echo "  make test          - Run all tests (backend + MCP servers)"
	@echo "  make test-backend  - Run backend tests only"
	@echo "  make test-mcp      - Run MCP server tests only"
	@echo "  make test-frontend - Run frontend tests only"
	@echo "  make test-cov      - Run all tests with coverage reports"
	@echo "  make test-integration - Run MCP integration tests (requires running stack)"
	@echo ""
	@echo "Formatting:"
	@echo "  make format-all    - Format code in backend + MCP servers + frontend"
	@echo ""
	@echo "Validation:"
	@echo "  make validate      - Validate backend + MCP servers (lint, type-check, test)"
	@echo "  make validate-all  - Validate everything including frontend"
	@echo ""
	@echo "Database:"
	@echo "  make drop-db       - Drop and recreate empty database"
	@echo "  make reset-db      - Drop database and apply all migrations"
	@echo ""
	@echo "Production:"
	@echo "  make prod          - Start production stack"
	@echo "  make deploy        - Pull and deploy latest images"
	@echo "  make push-images   - Build and push images to registry"
	@echo "  make logs          - Follow production container logs"
	@echo ""
	@echo "Cleanup:"
	@echo "  make clean         - Stop containers"
	@echo "  make clean-slate   - Stop containers AND delete volumes (DATA LOSS!)"
	@echo ""
	@echo "Subdirectory commands:"
	@echo "  cd backend && make help              - Backend-specific commands"
	@echo "  cd mcp-servers/llm-gateway && make   - LLM Gateway commands"
	@echo "  cd mcp-servers/knowledge-base && make - Knowledge Base commands"
	@echo "  cd frontend && npm run               - Frontend-specific commands"

# ============================================================================
# Development
# ============================================================================

dev:
	# Bring up all dev services except the frontend
	docker compose -f docker-compose.dev.yml up --build -d --scale frontend=0
	@echo ""
	@echo "Frontend is not started by 'make dev'."
	@echo "To run the frontend locally, open a new terminal and run:"
	@echo "    cd frontend && npm run dev"

dev-full:
	# Bring up all dev services including the frontend (full stack)
	docker compose -f docker-compose.dev.yml up --build -d

down:
	docker compose down

logs:
	docker compose logs -f

logs-dev:
	docker compose -f docker-compose.dev.yml logs -f

# ============================================================================
# Database Management
# ============================================================================

drop-db:
	@echo "Dropping local database..."
	@docker compose -f docker-compose.dev.yml exec -T db psql -U postgres -c "DROP DATABASE IF EXISTS app WITH (FORCE);" 2>/dev/null || \
		docker compose -f docker-compose.dev.yml exec -T db psql -U postgres -c "DROP DATABASE IF EXISTS app;"
	@docker compose -f docker-compose.dev.yml exec -T db psql -U postgres -c "CREATE DATABASE app;"
	@echo "Database dropped and recreated (empty)"

reset-db: drop-db
	@echo "Applying migrations..."
	@cd backend && uv run python migrate.py --local apply
	@echo "Database reset complete!"

# ============================================================================
# Production / Deployment
# ============================================================================

prod:
	docker compose up --build -d

deploy:
	docker compose -f docker-compose.deploy.yml pull
	docker compose -f docker-compose.deploy.yml up -d

push-images:
	docker build -t $(REGISTRY)/backend:$(VERSION) ./backend
	docker build -t $(REGISTRY)/frontend:$(VERSION) ./frontend
	docker push $(REGISTRY)/backend:$(VERSION)
	docker push $(REGISTRY)/frontend:$(VERSION)

# ============================================================================
# Cleanup
# ============================================================================

clean:
	docker compose down

# WARNING! THIS REMOVES CONTAINERS AND VOLUMES AS WELL - DO NOT USE THIS UNLESS YOU WANT TO START OVER WITH DATA AND ALL
clean-slate:
	docker compose -f docker-compose.dev.yml down -v --remove-orphans

# ============================================================================
# Testing
# ============================================================================

test: test-backend test-mcp
	@echo ""
	@echo "All tests passed!"

test-backend:
	@echo "Running backend tests..."
	@cd backend && IS_TEST=True uv run pytest tests/ -v

test-mcp:
	@echo "Running MCP server tests..."
	@echo ""
	@echo "=== LLM Gateway ==="
	@cd mcp-servers/llm-gateway && uv run pytest tests/ -v
	@echo ""
	@echo "=== Knowledge Base ==="
	@cd mcp-servers/knowledge-base && uv run pytest tests/ -v

test-frontend:
	@echo "Running frontend tests..."
	@cd frontend && npm test

test-all: test test-frontend
	@echo ""
	@echo "All tests (backend + MCP + frontend) passed!"

test-cov:
	@echo "Running all tests with coverage..."
	@echo ""
	@echo "=== Backend Coverage ==="
	@cd backend && IS_TEST=True uv run pytest tests/ -v --cov=app --cov-report=term-missing
	@echo ""
	@echo "=== LLM Gateway Coverage ==="
	@cd mcp-servers/llm-gateway && uv run pytest tests/ -v --cov=. --cov-report=term-missing
	@echo ""
	@echo "=== Knowledge Base Coverage ==="
	@cd mcp-servers/knowledge-base && uv run pytest tests/ -v --cov=. --cov-report=term-missing

test-integration:
	@echo "Running MCP integration tests..."
	@echo "Note: Requires running stack (make dev first)"
	@cd backend && RUN_INTEGRATION_TESTS=true IS_TEST=True uv run pytest tests/integration/ -v

# ============================================================================
# Formatting
# ============================================================================

format-all:
	@echo "Formatting backend..."
	@cd backend && make format
	@echo ""
	@echo "Formatting LLM Gateway..."
	@cd mcp-servers/llm-gateway && make format
	@echo ""
	@echo "Formatting Knowledge Base..."
	@cd mcp-servers/knowledge-base && make format
	@echo ""
	@echo "Formatting frontend..."
	@cd frontend && npm run format
	@echo ""
	@echo "All code formatted!"

# ============================================================================
# Validation (lint + type-check + test)
# ============================================================================

validate:
	@echo "Validating backend..."
	@cd backend && make validate
	@echo ""
	@echo "Validating LLM Gateway..."
	@cd mcp-servers/llm-gateway && make validate
	@echo ""
	@echo "Validating Knowledge Base..."
	@cd mcp-servers/knowledge-base && make validate
	@echo ""
	@echo "All validations passed!"

validate-all: validate
	@echo ""
	@echo "Validating frontend..."
	@cd frontend && npm run validate
	@echo ""
	@echo "Full validation passed!"
