.PHONY: build build-amd64 build-arm64 ensure-builder push-aws-prod push-aws-dev push-gcp-prod push-azure-prod push-alicloud-prod push-all help fmt

VERSION ?= $(shell date +%Y%m%d)

AWS_PROD_IMAGE = 557537366020.dkr.ecr.us-west-2.amazonaws.com/diagnosis-compute:$(VERSION)
AWS_DEV_IMAGE = 552185537300.dkr.ecr.us-west-2.amazonaws.com/diagnosis-compute:$(VERSION)
GCP_PROD_IMAGE = us-west1-docker.pkg.dev/gcp-autonomous-prod/observability-regional-server/diagnosis-compute:$(VERSION)
AZURE_PROD_IMAGE = o11yprod.azurecr.io/diagnosis-compute:$(VERSION)
ALICLOUD_PROD_IMAGE = o11-prod-repo-registry.ap-southeast-1.cr.aliyuncs.com/prod/diagnosis-compute:$(VERSION)

PROJECT_ROOT = $(shell cd ../../ && pwd)

FILES = $(shell find . -type f -name '*.go' -print)
FAIL_ON_STDOUT := awk '{ print } END { if (NR > 0) { exit 1 } }'

# buildx settings
BUILDER ?= default
PLATFORMS ?= linux/amd64,linux/arm64
DOCKERFILE := cmd/diagnosis-compute/build/Dockerfile

ensure-builder:
	@if ! docker buildx inspect $(BUILDER) >/dev/null 2>&1; then \
		echo "Creating buildx builder '$(BUILDER)'..."; \
		docker buildx create --use --name $(BUILDER); \
	else \
		echo "Using existing buildx builder '$(BUILDER)'"; \
	fi

build: ensure-builder
	@echo "Building local images for amd64 and arm64 (no push)"
	# Note: multi-platform cannot be --load into Docker; build per-arch locally
	$(MAKE) build-amd64
	$(MAKE) build-arm64

build-amd64: ensure-builder
	@echo "Building local amd64 image..."
	cd $(PROJECT_ROOT) && docker buildx build \
		--platform linux/amd64 \
		-f $(DOCKERFILE) \
		-t $(AWS_PROD_IMAGE) \
		--load \
		.

build-arm64: ensure-builder
	@echo "Building local arm64 image..."
	cd $(PROJECT_ROOT) && docker buildx build \
		--platform linux/arm64 \
		-f $(DOCKERFILE) \
		-t $(AWS_PROD_IMAGE) \
		--load \
		.

push-aws-prod: ensure-builder
	@echo "Building and pushing multi-arch image to AWS production..."
	cd $(PROJECT_ROOT) && docker buildx build \
		--platform $(PLATFORMS) \
		-f $(DOCKERFILE) \
		-t $(AWS_PROD_IMAGE) \
		--push \
		.

push-aws-dev: ensure-builder
	@echo "Building and pushing multi-arch image to AWS development..."
	cd $(PROJECT_ROOT) && docker buildx build \
		--platform $(PLATFORMS) \
		-f $(DOCKERFILE) \
		-t $(AWS_DEV_IMAGE) \
		--push \
		.

push-gcp-prod: ensure-builder
	@echo "Building and pushing multi-arch image to GCP production..."
	cd $(PROJECT_ROOT) && docker buildx build \
		--platform $(PLATFORMS) \
		-f $(DOCKERFILE) \
		-t $(GCP_PROD_IMAGE) \
		--push \
		.

push-azure-prod: ensure-builder
	@echo "Building and pushing multi-arch image to Azure production..."
	cd $(PROJECT_ROOT) && docker buildx build \
		--platform $(PLATFORMS) \
		-f $(DOCKERFILE) \
		-t $(AZURE_PROD_IMAGE) \
		--push \
		.

push-alicloud-prod: ensure-builder
	@echo "Building and pushing multi-arch image to AliCloud production..."
	cd $(PROJECT_ROOT) && docker buildx build \
		--platform $(PLATFORMS) \
		-f $(DOCKERFILE) \
		-t $(ALICLOUD_PROD_IMAGE) \
		--push \
		.

push-all: push-aws-prod push-aws-dev push-gcp-prod push-azure-prod push-alicloud-prod
	@echo "Pushed to all environments"

fmt:
	@echo "gofmt (simplify)"
	@gofmt -s -l -w -r 'interface{} -> any' $(FILES) 2>&1 | $(FAIL_ON_STDOUT)

help:
	@echo "Available targets:"
	@echo "  build              - Build Docker image"
	@echo "  push-aws-prod      - Push to AWS production"
	@echo "  push-aws-dev       - Push to AWS development"
	@echo "  push-gcp-prod      - Push to GCP production"
	@echo "  push-azure-prod    - Push to Azure production"
	@echo "  push-alicloud-prod - Push to AliCloud production"
	@echo "  push-all           - Push to all environments"
	@echo "  fmt                - Clean code"
	@echo "  help               - Show this help message"
	@echo ""
	@echo "Usage:"
	@echo "  make build VERSION=v46"
	@echo "  make push-all VERSION=v46"
