.PHONY: generate generate-go verify-generate test test-short test-integration lint build

# renovate: datasource=docker depName=sqlc/sqlc
SQLC_VERSION := 1.31.1

# Local codegen. Containerised so a dev needs no sqlc install.
generate:
	docker run --rm -v "$(CURDIR):/src" -w /src sqlc/sqlc:$(SQLC_VERSION) generate

# Same codegen, run as a Go tool instead of a container. This is the CI path:
# the ci-go image already has Go, so it avoids docker-in-docker. Pinned to the
# SAME version as `generate` above so both routes emit identical output.
generate-go:
	go run github.com/sqlc-dev/sqlc/cmd/sqlc@v$(SQLC_VERSION) generate

# Fail if the committed generated code no longer matches the .sql sources.
#
# Nothing verified this before, so internal/db/dbq could silently drift from
# internal/db/queries — a hand-edit, a half-applied regen, or a schema change
# without a regen would all pass CI while the typed layer lied about the SQL.
#
# The diff is printed BEFORE the exit-code check on purpose: when this fails,
# the log then contains sqlc's exact expected output, which is what you commit.
verify-generate: generate-go
	git --no-pager diff -- internal/db/dbq
	git diff --quiet -- internal/db/dbq

test:
	go test -race ./...

test-short:
	go test -short -race ./...

# Full suite incl. integration tests, against the dedicated minstrel_test
# DB so a run never truncates the dev `minstrel` DB (Fable #339). Ensures
# the test DB exists (idempotent — createdb errors if present, ignored).
test-integration:
	docker compose up -d postgres
	-docker compose exec -T postgres createdb -U minstrel minstrel_test
	# -p 1: integration packages share one test DB and each TRUNCATEs it;
	# concurrent package binaries deadlock on TRUNCATE. Serialize packages.
	MINSTREL_TEST_DATABASE_URL=postgres://minstrel:minstrel@localhost:5432/minstrel_test?sslmode=disable go test -p 1 -race ./...

lint:
	golangci-lint run ./...

build:
	go build -o bin/minstrel ./cmd/minstrel
