# =============================================================================
# Makefile — workflow host/container condiviso (vedi CLAUDE.md §Workflow).
# Regola d'oro: chi scrive file lo fa come utente host (beppe). Mai mischiare
# node_modules musl(container) e glibc(host).
#   - composer / npm  -> HOST
#   - artisan con servizi -> container MA come UID host (file beppe-owned)
# =============================================================================

UID  := $(shell id -u)
GID  := $(shell id -g)
DC   := docker compose
EXEC := $(DC) exec -u $(UID):$(GID) backend

.DEFAULT_GOAL := help
.PHONY: help up down build logs composer be-install be-update artisan migrate import tinker test fe-install fe-add fe-rebuild fe-dev fe-build fe-lint-css fe-lint-css-fix permissions

help: ## Mostra questo aiuto
	@grep -hE '^[a-zA-Z_-]+:.*?## ' $(MAKEFILE_LIST) | awk 'BEGIN{FS=":.*?## "}{printf "  \033[36m%-14s\033[0m %s\n",$$1,$$2}'

## --- Stack ---
up: ## Avvia l'intero stack dev: Vite HMR + backend(serve) + db + redis + docs + mailpit
	$(DC) up -d
down: ## Ferma lo stack
	$(DC) down
build: ## Ricostruisce le immagini (con --pull per base aggiornate)
	$(DC) build --pull
logs: ## Segue i log del backend
	$(DC) logs -f backend

## --- Backend / PHP (composer sull'HOST) ---
composer: ## composer host (es: make composer c="require foo/bar")
	composer -d backend $(c)
be-install: ## composer install (host)
	composer -d backend install
be-update: ## composer update (host)
	composer -d backend update
artisan: ## artisan nel container come utente host (es: make artisan c="migrate --seed")
	$(EXEC) php artisan $(c)
migrate: ## php artisan migrate (container)
	$(EXEC) php artisan migrate
import: ## ETL da v1 (container)
	$(EXEC) php artisan v1:import
tinker: ## REPL artisan (container)
	$(EXEC) php artisan tinker
test: ## Suite di test sul DB dedicato db-test (es: make test c="--filter=AuthTest")
	# Le -e iniettano VERE env nel processo di test → finiscono in $$_SERVER, che
	# l'env() di Laravel legge per primo. Così vincono sul container (DB_HOST=db,
	# DB_DATABASE=dyncoll) SENZA dipendere dai force di phpunit.xml. DB_HOST=db-test
	# = isolamento fisico: la suite non può nemmeno raggiungere il db di sviluppo.
	$(DC) exec -u $(UID):$(GID) \
		-e APP_ENV=testing \
		-e DB_HOST=db-test \
		-e DB_DATABASE=dyncoll_test \
		-e CACHE_STORE=array \
		-e SESSION_DRIVER=array \
		-e QUEUE_CONNECTION=sync \
		-e MAIL_MAILER=array \
		backend php artisan test $(c)

## --- Frontend / Node ---
# In dev Vite gira NEL container (make up): HMR via bind-mount, node_modules musl
# nel volume anonimo. npm gira sull'HOST (package.json/lock + node_modules host per
# il type-check dell'IDE); poi si rigenera immagine + volume node_modules del container.
# AGGIUNGERE UNA LIBRERIA:   make fe-add p="leaflet"   &&   make fe-rebuild
fe-install: ## npm install host da package.json (package-lock + node_modules host per l'IDE)
	cd frontend && npm install
fe-add: ## Aggiunge una dipendenza (host) — es: make fe-add p="leaflet"  oppure  p="-D nome"; poi make fe-rebuild
	cd frontend && npm install $(p)
fe-rebuild: ## Rigenera immagine frontend E il volume node_modules del container (dopo modifiche a package.json)
	$(DC) up -d --build --renew-anon-volumes frontend
fe-dev: ## ALTERNATIVA: vite dev server su host senza Docker (conflitto porta 5173 se lo stack è su)
	cd frontend && npm run dev
fe-build: ## build di produzione su host (smoke test locale)
	cd frontend && npm run build
fe-lint-css: ## Stylelint (check) nel container — gira anche nel pre-commit
	$(DC) exec -T frontend npm run lint:css
fe-lint-css-fix: ## Stylelint con --fix (container come UID host: scrive sul bind-mount)
	$(DC) exec -u $(UID):$(GID) -T frontend npm run lint:css:fix
## --- Manutenzione ---
permissions: ## Permessi storage scrivibili da php-fpm (www-data) — richiede sudo, una tantum
	sudo chgrp -R www-data backend/storage backend/bootstrap/cache
	sudo chmod -R g+ws backend/storage backend/bootstrap/cache
