.PHONY: help dev test lint fmt clean docker-up docker-down install migrate

# Variables
BACKEND_DIR = backend
FRONTEND_DIR = frontend
PYTHON = python3
UV = uv
NPM = npm

help: ## Affiche cette aide
	@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}'

# === Développement ===

dev: ## Lance l'environnement de développement complet (backend + frontend)
	docker compose up --build

dev-backend: ## Lance uniquement le backend en mode dev
	cd $(BACKEND_DIR) && $(UV) run uvicorn app.main:app --reload --host 0.0.0.0 --port 8000

dev-frontend: ## Lance uniquement le frontend en mode dev
	cd $(FRONTEND_DIR) && $(NPM) run dev

# === Installation ===

install: install-backend install-frontend ## Installe toutes les dépendances

install-backend: ## Installe les dépendances Python (backend)
	cd $(BACKEND_DIR) && $(UV) sync

install-frontend: ## Installe les dépendances Node (frontend)
	cd $(FRONTEND_DIR) && $(NPM) install

# === Tests ===

test: test-backend test-frontend ## Lance tous les tests

test-backend: ## Lance les tests backend (pytest)
	cd $(BACKEND_DIR) && $(UV) run pytest

test-backend-cov: ## Lance les tests backend avec couverture
	cd $(BACKEND_DIR) && $(UV) run pytest --cov=app --cov-report=html --cov-report=term

test-frontend: ## Lance les tests frontend (vitest)
	cd $(FRONTEND_DIR) && $(NPM) run test

# === Linting & Formatage ===

lint: lint-backend lint-frontend ## Lance tous les linters

lint-backend: ## Lint le code backend (ruff + mypy)
	cd $(BACKEND_DIR) && $(UV) run ruff check .
	cd $(BACKEND_DIR) && $(UV) run mypy .

lint-frontend: ## Lint le code frontend (eslint)
	cd $(FRONTEND_DIR) && $(NPM) run lint

fmt: fmt-backend fmt-frontend ## Formate tout le code

fmt-backend: ## Formate le code backend (ruff)
	cd $(BACKEND_DIR) && $(UV) run ruff check --fix .
	cd $(BACKEND_DIR) && $(UV) run ruff format .

fmt-frontend: ## Formate le code frontend (prettier)
	cd $(FRONTEND_DIR) && $(NPM) run fmt

# === Base de données ===

migrate: ## Crée et applique une nouvelle migration Alembic
	cd $(BACKEND_DIR) && $(UV) run alembic revision --autogenerate -m "$(msg)"
	cd $(BACKEND_DIR) && $(UV) run alembic upgrade head

migrate-up: ## Applique les migrations en attente
	cd $(BACKEND_DIR) && $(UV) run alembic upgrade head

migrate-down: ## Rollback de la dernière migration
	cd $(BACKEND_DIR) && $(UV) run alembic downgrade -1

migrate-history: ## Affiche l'historique des migrations
	cd $(BACKEND_DIR) && $(UV) run alembic history

db-reset: ## Réinitialise la base de données (ATTENTION: supprime toutes les données!)
	rm -f data/homestock.db
	$(MAKE) migrate-up

# === Docker ===

docker-up: ## Démarre les conteneurs Docker
	docker compose up -d

docker-down: ## Arrête les conteneurs Docker
	docker compose down

docker-logs: ## Affiche les logs des conteneurs
	docker compose logs -f

docker-rebuild: ## Rebuild et redémarre les conteneurs
	docker compose up --build -d

docker-clean: ## Nettoie les conteneurs, volumes et images Docker
	docker compose down -v
	docker system prune -f

# === Nettoyage ===

clean: ## Nettoie les fichiers temporaires
	find . -type d -name "__pycache__" -exec rm -rf {} + 2>/dev/null || true
	find . -type d -name ".pytest_cache" -exec rm -rf {} + 2>/dev/null || true
	find . -type d -name ".ruff_cache" -exec rm -rf {} + 2>/dev/null || true
	find . -type d -name ".mypy_cache" -exec rm -rf {} + 2>/dev/null || true
	find . -type d -name "node_modules" -exec rm -rf {} + 2>/dev/null || true
	find . -type d -name "dist" -exec rm -rf {} + 2>/dev/null || true
	find . -type f -name "*.pyc" -delete
	rm -rf $(BACKEND_DIR)/htmlcov
	rm -rf $(FRONTEND_DIR)/coverage

clean-all: clean docker-clean ## Nettoie tout (fichiers + Docker)
	rm -rf data/homestock.db
	rm -rf uploads/*

# === Utilitaires ===

shell-backend: ## Ouvre un shell Python dans l'environnement backend
	cd $(BACKEND_DIR) && $(UV) run python

shell-db: ## Ouvre un shell SQLite sur la base de données
	sqlite3 data/homestock.db

check: lint test ## Vérifie la qualité du code (lint + tests)

init: install migrate-up ## Initialise le projet pour la première fois
	@echo "✅ Projet initialisé avec succès!"
	@echo "👉 Lancez 'make dev' pour démarrer le développement"
