GO ?= go
EXECUTABLE := gitea-mcp
VERSION ?= $(shell git describe --tags --always | sed 's/-/+/' | sed 's/^v//')
LDFLAGS := -X "main.Version=$(VERSION)"

GOLANGCI_LINT_PACKAGE ?= github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.10.1
GOVULNCHECK_PACKAGE ?= golang.org/x/vuln/cmd/govulncheck@v1
GOFUMPT_PACKAGE ?= mvdan.cc/gofumpt@v0.9.2

.PHONY: help
help: ## Print this help message.
	@echo "Usage: make [target]"
	@echo ""
	@echo "Targets:"
	@echo ""
	@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'

.PHONY: install
install: build ## Install the application.
	@echo "Installing $(EXECUTABLE)..."
	@mkdir -p $(GOPATH)/bin
	@cp $(EXECUTABLE) $(GOPATH)/bin/$(EXECUTABLE)
	@echo "Installed $(EXECUTABLE) to $(GOPATH)/bin/$(EXECUTABLE)"
	@echo "Please add $(GOPATH)/bin to your PATH if it is not already there."

.PHONY: uninstall
uninstall: ## Uninstall the application.
	@echo "Uninstalling $(EXECUTABLE)..."
	@rm -f $(GOPATH)/bin/$(EXECUTABLE)
	@echo "Uninstalled $(EXECUTABLE) from $(GOPATH)/bin/$(EXECUTABLE)"

.PHONY: clean
clean: ## Clean the build artifacts.
	@echo "Cleaning up build artifacts..."
	@rm -f $(EXECUTABLE)
	@echo "Cleaned up $(EXECUTABLE)"

.PHONY: build
build: ## Build the application.
	$(GO) build -v -ldflags '-s -w $(LDFLAGS)' -o $(EXECUTABLE)

.PHONY: air
air: ## Install air for hot reload.
	@hash air > /dev/null 2>&1; if [ $$? -ne 0 ]; then \
		$(GO) install github.com/air-verse/air@latest; \
	fi

.PHONY: dev
dev: air ## run the application with hot reload
	air --build.cmd "make build" --build.bin ./gitea-mcp

.PHONY: lint
lint: lint-go ## lint everything

.PHONY: lint-fix
lint-fix: lint-go-fix ## lint everything and fix issues

.PHONY: lint-go
lint-go: ## lint go files
	$(GO) run $(GOLANGCI_LINT_PACKAGE) run

.PHONY: lint-go-fix
lint-go-fix: ## lint go files and fix issues
	$(GO) run $(GOLANGCI_LINT_PACKAGE) run --fix

.PHONY: security-check
security-check: ## run security check
	$(GO) run $(GOVULNCHECK_PACKAGE) -show color ./... || true

.PHONY: tidy
tidy: ## run go mod tidy
	$(eval MIN_GO_VERSION := $(shell grep -Eo '^go\s+[0-9]+\.[0-9.]+' go.mod | cut -d' ' -f2))
	$(GO) mod tidy -compat=$(MIN_GO_VERSION)

.PHONY: vendor
vendor: tidy ## tidy and verify module dependencies
	$(GO) mod verify
