up:        ## start services
	docker compose -f docker/docker-compose.yml up -d postgres redis meilisearch languagetool
down:      ## stop services (data kept)
	docker compose -f docker/docker-compose.yml down
reset-db:  ## DESTRUCTIVE: wipe db + search + blobs, re-migrate
	docker compose -f docker/docker-compose.yml down -v
	rm -rf var/blobs && mkdir -p var/blobs
	docker compose -f docker/docker-compose.yml up -d --wait postgres redis meilisearch
	cd backend && alembic upgrade head
api:
	uvicorn app.main:create_app --factory --reload --port 8000 --app-dir backend
worker:      ## run both sync + jobs in one process (dev)
	cd backend && WORKER_ROLE=all python -m workers.run
worker-sync: ## run only the account-sync supervisor
	cd backend && WORKER_ROLE=sync python -m workers.run
worker-jobs: ## run only the arq job consumers (interactive + bulk)
	cd backend && WORKER_ROLE=jobs python -m workers.run
web:
	cd frontend && npm run dev
test:
	cd backend && pytest -q && cd ../frontend && npx vitest run
mail-test:  ## start throwaway IMAP/SMTP server
	docker compose -f docker/docker-compose.yml up -d greenmail

# --- production (NAS / single-host Docker deploy; see docs/nas-install.md) ---
prod-init:    ## generate docker/.env.prod + data dirs
	./deploy/webmail.sh init
prod-up:      ## start the production stack
	./deploy/webmail.sh up
prod-down:    ## stop the production stack (data kept)
	./deploy/webmail.sh down
prod-status:  ## what is running, versions, disk, backups
	./deploy/webmail.sh status
prod-update:  ## backup -> migrate -> roll -> health-gate (auto-rollback on failure)
	./deploy/webmail.sh update
prod-backup:  ## take a verified database dump now
	./deploy/webmail.sh backup
prod-doctor:  ## pre-flight checks on a deployment
	./deploy/webmail.sh doctor
prod-images:  ## build production images locally (no push)
	docker build -f docker/Dockerfile.backend -t webmail/backend:local .
	docker build -f docker/Dockerfile.frontend -t webmail/web:local .
