# Makefile — Public V7 / Concordia
#
# Runtime = docker compose (alvos finos, sem mágica). Validação = `make check` (caminho único;
# `E2E=1` liga o pesado). Provisionamento do ambiente (migrate, assets, seed demo, SBOM) é
# pré-condição do `check`, não de `up`.
#
# Regra do dono: `make check` é o epicentro — nada valida fora dele.

.DEFAULT_GOAL := help
SHELL := /bin/bash
# Runtime resolvido em UM lugar (docker | podman) — `CONTAINER_RUNTIME` do `.env` decide.
# No podman, `tools/runtime.sh` acrescenta `docker-compose.podman.yml` (userns keep-id +
# label=disable) e exporta `MOUNT_LABEL=`; no Docker nada muda.
CONTAINER_ENGINE := $(shell bash tools/runtime.sh --engine)
COMPOSE_FILES := $(shell bash tools/runtime.sh --files)
COMPOSE := $(CONTAINER_ENGINE) compose -p $(shell bash tools/project-name.sh 2>/dev/null) --env-file .env $(COMPOSE_FILES)

.PHONY: help check up down destroy ps logs build shell exec reload optimize reset deploy env ports runtime podman-prepare

help: ## Lista os alvos disponíveis
	@grep -hE '^[a-zA-Z0-9\\:_-]+:.*?## ' $(MAKEFILE_LIST) \
		| awk -F'## ' '{name=$$1; gsub(/\\/,"",name); sub(/:[[:space:]]*$$/,"",name); printf "  %-16s %s\n", name, $$2}'

# ── Validação (caminho dourado) ───────────────────────────────────────────────────────
# Pré-condições → estilo/docs → estático/arquitetura → audit+SBOM → testes/cobertura → a11y.
# `E2E=1` (ou `ARGS=--e2e`) liga e2e Playwright + axe + perf. Env: CHECK_QUIET · CHECK_ASSETS ·
# CHECK_FORCE_PREP · CHECK_LOGDIR · BASE_URL · E2E_WORKERS · COVERAGE_WORKERS · SNIFF_A11Y_STRICT.
check: ## Validação completa (rápida; E2E=1 inclui Playwright/axe/perf) — o caminho dourado
	@tools/check.sh $(ARGS) $(if $(filter 1,$(E2E)),--e2e,)

# ── Ambiente (portas por instância, runtime) ──────────────────────────────────────────
env: ## Garante .env, porta determinística da cópia e APP_URL coerente (INSTANCE=1 isola a stack)
	@bash tools/dev-env.sh $(if $(filter 1,$(INSTANCE)),--instance,)

ports: ## Mostra runtime, projeto, porta/URL e diretórios resolvidos
	@bash tools/dev-env.sh --print

runtime: ## Troca o runtime (padrão docker; podman = opt-in de dev — ADR-045)
	@test -n "$(RUNTIME)" || { echo "Uso: make runtime RUNTIME=podman|docker"; exit 2; }
	@bash tools/dev-env.sh --runtime=$(RUNTIME)

podman-prepare: ## Prepara o host para o caminho OPCIONAL de dev (podman rootless — ADR-045)
	@bash tools/podman-prepare.sh $(ARGS)

# ── Runtime (`$(CONTAINER_ENGINE) compose`) ───────────────────────────────────────────
up: ## Backup → build → down/up → optimize (dev; NO_CACHE=1 p/ build limpo; NÃO roda check)
	@NO_CACHE=$(NO_CACHE) tools/up-dev.sh

down: ## Derruba os serviços (mantém volumes)
	$(COMPOSE) down --remove-orphans

destroy: ## DESTRUTIVO: apaga containers, volumes, redes, imagens locais e dados (DATA_PATH)
	$(COMPOSE) down --volumes --remove-orphans --rmi local
	@data="$$(grep -E '^DATA_PATH=' .env 2>/dev/null | tail -1 | cut -d= -f2- | tr -d '\"'"'"' ')"; \
	 data="$${data:-./s3-local}"; \
		if [ -e "$$data" ]; then \
			mkdir -p .pi/trash; \
			dest=".pi/trash/destroy-$$(date -u +%Y%m%dT%H%M%SZ)-$$(basename "$$data")"; \
			mv "$$data" "$$dest"; \
			echo "destroy: $$data → $$dest (apague quando não precisar mais)"; \
		fi; \
		bash tools/data-dirs.sh "$$data"

ps: ## Estado dos serviços
	$(COMPOSE) ps

logs: ## Loga um serviço (S=web)
	$(COMPOSE) logs -f --tail=100 $(S)

build: ## Constrói a imagem do runtime (php-fpm; o queue reusa a mesma — ADR-031)
	$(COMPOSE) build php-fpm

shell: ## Shell dentro do container php-fpm
	$(COMPOSE) exec php-fpm bash

exec: ## Roda um comando no container (cmd='php artisan about')
	$(COMPOSE) exec -T php-fpm $(cmd)

reload: ## Recarrega o php-fpm (limpa o OPcache — ADR-008)
	$(COMPOSE) exec -T php-fpm sh -c 'kill -USR2 1'

optimize: ## Limpa e aplica todos os caches (config/rotas/views/eventos + módulos)
	$(COMPOSE) exec -T php-fpm sh -c 'php artisan optimize:clear && php artisan core:cache-modules && php artisan optimize'

reset: ## DESTRUTIVO: recria o banco (drop/create) + seeds demo e recarrega o FPM
	$(COMPOSE) exec -T postgres sh -c 'dropdb -U "$$POSTGRES_USER" --force "$$POSTGRES_DB" && createdb -U "$$POSTGRES_USER" "$$POSTGRES_DB"'
	$(COMPOSE) exec -T php-fpm php artisan migrate --force --seed
	$(COMPOSE) exec -T php-fpm sh -c 'kill -USR2 1'

# ── Scaffolding (Stubs canônicos — ADR-014/015) ───────────────────────────────────────
create\:module: ## Cria módulo e migra (MODULE=Grupo/Modulo)
	@test -n "$(MODULE)" || { echo "Uso: make create:module MODULE=Grupo/Modulo"; exit 2; }
	$(COMPOSE) exec -T php-fpm php artisan make:module "$(MODULE)" --register
	$(COMPOSE) exec -T php-fpm php artisan migrate --force

create\:service: ## Cria a estrutura base de um serviço (SERVICE=Nome)
	@test -n "$(SERVICE)" || { echo "Uso: make create:service SERVICE=Nome"; exit 2; }
	$(COMPOSE) exec -T php-fpm php artisan make:service "$(SERVICE)"

# ── Deploy (spec 17) ──────────────────────────────────────────────────────────────────
deploy: ## Deploy de produção; `ARGS` repassa flags (ex.: ARGS=--dry-run)
	@./up_prod.sh $(ARGS)
