SHELL := /bin/bash
PY ?= .venv/bin/python
SLUG := mlflow
# Pas de `-include .env` + `export` : les variables passées en ligne de commande doivent l'emporter.
# lab.py et docker compose lisent .env eux-mêmes ; le Makefile n'en lit que le port.
MLFLOW_PORT ?= $(or $(shell sed -n 's/^MLFLOW_PORT=//p' .env 2>/dev/null),5050)
MLFLOW_TRACKING_URI ?= http://localhost:$(MLFLOW_PORT)
# Transmis explicitement, sans export global :
COMPOSE := MLFLOW_PORT=$(MLFLOW_PORT) docker compose -p lab-$(SLUG)
LAB := MLFLOW_TRACKING_URI=$(MLFLOW_TRACKING_URI) $(PY) lab.py

.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 et installe les dépendances
	@test -d .venv || python3 -m venv .venv
	@.venv/bin/pip install -q -r requirements.txt
	@test -f .env || cp .env.example .env
	@echo "Prêt. Renseignez .env puis : make test"

test: ## Tests sans clé ni réseau (SQLite temporaire, faux Gemini)
	@$(PY) -m pytest -q

up: ## Démarre MLflow + PostgreSQL et attend qu'il réponde
	@$(COMPOSE) up -d --build --wait
	@curl -sf $(MLFLOW_TRACKING_URI)/health >/dev/null && echo "MLflow prêt : $(MLFLOW_TRACKING_URI)"

down: ## Arrête la pile et supprime ses volumes (runs, traces, artefacts)
	@$(COMPOSE) down -v --remove-orphans
	@test -z "$$(docker ps -aq --filter label=com.docker.compose.project=lab-$(SLUG))" && \
	  test -z "$$(docker volume ls -q --filter label=com.docker.compose.project=lab-$(SLUG))" && \
	  echo "Vérifié : aucun conteneur ni volume lab-$(SLUG)."

run: ## Démo complète : prompts, évaluations, promotion, modèle, question
	@$(LAB) demo

e2e: ## Démo + vérifications (alias, traces, runs) contre le serveur réel
	@$(LAB) e2e

clean: down ## Arrête la pile et supprime les artefacts locaux
	@rm -rf .pytest_cache __pycache__ tests/__pycache__ mlruns mlartifacts *.db
	@echo "Artefacts supprimés."

reset: clean ## Retour à l'état initial (garde .env)
	@rm -rf .venv
	@docker image rm -f lab-mlflow-server:3.17.1 >/dev/null 2>&1 || true
	@echo "Environnement supprimé (.env conservé)."

cloud-up cloud-down cloud-status: ## Sans objet : ce lab tourne entièrement en local
	@echo "Ce lab n'utilise aucune ressource Google Cloud (seulement l'API Gemini)."

.PHONY: help setup test up down run e2e clean reset cloud-up cloud-down cloud-status
