include ../build.env
-include ../build.env.work
export

BUILD_PLATFORM ?= linux/amd64

# Should be the same as upstream version in production
VERSION ?= dev
UBOOT_VERSION ?= v2026.01

# Target kube version
KUBE_VERSION ?= v1.33.3

GIT_REV := $(shell git rev-parse HEAD)

PACKAGES_DIR    := packages
OUT_DIR         := out
UBOOT_TOOLS_OUT := $(OUT_DIR)/uboot-tools

UBOOT_TAR      := $(PACKAGES_DIR)/uboot-$(UBOOT_VERSION).tar.gz
BUILDINFO_FILE := pkg/buildinfo/buildinfo_gen.go
ASSETS_PATH      := ./pkg/assets

BUILDX_BUILDER      := container-builder
LOCAL_REGISTRY      := registry
LOCAL_REGISTRY_PORT := 5000

CTL_BUILD_BASE_REPO  := localhost:5000/monok8s/ctl-build-base
CTL_IMAGE_REPO       := localhost:5000/monok8s/node-control

CTL_BUILD_BASE_IMAGE := $(CTL_BUILD_BASE_REPO):$(VERSION)
CTL_IMAGE            := $(CTL_IMAGE_REPO):$(VERSION)

DOWNLOAD_PACKAGES_STAMP := $(PACKAGES_DIR)/.download-packages.stamp

$(PACKAGES_DIR):
	mkdir -p $@

$(OUT_DIR):
	mkdir -p $@

# Keep buildinfo host-side since it is just generated source and lets Docker see it in build context.
.buildinfo:
	@mkdir -p $(dir $(BUILDINFO_FILE))
	@printf '%s\n' \
		'package buildinfo' \
		'' \
		'const (' \
		'    Version     = "$(VERSION)"' \
		'    KubeVersion = "$(KUBE_VERSION)"' \
		'    GitRevision = "$(GIT_REV)"' \
		'    Timestamp   = "'$$(TZ=UTC date +%Y%m%d.%H%M%S)'"' \
		')' \
	> $(BUILDINFO_FILE)

ensure-buildx:
	@if ! docker buildx inspect $(BUILDX_BUILDER) >/dev/null 2>&1; then \
		echo "Creating buildx builder $(BUILDX_BUILDER)..."; \
		docker buildx create \
			--name $(BUILDX_BUILDER) \
			--driver docker-container \
			--driver-opt network=host \
			--bootstrap --use; \
	else \
		echo "Using existing buildx builder $(BUILDX_BUILDER)"; \
		docker buildx use $(BUILDX_BUILDER); \
	fi

ensure-registry:
	@if ! docker container inspect $(LOCAL_REGISTRY) >/dev/null 2>&1; then \
		echo "Creating local registry..."; \
		docker run -d \
			--restart=always \
			-p $(LOCAL_REGISTRY_PORT):5000 \
			--name $(LOCAL_REGISTRY) \
			registry:2; \
	else \
		if [ "$$(docker inspect -f '{{.State.Running}}' $(LOCAL_REGISTRY))" != "true" ]; then \
			echo "Starting existing local registry..."; \
			docker start $(LOCAL_REGISTRY); \
		fi; \
	fi

$(DOWNLOAD_PACKAGES_STAMP): docker/download-packages.Dockerfile makefile | $(PACKAGES_DIR)
	docker build \
		-f docker/download-packages.Dockerfile \
		--build-arg UBOOT_VERSION=$(UBOOT_VERSION) \
		--output type=local,dest=./$(PACKAGES_DIR) .
	@touch $@

uboot-tools: $(DOWNLOAD_PACKAGES_STAMP)
	rm -rf "$(UBOOT_TOOLS_OUT)"
	mkdir -p "$(UBOOT_TOOLS_OUT)"
	docker buildx build \
		--platform linux/amd64,linux/arm64 \
		-f docker/uboot-tools.Dockerfile \
		--build-arg UBOOT_VERSION=$(UBOOT_VERSION) \
		--build-arg UBOOT_TAR=$(UBOOT_TAR) \
		--output type=local,dest=./$(UBOOT_TOOLS_OUT),platform-split=true .

ctl-build-base: ensure-buildx ensure-registry
	docker buildx build \
		--platform linux/amd64,linux/arm64 \
		-f docker/ctl-build-base.Dockerfile \
		-t $(CTL_BUILD_BASE_IMAGE) \
		--output type=image,push=true,registry.insecure=true .

build-crds: ctl-build-base | $(OUT_DIR)
	mkdir -p "$(OUT_DIR)/crds"
	docker buildx build \
		--platform $(BUILD_PLATFORM) \
		-f docker/crdgen.Dockerfile \
		--build-arg BASE_IMAGE=$(CTL_BUILD_BASE_IMAGE) \
		--output type=local,dest=./$(OUT_DIR)/crds .
	rm -rf "$(ASSETS_PATH)/crds"
	mkdir -p "$(ASSETS_PATH)/crds"
	cp -R "$(OUT_DIR)/crds/." "$(ASSETS_PATH)/crds/"

build-agent: .buildinfo build-crds uboot-tools
	docker buildx build \
		--platform linux/amd64,linux/arm64 \
		-f docker/ctl-agent.Dockerfile \
		--build-arg BASE_IMAGE=$(CTL_BUILD_BASE_IMAGE) \
		--build-arg VERSION=$(VERSION) \
		-t $(CTL_IMAGE) \
		--output type=image,push=true,registry.insecure=true .

build-local: .buildinfo build-crds uboot-tools
	docker buildx build \
		--platform linux/arm64 \
		-f docker/ctl-agent.Dockerfile \
		--build-arg BASE_IMAGE=$(CTL_BUILD_BASE_IMAGE) \
		--build-arg VERSION=$(VERSION) \
		--load \
		-t localhost/monok8s/node-control:$(VERSION) .

push-agent: .buildinfo build-crds uboot-tools
	test -n "$(IMAGE_REPOSITORY)"
	docker buildx build \
		--platform linux/amd64,linux/arm64 \
		-f docker/ctl-agent.Dockerfile \
		--build-arg BASE_IMAGE=$(CTL_BUILD_BASE_IMAGE) \
		--build-arg VERSION=$(VERSION) \
		-t $(IMAGE_REPOSITORY)/node-control:$(VERSION) \
		--push .

run-agent:
	docker run --rm \
		-v "$$(pwd)/out:/work/out" \
		$(CTL_IMAGE) \
		agent --env-file /work/out/cluster.env

clean:
	-docker image rm localhost/monok8s/node-control:$(VERSION) >/dev/null 2>&1 || true
	rm -rf \
		$(OUT_DIR)/crds \
		$(BUILDINFO_FILE)

distclean: clean
	rm -rf $(OUT_DIR)

dockerclean:
	@echo "Removing tagged images..."
	- docker rmi \
		localhost/monok8s/ctl-build-base:$(VERSION) \
		localhost/monok8s/node-control:$(VERSION) \
		localhost/monok8s/crdgen:$(VERSION) \
		2>/dev/null || true

	@echo "Removing dangling build cache/images..."
	- docker image prune -f
	- docker builder prune -f

pkgclean:
	rm -rf $(PACKAGES_DIR)

all: build-agent build-local

.PHONY: \
	all clean dockerclean \
	.buildinfo ensure-buildx ensure-registry \
	build-crds build-local build-agent build-agent-local push-agent \
	uboot-tools run-agent run-agent-local
