set dotenv-load

# Build and run the unit tests
all: build test

# Generate templ components (version pinned in go.mod)
templ-build:
	@echo "Building templ..."
	@go tool templ generate

sqlc-generate:
	@echo "Generating sqlc code..."
	@sqlc generate

migrate-create name:
	@migrate create -ext sql -dir internal/db/migrations -seq {{name}}

# Generate OpenAPI docs (version pinned in go.mod)
swag-generate:
	@echo "Generating OpenAPI docs..."
	@go tool swag init -g internal/server/routes.go -o cmd/docs --parseInternal

build: sqlc-generate templ-build swag-generate
	@echo "Building..."
	@go build -o main cmd/main.go

run: templ-build
	@go run cmd/main.go

build-run: build
	@./main

# Unit tests: no database or Docker needed
test:
	@go test -race ./...

# Integration tests against PostgreSQL in Docker (testcontainers), using the active docker context.
# Pass a pattern to run a subset, e.g. `just test-integration TestSQLDumps`
test-integration pattern=".":
	@DOCKER_HOST="${DOCKER_HOST:-$(docker context inspect --format '{{{{.Endpoints.docker.Host}}')}" \
		go test -tags integration -race -timeout 15m -run '{{pattern}}' ./...

clean:
	@echo "Cleaning..."
	@rm -f main

docker-build:
	@docker build -t music-server .

docker-run:
	@docker compose up --build

docker-down:
	@docker compose down

watch-templ:
	@go tool templ generate --watch --proxy="http://localhost:8080" --cmd="go run ./cmd"

# Live reload
watch:
	@if ! command -v air > /dev/null; then \
		echo "air is not installed. Install it with: go install github.com/air-verse/air@latest"; \
		exit 1; \
	fi
	@air
