# tower-of-joy Makefile
# Common operations for home server infrastructure management

.PHONY: help status health gpu-check disk backup cleanup deploy-% stop-% logs-% update-%

# Default target - show help
help:
	@echo "tower-of-joy Infrastructure Management"
	@echo ""
	@echo "Common Commands:"
	@echo "  make status         - Show project status and running containers"
	@echo "  make health         - Run comprehensive health check"
	@echo "  make gpu-check      - Verify GPU passthrough"
	@echo "  make disk           - Show disk usage report"
	@echo "  make backup         - Backup all Docker configs"
	@echo "  make cleanup        - Clean up unused Docker resources"
	@echo ""
	@echo "Stack Management:"
	@echo "  make deploy-<name>  - Deploy a stack (e.g., make deploy-portainer)"
	@echo "  make stop-<name>    - Stop a stack"
	@echo "  make logs-<name>    - Show stack logs"
	@echo "  make update-<name>  - Update stack to latest images"
	@echo ""
	@echo "Available Stacks:"
	@echo "  - portainer, nginx-proxy-manager, ollama"
	@echo "  - headscale"
	@echo "  - watchtower, maintenance"
	@echo "  - jellyfin, nextcloud, samba"
	@echo ""
	@echo "Setup Commands:"
	@echo "  make setup-dirs     - Create all required directories"
	@echo "  make mount-media    - Mount the 4TB media drive"
	@echo ""
	@echo "Examples:"
	@echo "  make deploy-portainer       # Deploy Portainer"
	@echo "  make logs-ollama           # View Ollama logs"
	@echo "  make update-jellyfin       # Update Jellyfin to latest"

# Show current status
status:
	@echo "=== tower-of-joy Status ==="
	@echo ""
	@echo "Running Containers:"
	@docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" 2>/dev/null || echo "Docker not running"
	@echo ""
	@echo "Disk Usage:"
	@df -h / /mnt/media 2>/dev/null | grep -E "Filesystem|/dev" || echo "Unable to check disk"
	@echo ""
	@echo "GPU Status:"
	@nvidia-smi --query-gpu=name,utilization.gpu,memory.used,memory.total --format=csv,noheader 2>/dev/null || echo "GPU not detected"

# Comprehensive health check
health:
	@./scripts/health-check.sh

# GPU verification
gpu-check:
	@./scripts/gpu-check.sh

# Disk usage report
disk:
	@./scripts/disk-usage.sh

# Backup configs
backup:
	@./scripts/backup-configs.sh

# Cleanup unused resources
cleanup:
	@./scripts/cleanup.sh

