SHELL := /bin/bash
PY ?= .venv/bin/python
SLUG := langfuse
COMPOSE := docker compose -p lab-$(SLUG) -f docker-compose.yml -f docker-compose.lab.yml
SECRETS := NEXTAUTH_SECRET SALT ENCRYPTION_KEY POSTGRES_PASSWORD CLICKHOUSE_PASSWORD REDIS_AUTH MINIO_ROOT_PASSWORD LANGFUSE_INIT_USER_PASSWORD
# Ne PAS faire `-include .env` + `export` : .env écraserait les variables passées en ligne de commande.
# docker compose et les scripts Python lisent .env eux-mêmes ; le Makefile ne lit que ce dont il a besoin :
LANGFUSE_BASE_URL ?= $(or $(shell sed -n 's/^LANGFUSE_BASE_URL=//p' .env 2>/dev/null),http://localhost:3000)
export PYTHONPATH := src

.DEFAULT_GOAL := help
help: ## Liste les commandes
	@grep -hE '^[a-z0-9-]+:.*## ' Makefile | awk -F':.*## ' '{printf "  make %-13s %s\n", $$1, $$2}'

setup: ## Crée .venv, installe les dépendances, génère .env avec des secrets aléatoires
	@test -d .venv || python3 -m venv .venv
	@.venv/bin/pip install -q -r requirements.txt
	@if [ ! -f .env ]; then cp .env.example .env; \
	  for k in $(SECRETS); do sed -i "s|^$$k=changeme|$$k=$$(openssl rand -hex 32)|" .env; done; \
	  sed -i "s|^LANGFUSE_INIT_PROJECT_PUBLIC_KEY=.*|LANGFUSE_INIT_PROJECT_PUBLIC_KEY=pk-lf-$$(openssl rand -hex 16)|; s|^LANGFUSE_INIT_PROJECT_SECRET_KEY=.*|LANGFUSE_INIT_PROJECT_SECRET_KEY=sk-lf-$$(openssl rand -hex 16)|" .env; \
	  echo ".env créé avec des secrets aléatoires. Ajoutez GEMINI_API_KEY."; fi
	@echo "Prêt. Ensuite : make test, puis make up"

test: ## Tests sans clé ni réseau
	@$(PY) -m pytest -q tests

up: ## Démarre Langfuse (6 conteneurs) et attend qu'il réponde
	@$(COMPOSE) up -d
	@echo -n "Attente de Langfuse sur $(LANGFUSE_BASE_URL)"; for i in $$(seq 1 90); do \
	  curl -sf $(LANGFUSE_BASE_URL)/api/public/health >/dev/null && { echo " : prêt."; exit 0; }; echo -n "."; sleep 2; done; \
	  echo " : délai dépassé, voir make logs"; exit 1

logs: ## Journaux du web et du worker
	@$(COMPOSE) logs --tail=50 langfuse-web langfuse-worker

seed: ## Crée les prompts versionnés, le jeu de données et le prix du modèle
	@$(PY) -m assistant seed

run: ## Démo : une conversation avec l'application Gemini et l'agent ADK
	@$(PY) -m assistant demo

eval: ## Expérience sur le jeu de données avec juge LLM
	@$(PY) -m assistant eval

couts: ## Coût par modèle et par conseiller (API Metrics v2)
	@$(PY) -m assistant couts

e2e: ## Test réel : seed + démo + évaluation + vérification par l'API Langfuse
	@$(PY) -m assistant e2e

down: ## Arrête la pile ET supprime ses volumes (traces, prompts, comptes)
	@$(COMPOSE) down -v --remove-orphans
	@left=$$(docker volume ls -q --filter label=com.docker.compose.project=lab-$(SLUG)); \
	  if [ -n "$$left" ]; then echo "Volumes restants : $$left"; exit 1; else echo "Pile et volumes lab-$(SLUG) supprimés."; fi

clean: down ## Supprime artefacts locaux et pile Docker
	@rm -rf .pytest_cache tests/__pycache__ src/assistant/__pycache__
	@echo "Artefacts supprimés."

reset: clean ## clean + supprime .venv (garde .env)
	@rm -rf .venv
	@echo "Environnement supprimé (.env conservé)."

cloud-up: ## Sans objet : ce projet tourne en local
	@echo "Aucune ressource Google Cloud pour ce projet (voir leçon 6 pour la cible GCP)."
cloud-down: ## Sans objet
	@echo "Aucune ressource Google Cloud à supprimer."
cloud-status: ## Sans objet
	@echo "Aucune ressource Google Cloud créée par ce projet."
