SHELL := /bin/bash
PY ?= .venv/bin/python
SLUG := vertex-ai-pipelines
# Pas de `-include .env` + `export` : les variables passées en ligne de commande doivent l'emporter.
# run.py lit .env lui-même ; le Makefile ne lit que le projet et transmet explicitement le reste.
PROJECT ?= $(shell sed -n 's/^GOOGLE_CLOUD_PROJECT=//p' .env 2>/dev/null)
REGION ?= europe-west1
BUCKET ?= $(PROJECT)-lab-$(SLUG)
RUN := GOOGLE_CLOUD_PROJECT=$(PROJECT) REGION=$(REGION) BUCKET=$(BUCKET) $(PY) run.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 (composants + compilation)
	@$(PY) -m pytest -q

compile: ## Compile le pipeline dans sorties/prompt_gate.yaml
	@$(RUN) compile

run: ## Exécute le pipeline en local (kfp.local ; Gemini par clé d'API ou Vertex AI)
	@$(RUN) local

cloud-up: ## Crée le bucket d'artefacts et y dépose données + registre
	@test -n "$(PROJECT)" || (echo "PROJECT manquant : GOOGLE_CLOUD_PROJECT dans .env ou make ... PROJECT=mon-projet" && exit 1)
	@gcloud storage buckets describe gs://$(BUCKET) --project $(PROJECT) >/dev/null 2>&1 || \
	  gcloud storage buckets create gs://$(BUCKET) --project $(PROJECT) --location $(REGION) \
	    --uniform-bucket-level-access --public-access-prevention --default-storage-class STANDARD
	@gcloud storage buckets update gs://$(BUCKET) --project $(PROJECT) --update-labels formation-lab=$(SLUG) >/dev/null
	@gcloud storage cp -q data/reference.jsonl gs://$(BUCKET)/data/reference.jsonl
	@gcloud storage objects describe gs://$(BUCKET)/registry/production.json >/dev/null 2>&1 || \
	  ( $(RUN) seed sorties/production.json && \
	    gcloud storage cp -q sorties/production.json gs://$(BUCKET)/registry/production.json )
	@echo "Bucket prêt : gs://$(BUCKET)"

e2e: ## Exécution réelle sur Vertex AI Pipelines (quelques centimes)
	@$(RUN) submit

cloud-status: ## Ce qui reste du lab sur Google Cloud
	@echo "Bucket :"; gcloud storage buckets list --project $(PROJECT) --filter="labels.formation-lab=$(SLUG)" --format="value(name)"
	@echo "Vertex AI :"; $(RUN) status

cloud-down: ## Supprime tout (exécutions, métadonnées, expérience, bucket) et vérifie
	@$(RUN) cleanup
	@! gcloud storage buckets describe gs://$(BUCKET) --project $(PROJECT) >/dev/null 2>&1 || \
	  gcloud storage rm -r -q gs://$(BUCKET)
	@test -z "$$(gcloud storage buckets list --project $(PROJECT) --filter='labels.formation-lab=$(SLUG)' --format='value(name)')" \
	  || (echo "ÉCHEC : le bucket existe encore" && exit 1)
	@$(RUN) status --strict && echo "Vérifié : plus aucune ressource du lab."

clean: ## Supprime les artefacts locaux
	@rm -rf sorties/ .pytest_cache __pycache__ tests/__pycache__
	@echo "Artefacts supprimés."

reset: clean ## Retour à l'état initial (garde .env)
	@rm -rf .venv
	@echo "Environnement supprimé (.env conservé)."

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