.PHONY: all check test lint fmt fmt-check build clean deps test-coverage test-integration install release release-snapshot docker hooks

# Version number
VERSION := 0.1.0-dev

# Default target
all: bsdaily

# Combined pre-commit/CI gate: lint, format check, then tests.
check: lint fmt-check test

# Run tests only.
test:
	go test -race -timeout 30s ./...

# Check if code is formatted (read-only).
fmt-check:
	@test -z "$$(gofmt -l .)" || (echo "Files not formatted:" && gofmt -l . && exit 1)

# Format code.
fmt:
	go fmt ./...

# Run linter only.
lint:
	golangci-lint run ./...

# Build binary (pure Go; no CGO required since we use modernc.org/sqlite).
bsdaily: internal/*/*.go cmd/bsdaily/*.go
	CGO_ENABLED=0 go build -o $@ ./cmd/bsdaily

# Clean build artifacts.
clean:
	rm -f bsdaily
	go clean

# Install dependencies.
deps:
	go mod download
	go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest

# Run tests with coverage.
test-coverage:
	go test -v -coverprofile=coverage.out ./...
	go tool cover -html=coverage.out -o coverage.html

# Run integration tests.
test-integration:
	go test -v -tags=integration ./...

install: bsdaily
	cp ./bsdaily $(HOME)/bin/

# Build and publish release artifacts via goreleaser.
release:
	goreleaser release --clean

# Dry-run a release build without publishing or tagging.
release-snapshot:
	goreleaser release --clean --snapshot

# Build Docker image.
docker:
	docker build -t bsdaily .

# Install pre-commit hook.
hooks:
	@printf '#!/bin/sh\nset -e\n' > .git/hooks/pre-commit
	@printf 'go mod tidy\ngo fmt ./...\ngit diff --exit-code -- go.mod go.sum || { echo "go mod tidy changed files; please stage and retry"; exit 1; }\n' >> .git/hooks/pre-commit
	@printf 'make check\n' >> .git/hooks/pre-commit
	@chmod +x .git/hooks/pre-commit
