.PHONY: check check-csng-grpc-alert-rules check-drive9-alert-rules check-mnemos-alert-rules check-nextgen-tidb-alert-rules check-nextgen-tiflash-alert-rules

all: format check-pulumi check-rules

check: check-rules

check-rules: promruval o11y-rules check-csng-grpc-alert-rules check-drive9-alert-rules check-mnemos-alert-rules check-nextgen-tidb-alert-rules check-nextgen-tiflash-alert-rules
	@echo "🔍 Validating all rules with promruval..."
	@echo ""
	@echo "📁 Validating Loki rules..."
	@find rules/logging -name '*.yaml' -exec $(PROMRUVAL) validate --config-file rules/validation-general.yml --config-file rules/logging/validation.yml --support-loki {} +
	@echo ""
	@echo "📁 Validating Prometheus rules..."
	@for d in $$(find rules -mindepth 1 -maxdepth 1 -type d ! -name "logging"); do \
		find "$$d" -name '*.yaml' -exec $(PROMRUVAL) validate --config-file rules/validation-general.yml --config-file rules/validation-promql.yml {} + || exit $$?; \
	done
	@echo ""
	@echo "🔍 Checking for duplicate rule group names in generated rules..."
	@./scripts/check-rule-group-names.sh newrules/prod
	@echo "🎉 All rule validations completed successfully!"

check-drive9-alert-rules: promtool
	@echo "🔧 Testing Drive9 alert rules with promtool..."
	@$(PROMTOOL) test rules tests/drive9-alerts.test.yaml tests/drive9-kimi-alerts.test.yaml

check-csng-grpc-alert-rules: promtool
	@echo "🔧 Testing CSNG gRPC alert rules with promtool..."
	@$(PROMTOOL) test rules tests/csng-grpc-alerts.test.yaml

.PHONY: check-nextgen-alert-selectors
check-rules: check-nextgen-alert-selectors
check-nextgen-alert-selectors: promtool
	@echo "🔧 Testing NextGen alert selectors with promtool..."
	@$(PROMTOOL) test rules tests/nextgen-alert-selectors.test.yaml

check-mnemos-alert-rules: promtool
	@echo "🔧 Testing Mnemos alert rules with promtool..."
	@$(PROMTOOL) test rules tests/mnemos-alerts.test.yaml

check-nextgen-tidb-alert-rules: promtool
	@echo "🔧 Testing NextGen TiDB alert rules with promtool..."
	@$(PROMTOOL) test rules tests/nextgen-tidb-oom-alerts.test.yaml

.PHONY: check-nextgen-component-oom-alert-rules
check-rules: check-nextgen-component-oom-alert-rules
check-nextgen-component-oom-alert-rules: promtool
	@echo "🔧 Testing NextGen component OOM alert rules with promtool..."
	@$(PROMTOOL) test rules tests/nextgen-component-oom-alerts.test.yaml

check-nextgen-tiflash-alert-rules: promtool
	@echo "🔧 Testing NextGen TiFlash alert rules with promtool..."
	@$(PROMTOOL) test rules tests/nextgen-tiflash-oom-alerts.test.yaml

# deprecated
check-rules-promtool: promtool o11y-rules
	@echo "🔧 group duplicate validation with promtool (Prometheus rules only)..."
	@set -e; \
	for file in $$(find newrules/prod -name "*.yaml" -not -path "*logging/*"); do \
		echo "Checking: $$file"; \
		$(PROMTOOL) check rules "$$file"; \
	done

check-rules-all: check-rules
	@echo "✅ All rule validations completed"

format:
	npm run fmt

base:
	helm template ./charts/base --set stack=sre-bot/eks/dev-base-us-west-2

seed:
	helm template ./charts/seed -x ./templates/seed-rules.yaml --set stack=sre-bot/eks/dev-seed-us-west-2

shoot:
	helm template ./charts/seed -x ./templates/shoot-rules.yaml --set stack=sre-bot/eks/dev-seed-us-west-2

o11y-rules:
	./scripts/render.sh $(STACK)

LOCALBIN ?= $(shell pwd)/bin
$(LOCALBIN):
	mkdir -p $(LOCALBIN)

SYSTEM_PROMTOOL := $(shell command -v promtool 2>/dev/null)
ifeq ($(origin PROMTOOL), undefined)
ifneq ($(SYSTEM_PROMTOOL),)
PROMTOOL := $(SYSTEM_PROMTOOL)
else
PROMTOOL := $(LOCALBIN)/promtool
endif
endif
PROMTOOL_VERSION ?= 2.55.0
PROMTOOL_OS ?= $(shell uname -s | tr '[:upper:]' '[:lower:]')
PROMTOOL_GOARCH ?= $(shell uname -m | sed -e 's/x86_64/amd64/' -e 's/aarch64/arm64/')
PROMTOOL_ARCH ?= $(PROMTOOL_OS)-$(PROMTOOL_GOARCH)

PROMRUVAL ?= $(LOCALBIN)/promruval
PROMRUVAL_VERSION ?= 3.8.0

.PHONY: promtool
promtool: $(PROMTOOL)
$(PROMTOOL): | $(LOCALBIN)
ifeq ($(PROMTOOL),$(LOCALBIN)/promtool)
	@set -e; \
	tmpdir=$$(mktemp -d); \
	curl --retry 3 --connect-timeout 10 --max-time 120 -fsSL -o "$$tmpdir/prometheus.tar.gz" "https://github.com/prometheus/prometheus/releases/download/v$(PROMTOOL_VERSION)/prometheus-$(PROMTOOL_VERSION).$(PROMTOOL_ARCH).tar.gz"; \
	tar -xzf "$$tmpdir/prometheus.tar.gz" -C "$$tmpdir"; \
	mv "$$tmpdir/prometheus-$(PROMTOOL_VERSION).$(PROMTOOL_ARCH)/promtool" "$(PROMTOOL)"; \
	chmod +x "$(PROMTOOL)"; \
	rm -rf "$$tmpdir"
else
	@test -x "$(PROMTOOL)"
endif

.PHONY: amtool
amtool: $(AMTOOL)
$(AMTOOL): | $(LOCALBIN)
ifeq (, $(shell which amtool))
	@GOBIN=$(LOCALBIN) GO111MODULE=on go install github.com/prometheus/alertmanager/cmd/amtool@$(AMTOOL_VERSION)
else
AMTOOL=$(shell which amtool)
endif

.PHONY: promruval
promruval: $(PROMRUVAL)
$(PROMRUVAL): | $(LOCALBIN)
ifeq (, $(shell which promruval))
	@GOBIN=$(LOCALBIN) GO111MODULE=on go install github.com/fusakla/promruval/v3@latest
else
PROMRUVAL=$(shell which promruval)
endif
