COMPOSE ?= docker compose
COMPOSE_DEV = PORT=$(PORT) $(COMPOSE) -f docker-compose.dev.yml

PYTHON ?= .venv/bin/python
PORT ?= 8000
RUNTIME ?= local

ifeq ($(RUNTIME),docker)
RUN_PYTHON = $(COMPOSE_DEV) run --rm --build app python
else ifeq ($(RUNTIME),local)
RUN_PYTHON = $(PYTHON)
else
$(error RUNTIME must be local or docker)
endif

.DEFAULT_GOAL := help
.PHONY: help setup dev-setup dev dev-up dev-down dev-logs check test-docker migrate revision init-db seed-demo db-shell reminders

help:
	@echo "Local:  make dev-setup && make seed-demo && make dev"
	@echo "Docker: make seed-demo RUNTIME=docker && make dev-up"
	@echo "Checks: make check (isolated from your development database)"
	@echo "Data:   make db-shell; make migrate; make revision m='description'"
	@echo "        Add RUNTIME=docker to run database commands in Docker."
	@echo "Port:   make dev PORT=8080 or make dev-up PORT=8080"

# Preserve an existing configuration and any populated database.
setup:
	@test -f .env || cp .env.example .env
	@mkdir -p data

# Host virtualenv, used for local debugging only. Checks always run in Docker.
dev-setup: setup
	@python3 -c 'import sys; sys.exit("Python 3.12+ is required; use Docker or install a newer Python.") if sys.version_info < (3, 12) else None'
	python3 -m venv .venv
	$(PYTHON) -m pip install --upgrade pip
	$(PYTHON) -m pip install -r requirements-dev.txt

# Host run with auto-reload, for fast debugging.
dev: setup
	@test -x $(PYTHON) || (echo "Run 'make dev-setup' first." && exit 1)
	$(PYTHON) -m uvicorn app.main:app --reload --port $(PORT)

# Full app in Docker with bind mounts and auto-reload.
dev-up: setup
	$(COMPOSE_DEV) up --build

dev-down:
	$(COMPOSE_DEV) down

dev-logs:
	$(COMPOSE_DEV) logs -f app

# Compile check plus the test suite, inside Docker.
check:
	$(COMPOSE_DEV) --profile check run --rm --build checks

test-docker:
	$(MAKE) check

# Apply database migrations (also runs automatically on app start).
migrate: setup
	$(RUN_PYTHON) -m app.cli migrate

# Autogenerate a migration: make revision m="add something"
revision: setup
	@test -n "$(m)" || (echo 'Use make revision m="short description"' && exit 1)
	$(RUN_PYTHON) -m alembic revision --autogenerate -m "$(m)"

init-db: setup
	$(RUN_PYTHON) -m app.cli init-db

seed-demo: setup
	$(RUN_PYTHON) -m app.cli seed-demo

db-shell: setup
	$(RUN_PYTHON) -m app.cli db-shell

reminders: setup
	$(RUN_PYTHON) -m app.cli send-reminders
