# Canonical task runner. Mirrors .github/workflows/ci.yml so `make verify`
# reproduces the PR gate locally. Run `make help` for the list.

SHELL := bash
GO_PKGS = $(shell go list ./... | grep -v '/frontend/node_modules/')
FRONTEND = frontend

.DEFAULT_GOAL := help

.PHONY: help
help: ## Show this help
	@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | \
		awk 'BEGIN {FS = ":.*?## "}; {printf "  %-14s %s\n", $$1, $$2}'

# go:embed of internal/web/dist needs the dir to exist even when the
# frontend bundle has not been built. CI stubs it the same way.
.PHONY: dist-stub
dist-stub:
	@mkdir -p internal/web/dist && touch internal/web/dist/.gitkeep

.PHONY: gen
gen: ## Regenerate Zod schemas + OpenAPI from Go sources
	cd $(FRONTEND) && npm run gen

.PHONY: gen-check
gen-check: gen ## Fail if generated files are stale
	git diff --exit-code -- frontend/src/generated frontend/public/openapi.json

.PHONY: lint-go
lint-go: dist-stub ## golangci-lint on Go sources
	golangci-lint run

.PHONY: lint-fe
lint-fe: ## ESLint on frontend sources
	cd $(FRONTEND) && npm run lint

.PHONY: lint
lint: lint-go lint-fe ## All linters

.PHONY: typecheck
typecheck: ## tsc --noEmit
	cd $(FRONTEND) && npm run typecheck

.PHONY: test-go
test-go: dist-stub ## Go tests (shuffle, no cache)
	go test -shuffle=on -count=1 $(GO_PKGS)

.PHONY: race
race: dist-stub ## Go tests with the race detector (needs a C compiler)
	go test -race -shuffle=on -count=1 $(GO_PKGS)

.PHONY: test-fe
test-fe: ## Frontend tests (vitest)
	cd $(FRONTEND) && npm test

.PHONY: test
test: test-go test-fe ## All tests

.PHONY: vulncheck
vulncheck: dist-stub ## govulncheck
	go run golang.org/x/vuln/cmd/govulncheck@latest ./...

.PHONY: build-fe
build-fe: ## Build the Vite bundles into internal/web/dist
	cd $(FRONTEND) && npm run build

.PHONY: build
build: build-fe ## Build the frontend then the Go binary
	go build ./...

.PHONY: build-storybook
build-storybook: ## Build the static Storybook (compile-checks all stories)
	cd $(FRONTEND) && npm run build-storybook

# The PR gate. Matches ci.yml: codegen freshness, both linters, typecheck,
# both test suites, a full build, and the Storybook compile-check.
.PHONY: verify
verify: gen-check lint typecheck test build build-storybook ## Full local gate (mirrors CI)
	@echo "verify: OK"
