.PHONY: bootstrap setup check lint test fmt fmt-check build clean docker docker-versioned docker-test devserver devserver-stop hooks

VERSION := $(shell git describe --tags --always --dirty 2>/dev/null || echo "dev")
LDFLAGS := -X main.Version=$(VERSION)

# Use nix-shell to provide CGO dependencies unless they are already available
# (e.g. inside a Docker build or an existing nix-shell).
HAS_PKGCONFIG := $(shell command -v pkg-config 2>/dev/null)
ifdef HAS_PKGCONFIG
  NIX_RUN_PREFIX =
  NIX_RUN_SUFFIX =
else
  NIX_RUN_PREFIX = nix-shell -p pkg-config vips libheif golangci-lint git --run '
  NIX_RUN_SUFFIX = '
endif

# Default target: run all checks
check:
	@script/check

bootstrap:
	@script/bootstrap

setup:
	@script/setup

# Check formatting without modifying files
fmt-check:
	@script/fmt-check

# Format code
fmt:
	@script/fmt

# Run linter
lint:
	@script/lint

# Run tests (30-second timeout)
test:
	@script/test

# Build the binary
build:
	@echo "Building pixad..."
	$(NIX_RUN_PREFIX)CGO_ENABLED=1 go build -ldflags "$(LDFLAGS)" -o ./bin/pixad ./cmd/pixad$(NIX_RUN_SUFFIX)

# Clean build artifacts
clean:
	rm -rf bin/
	rm -rf ./data

# Build Docker image (tagged via script/projectname)
docker:
	@script/docker

# Build Docker image tagged pixad:$(VERSION) and pixad:latest
docker-versioned:
	docker build --build-arg VERSION=$(VERSION) -t pixad:$(VERSION) -t pixad:latest .

# Run tests in Docker (needed for CGO/libvips)
docker-test:
	docker build --target builder --build-arg VERSION=$(VERSION) -t pixad-builder .
	docker run --rm pixad-builder sh -c "CGO_ENABLED=1 GOTOOLCHAIN=auto go test -v ./..."

# Run local dev server in Docker
devserver: docker-versioned devserver-stop
	docker run -d --name pixad-dev -p 8080:8080 \
		-v $(CURDIR)/config.dev.yml:/etc/pixa/config.yml:ro \
		pixad:latest
	@echo "pixad running at http://localhost:8080"

# Stop dev server
devserver-stop:
	-docker stop pixad-dev 2>/dev/null
	-docker rm pixad-dev 2>/dev/null

# Install pre-commit hook
hooks:
	@script/install-precommit