# Deploy a stack
deploy-%:
	@if [ ! -f stacks/$*.yml ]; then \
		echo "❌ Stack not found: $*"; \
		echo "Available stacks:"; \
		ls -1 stacks/*.yml | xargs -n 1 basename | sed 's/.yml$$//' | sed 's/^/  - /'; \
		exit 1; \
	fi
	@echo "Deploying $*..."
	@docker compose -f stacks/$*.yml up -d
	@echo "✅ $* deployed"
	@echo "Checking status..."
	@sleep 2
	@docker compose -f stacks/$*.yml ps

# Stop a stack
stop-%:
	@if [ ! -f stacks/$*.yml ]; then \
		echo "❌ Stack not found: $*"; \
		exit 1; \
	fi
	@echo "Stopping $*..."
	@docker compose -f stacks/$*.yml down
	@echo "✅ $* stopped"

# Show logs for a stack
logs-%:
	@if [ ! -f stacks/$*.yml ]; then \
		echo "❌ Stack not found: $*"; \
		exit 1; \
	fi
	@docker compose -f stacks/$*.yml logs -f

# Update a stack
update-%:
	@./scripts/update-stacks.sh $*

# Setup directories
setup-dirs:
	@echo "Creating directory structure..."
	@mkdir -p ~/docker-data/{portainer,nginx-proxy-manager,ollama,headscale,jellyfin,nextcloud,samba}
	@mkdir -p /mnt/media/{jellyfin,nextcloud,game-servers,backups,downloads}
	@echo "✅ Directories created"
	@echo ""
	@echo "SSD directories: ~/docker-data/"
	@ls -la ~/docker-data/
	@echo ""
	@echo "HDD directories: /mnt/media/"
	@ls -la /mnt/media/ 2>/dev/null || echo "⚠️  Media drive not mounted"

# Mount media drive
mount-media:
	@echo "Mounting 4TB media drive..."
	@if mountpoint -q /mnt/media; then \
		echo "✅ Media drive already mounted"; \
	else \
		sudo mount /dev/sdb /mnt/media && echo "✅ Media drive mounted" || echo "❌ Failed to mount media drive"; \
	fi
	@df -h /mnt/media 2>/dev/null || echo "Unable to verify mount"

# Quick deploy - Phase 1 infrastructure
deploy-phase1:
	@echo "=== Deploying Phase 1: Foundation ==="
	@echo ""
	@echo "[1/3] Deploying Portainer..."
	@make deploy-portainer
	@sleep 5
	@echo ""
	@echo "[2/3] Deploying Nginx Proxy Manager..."
	@make deploy-nginx-proxy-manager
	@sleep 5
	@echo ""
	@echo "[3/3] Deploying Ollama..."
	@make deploy-ollama
	@echo ""
	@echo "=== Phase 1 Complete ==="
	@echo ""
	@echo "Access services:"
	@echo "  Portainer: http://localhost:8080"
	@echo "  NPM:       http://localhost:8000"
	@echo "  Ollama:    http://localhost:11434"

# Quick deploy - Phase 2 networking
deploy-phase2:
	@echo "=== Deploying Phase 2: Networking ==="
	@echo ""
	@make deploy-headscale
	@echo ""
	@echo "=== Phase 2 Complete ==="
	@echo ""
	@echo "Configure Headscale:"
	@echo "  1. Generate config: docker exec headscale headscale config generate"
	@echo "  2. Create user: docker exec headscale headscale users create homelab"
	@echo "  3. Generate key: docker exec headscale headscale preauthkeys create --user homelab"

# Quick deploy - Phase 3 optimization
deploy-phase3:
	@echo "=== Deploying Phase 3: Optimization ==="
	@echo ""
	@echo "[1/2] Deploying Watchtower..."
	@make deploy-watchtower
	@sleep 3
	@echo ""
	@echo "[2/2] Deploying Maintenance Container..."
	@make deploy-maintenance
	@echo ""
	@echo "=== Phase 4 Complete ==="
	@echo ""
	@echo "Automated backups configured (daily at 3 AM)"

# Quick deploy - Applications
deploy-apps:
	@echo "=== Deploying Applications ==="
	@echo ""
	@echo "[1/3] Deploying Jellyfin..."
	@make deploy-jellyfin
	@sleep 5
	@echo ""
	@echo "[2/3] Deploying Nextcloud..."
	@make deploy-nextcloud
	@sleep 5
	@echo ""
	@echo "[3/3] Deploying Samba..."
	@make deploy-samba
	@echo ""
	@echo "=== Applications Deployed ==="
	@echo ""
	@echo "Access applications:"
	@echo "  Jellyfin:  http://localhost:8096"
	@echo "  Nextcloud: http://localhost:8082"
	@echo "  Samba:     \\\\tower-of-joy\\Media"

# Full deployment (all phases)
deploy-all:
	@echo "⚠️  This will deploy ALL services. This may take 10-15 minutes."
	@read -p "Continue? (y/N) " -n 1 -r; \
	echo; \
	if [[ $$REPLY =~ ^[Yy]$$ ]]; then \
		make deploy-phase1 && \
		make deploy-phase2 && \
		make deploy-phase3 && \
		make deploy-phase4 && \
		make deploy-apps && \
		echo "" && \
		echo "=== All Services Deployed ===" && \
		make status; \
	else \
		echo "Deployment cancelled"; \
	fi

# Development helpers
dev-setup:
	@echo "Setting up development environment..."
	@chmod +x scripts/*.sh
	@echo "✅ Scripts made executable"
	@echo "✅ Development setup complete"

# Show all containers
ps:
	@docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"

# Show all stacks
stacks:
	@echo "Available stacks:"
	@ls -1 stacks/*.yml | xargs -n 1 basename | sed 's/.yml$$//' | sed 's/^/  /'
