.PHONY: test fmt lint build clean all

# Version number
VERSION := 0.0.1

# Build variables
GIT_REVISION := $(shell git rev-parse HEAD 2>/dev/null || echo "unknown")

# Linker flags
LDFLAGS := -X 'git.eeqj.de/sneak/vaultik/internal/globals.Version=$(VERSION)' \
           -X 'git.eeqj.de/sneak/vaultik/internal/globals.Commit=$(GIT_REVISION)'

# Default target
all: vaultik

# Run tests
test: lint fmt-check
	@echo "Running tests..."
	@if ! go test -v -timeout 10s ./... 2>&1; then \
		echo ""; \
		echo "TEST FAILURES DETECTED"; \
		echo "Run 'go test -v ./internal/database' to see database test details"; \
		exit 1; \
	fi

# Check if code is formatted
fmt-check:
	@if [ -n "$$(go fmt ./...)" ]; then \
		echo "Error: Code is not formatted. Run 'make fmt' to fix."; \
		exit 1; \
	fi

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

# Run linter
lint:
	golangci-lint run

# Build binary
vaultik: internal/*/*.go cmd/vaultik/*.go
	go build -ldflags "$(LDFLAGS)" -o $@ ./cmd/vaultik

# Clean build artifacts
clean:
	rm -f vaultik
	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 ./...

local:
	VAULTIK_CONFIG=$(HOME)/etc/vaultik/config.yml ./vaultik snapshot --debug list 2>&1
	VAULTIK_CONFIG=$(HOME)/etc/vaultik/config.yml ./vaultik snapshot --debug create 2>&1

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