NAME       := zabbix_mcp_server
PACKAGE    := zabbix-mcp-server
CHANGELOG  := ChangeLog

DIST_REVISION := ec1f990
REVISION   := $(DIST_REVISION)
ifeq ($(strip $(REVISION)),)
REVISION   := $(shell git rev-parse --short HEAD 2>/dev/null)
endif
ifeq ($(strip $(REVISION)),)
REVISION   := unknown
endif

VERSION    ?= $(shell sed -nE '1s/^Changes for ([0-9]+\.[0-9]+\.[0-9]+((alpha|beta|rc)[0-9]+)?)[[:space:]]*$$/\1/p' $(CHANGELOG) 2>/dev/null)
ifeq ($(strip $(VERSION)),)
VERSION    := unknown
endif

LDFLAGS    := -X main.version=$(VERSION) -X main.revision=$(REVISION)
GOFILES    := $(shell find . -name '*.go' -not -path './vendor/*')

PREFIX     ?= /usr/local
SYSCONFDIR ?= /etc/zabbix

DISTFILES = \
	ChangeLog \
	go.mod \
	go.sum \
	LICENSE \
	Makefile \
	README.md \
	zabbix_mcp_server.conf

DIST_SUBDIRS = \
	cmd \
	config \
	httpserver \
	mcpserver \
	zbxapi \
	vendor

.PHONY: all build clean distclean format style check tidy vendor install dist

all: build

build: $(NAME)

$(NAME): $(GOFILES) go.mod go.sum
	CGO_ENABLED=0 go build -trimpath -ldflags "$(LDFLAGS)" -o $(NAME) ./cmd/$(NAME)

clean:
	rm -f $(NAME)
	rm -rf $(PACKAGE)-*.tar.gz
	rm -rf $(PACKAGE)-*/

distclean: clean
	rm -rf vendor

format:
	gofmt -s -w $$(find . -name '*.go' -not -path './vendor/*')

style:
	golangci-lint run ./...

check:
	go test ./...

tidy:
	go mod tidy

vendor:
	go mod vendor

install: $(NAME)
	install -d $(DESTDIR)$(PREFIX)/sbin $(DESTDIR)$(SYSCONFDIR)
	install -m 0755 $(NAME) $(DESTDIR)$(PREFIX)/sbin/$(NAME)
	test -e $(DESTDIR)$(SYSCONFDIR)/$(NAME).conf || install -m 0644 $(NAME).conf $(DESTDIR)$(SYSCONFDIR)/$(NAME).conf

dist: SHELL := /bin/bash
dist:
ifneq ($(OS),Windows_NT)
	set -eu -o pipefail; \
	go mod vendor; \
	if ! [[ "$$(head -1 $(CHANGELOG))" =~ ^Changes[[:space:]]for[[:space:]]([0-9]+)\.([0-9]+)\.([0-9]+)((alpha|beta|rc)([0-9]+))?[[:space:]]*$$ ]]; then \
		echo "$(CHANGELOG): first line must be 'Changes for <major>.<minor>.<patch>[alpha|beta|rc<num>]'" >&2; \
		exit 1; \
	fi; \
	major_version=$${BASH_REMATCH[1]}; \
	minor_version=$${BASH_REMATCH[2]}; \
	patch_version=$${BASH_REMATCH[3]}; \
	alphatag=$${BASH_REMATCH[4]}; \
	distdir="$(PACKAGE)-$${major_version}.$${minor_version}.$${patch_version}$${alphatag}"; \
	if [[ "$${distdir}" != "$(PACKAGE)-$(VERSION)" ]]; then \
		echo "$(CHANGELOG): archive name \"$${distdir}\" disagrees with VERSION \"$(VERSION)\"" >&2; \
		exit 1; \
	fi; \
	dist_archive="$${distdir}.tar.gz"; \
	trap 'rm -rf "./$${distdir:?}" "./$${dist_archive:?}.tmp"' ERR INT TERM; \
	rm -rf "./$${distdir}"; \
	mkdir -p "./$${distdir}"; \
	for distfile in $(DISTFILES); do \
		cp -fp "./$${distfile}" "./$${distdir}/"; \
	done; \
	for subdir in $(DIST_SUBDIRS); do \
		cp -fpR "./$${subdir}" "./$${distdir}"; \
	done; \
	revision=$$(git rev-parse --short HEAD 2>/dev/null || true); \
	if [[ -z "$${revision}" ]]; then \
		echo "error of git revision: not a Git working copy" >&2; \
		exit 1; \
	fi; \
	sed "s/^DIST_REVISION :=.*/DIST_REVISION := $${revision}/" "./$${distdir}/Makefile" > "./$${distdir}/Makefile.new"; \
	mv "./$${distdir}/Makefile.new" "./$${distdir}/Makefile"; \
	if ! grep -q "^DIST_REVISION := $${revision}$$" "./$${distdir}/Makefile"; then \
		echo "failed to set DIST_REVISION in $${distdir}/Makefile" >&2; \
		exit 1; \
	fi; \
	tar -czf "./$${dist_archive}.tmp" "./$${distdir}"; \
	mv "./$${dist_archive}.tmp" "./$${dist_archive}"; \
	rm -rf "./$${distdir}"; \
	echo "created $${dist_archive} (revision $${revision})"
else
	@echo "make dist is not supported on Windows" >&2; exit 1
endif
