.PHONY: help up fix-uploads down logs install db-create db-migrate db-diff db-fixtures test-db-create test-db-drop test-db-migrate test-db-reset npm-install build watch dev-server cache-clear test test-unit test-all test-coverage phpstan cs-check cs-fix lint-js lint-js-fix lint

help:
	@echo "Commandes disponibles:"
	@echo "  make up            - Démarrer les conteneurs"
	@echo "  make start         - Démarrer les conteneurs"
	@echo "  make fix-uploads   - Donner public/uploads (volume Docker créé en root) à l'utilisateur du conteneur php"
	@echo "  make down          - Arrêter les conteneurs"
	@echo "  make stop          - Arrêter les conteneurs"
	@echo "  make restart       - Restart les conteneurs"
	@echo "  make logs          - Voir les logs"
	@echo "  make install       - Installation complète du projet"
	@echo "  make db-create     - Créer la base de données"
	@echo "  make db-diff       - Génère une migration de différence entre les entités et la base de données"
	@echo "  make db-migrate    - Exécuter les migrations"
	@echo "  make db-fixtures   - Charger les fixtures"
	@echo "  make test-db-create    - Créer la base de données de test (cms_db_test)"
	@echo "  make test-db-drop      - Supprimer la base de données de test"
	@echo "  make test-db-migrate   - Exécuter les migrations sur la DB de test"
	@echo "  make test-db-reset     - Reset complet de la DB de test (drop + create + migrate)"
	@echo "  make npm-install   - Installer les dépendances Node"
	@echo "  make build         - Builder les assets (production)"
	@echo "  make watch         - Compiler les assets en mode dev avec watch"
	@echo "  make dev-server    - Démarrer le webpack dev server avec hot reload"
	@echo "  make cache-clear   - Vider le cache"
	@echo "  make cc 			- Fait appel à cache-clear"
	@echo "  make test          - Lancer les tests unitaires (alias de test-unit)"
	@echo "  make test-unit     - Lancer les tests unitaires"
	@echo "  make test-all      - Lancer tous les tests (Unit + Integration + Functional)"
	@echo "  make test-coverage - Lancer les tests avec couverture de code (nécessite xdebug)"
	@echo "  make phpstan       - Analyse statique PHP (PHPStan)"
	@echo "  make cs-check      - Vérifier le style de code PHP (dry-run)"
	@echo "  make cs-fix        - Corriger le style de code PHP"
	@echo "  make lint-js       - Linter le code TypeScript (ESLint)"
	@echo "  make lint-js-fix   - Corriger le code TypeScript (ESLint --fix)"
	@echo "  make lint          - Lancer tous les linters (PHPStan + CS check + ESLint)"
	@echo "  make quality       - "
	@echo "  make	quality-fix   - "

up:
	docker compose up -d
	$(MAKE) fix-uploads

# Le volume nommé public_uploads est créé en root par Docker : sans ça, PHP (uid du conteneur) ne peut
# pas écrire et l'upload de médias répond 500. Idempotent, lancé à chaque `make up`.
fix-uploads:
	docker compose exec -u root php chown -R "$$(docker compose exec -T php id -u):$$(docker compose exec -T php id -g)" public/uploads

down:
	docker compose down

start: up
stop: down
restart: down up

logs:
	docker compose logs -f

install: up
	docker compose exec php composer install
	$(MAKE) db-create
	$(MAKE) db-migrate
	$(MAKE) db-fixtures
	$(MAKE) npm-install
	$(MAKE) build

db-create:
	docker compose exec php php bin/console doctrine:database:create

db-migrate:
	docker compose exec php php bin/console doctrine:migrations:migrate --no-interaction

db-diff:
	docker compose exec php php bin/console doctrine:migrations:diff

db-fixtures:
	docker compose exec php php bin/console doctrine:fixtures:load --no-interaction

# ─── TEST DATABASE ───────────────────────────────────────────────
test-db-create:
	docker compose exec -T php php bin/console --env=test doctrine:database:create --if-not-exists

test-db-drop:
	docker compose exec -T php php bin/console --env=test doctrine:database:drop --force --if-exists

test-db-migrate:
	docker compose exec -T php php bin/console --env=test doctrine:migrations:migrate --no-interaction

test-db-reset: test-db-drop test-db-create test-db-migrate
	@echo "✅ Base de données de test réinitialisée (cms_db_test)"

# ─── NPM/ASSETS ──────────────────────────────────────────────────
npm-install:
	docker compose exec node npm install

npm-audit-fix:
	docker compose exec node npm audit fix

build:
	docker compose exec -T node npm run build

build-front: build

watch:
	docker compose exec node npm run watch

dev-server:
	docker compose exec node npm run dev-server

cache-clear:
	docker compose exec php php bin/console cache:clear

cc: cache-clear

# ─── TESTS ───────────────────────────────────────────────────
test: test-unit

test-unit:
	@echo "🧪 Lancement des tests unitaires..."
	docker compose exec -T php vendor/bin/phpunit --testsuite=Unit --colors=always

test-coverage:
	@echo "🧪 Lancement des tests avec couverture de code..."
	@echo "⚠️  Note: xdebug ou pcov doit être installé dans le conteneur PHP pour la couverture"
	docker compose exec -T php vendor/bin/phpunit --coverage-html=coverage/html --coverage-text
	@echo "📊 Rapport de couverture généré dans coverage/html/index.html"

test-all:
	@echo "🧪 Lancement de tous les tests (Unit + Integration + Functional)..."
	docker compose exec -T php vendor/bin/phpunit --colors=always

# ─── QUALITY / LINT ────────────────────────────────────────────
phpstan:
	docker compose exec -T php vendor/bin/phpstan analyse -c phpstan.dist.neon --memory-limit=512M

cs-check:
	docker compose exec -T php vendor/bin/php-cs-fixer fix --dry-run --diff

cs-fix:
	docker compose exec -T php vendor/bin/php-cs-fixer fix

lint-js:
	docker compose exec -T node npm run lint

lint-js-fix:
	docker compose exec -T node npm run lint:fix

lint: phpstan cs-check lint-js

quality: phpstan cs-check lint-js

quality-fix: cs-fix lint-js-fix