.PHONY: help setup dev server worker tailwind test lint format typecheck migrate migrations docker-up docker-down docker-build docker-local docker-local-down source-archive

help: ## Show this help
	@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}'

# Setup

setup: ## Initial project setup (copy env, install deps, migrate)
	@test -f .env || cp .env.example .env
	pip install -r requirements.txt
	cd theme/static_src && npm install
	python manage.py migrate
	@echo ""
	@echo "Setup complete. Run 'python manage.py createsuperuser' to create an admin account."
	@echo "Then run 'make dev' to start the app."

# Development

dev: ## Start Django server, worker, and Tailwind watcher (requires 3 terminals)
	@echo "Start these in separate terminals:"
	@echo "  make server    - Django dev server"
	@echo "  make worker    - Background task worker"
	@echo "  make tailwind  - Tailwind CSS watcher"

server: ## Start Django dev server
	python manage.py runserver

worker: ## Start background task worker
	python manage.py process_tasks

tailwind: ## Start Tailwind CSS watcher
	cd theme/static_src && npm run start

# Database

migrate: ## Run database migrations
	python manage.py migrate

migrations: ## Create new migrations
	python manage.py makemigrations

# Code quality

test: ## Run tests
	pytest --reuse-db

test-cov: ## Run tests with coverage and enforce coverage gates
	pytest --reuse-db --cov=apps --cov-report=term-missing --cov-report=json:coverage.json --cov-fail-under=78
	python scripts/check_coverage.py


lint: ## Run linter and format check
	ruff check .
	ruff format --check .

format: ## Auto-fix lint and formatting issues
	ruff check --fix .
	ruff format .

typecheck: ## Run mypy type checker
	mypy apps/ config/ providers/ tests/ --ignore-missing-imports

# Docker

docker-up: ## Start all Docker services
	docker compose up -d

docker-down: ## Stop all Docker services
	docker compose down

docker-build: ## Rebuild Docker images
	docker compose build

docker-logs: ## Tail logs from all Docker services
	docker compose logs -f

docker-prod: ## Start production Docker setup (with Caddy)
	docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d

LOCAL_STACK = docker compose -p stalo-local -f docker-compose.yml -f docker-compose.prod.yml -f docker-compose.local.yml

docker-local: ## Start the full production topology locally on https://localhost
	SOURCE_COMMIT=$$(git rev-parse HEAD) SOURCE_BUILD_DATE=$$(date -u +%Y-%m-%dT%H:%M:%SZ) $(LOCAL_STACK) up -d --build

source-archive: ## Publish the AGPL source package of HEAD to the local stack's storage (/source/download/)
	git archive --format=tar.gz --prefix=stalo-social-$$(git rev-parse HEAD)/ HEAD > /tmp/stalo-social-source.tar.gz
	docker cp /tmp/stalo-social-source.tar.gz stalo-local-app-1:/tmp/stalo-social-source.tar.gz
	$(LOCAL_STACK) exec app python manage.py publish_source_archive /tmp/stalo-social-source.tar.gz --sha $$(git rev-parse HEAD)

docker-local-down: ## Stop the local production-topology stack (volumes kept)
	$(LOCAL_STACK) down

# Install requirements-e2e.txt and Chromium first; precreate TEST_DB_NAME (*_test).
e2e: ## Compile styles and run browser journeys against an isolated Django server
	npm --prefix theme/static_src run build
	REDIS_URL= DJANGO_SETTINGS_MODULE=config.settings.test pytest tests/e2e/ --reuse-db
