# FLUID core — build, generation and conformance.
#
# The record types in internal/contract are generated from schemas/. Never edit
# them by hand: run `make generate`.

GO      ?= go
PYTHON  ?= python3
PKGS    := ./...

.PHONY: all
all: generate build vet test validate

.PHONY: generate
generate: ## Regenerate Go types from schemas/
	$(GO) run ./tools/schemagen
	gofmt -w internal/contract

.PHONY: build
build:
	$(GO) build $(PKGS)

.PHONY: vet
vet:
	$(GO) vet $(PKGS)

.PHONY: test
test: validate
	$(GO) test $(PKGS)

.PHONY: validate
validate: ## Validate spec-derived fixtures against the schemas
	$(PYTHON) conformance/validate_schemas.py

.PHONY: check-generated
check-generated: ## Fail if generated code is stale relative to schemas/
	@$(MAKE) --no-print-directory generate
	@if ! git diff --quiet -- internal/contract; then \
		echo "internal/contract is stale — run 'make generate' and commit the result"; \
		git --no-pager diff --stat -- internal/contract; \
		exit 1; \
	fi

.PHONY: conformance
conformance: ## Assert every conformance requirement and architectural invariant
	$(GO) test -count=1 ./conformance/...

.PHONY: clean
clean:
	rm -rf bin internal/contract/*.broken

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