# ============================================================================
# ilum CLI — Docker-based cross-platform build system
# ============================================================================
#
# Usage:
#   make build-linux-amd64       Build Linux amd64 binary (native)
#   make build-linux-arm64       Build Linux arm64 binary (QEMU emulation)
#   make build-linux             Build both Linux architectures
#   make build-windows-amd64     Build Windows amd64 binary (Wine, experimental)
#   make build-all               Build all Docker-buildable platforms
#   make checksums               Generate SHA256SUMS
#   make release                 build-all + checksums
#   make clean                   Remove dist/release/
#   make help                    Show this help
#
# Override version:  make build-linux-amd64 VERSION=1.2.3
# ============================================================================

.DEFAULT_GOAL := help

.PHONY: build-linux-amd64 build-linux-arm64 build-linux \
        build-windows-amd64 build-all \
        checksums release clean help \
        setup-qemu _ensure-buildx \
        build-darwin-amd64 build-darwin-arm64 \
        test-e2e

# ---------------------------------------------------------------------------
# Configuration
# ---------------------------------------------------------------------------

# Auto-detect version from the most recent cli-v* tag, strip the prefix.
# Override: VERSION=x.y.z make ...
VERSION ?= $(shell git describe --tags --match 'cli-v*' 2>/dev/null | sed 's/^cli-v//' || echo "0.0.0")

RELEASE_DIR := dist/release
DOCKER_CTX  := .
BUILDER     := ilum-cli-builder

# ---------------------------------------------------------------------------
# QEMU / buildx setup (idempotent)
# ---------------------------------------------------------------------------

setup-qemu:
	@echo "==> Setting up QEMU + buildx builder (idempotent)..."
	docker run --rm --privileged tonistiigi/binfmt --install arm64 >/dev/null 2>&1 || true
	@if ! docker buildx inspect $(BUILDER) >/dev/null 2>&1; then \
		docker buildx create --name $(BUILDER) --driver docker-container --use; \
	else \
		docker buildx use $(BUILDER); \
	fi

_ensure-buildx:
	@docker buildx version >/dev/null 2>&1 || \
		(echo "ERROR: docker buildx plugin not found. Install Docker Buildx first." && exit 1)

# ---------------------------------------------------------------------------
# Linux builds (buildx multi-arch)
# ---------------------------------------------------------------------------

build-linux-amd64: _ensure-buildx setup-qemu
	@echo "==> Building ilum CLI for linux/amd64 (v$(VERSION))..."
	@mkdir -p $(RELEASE_DIR)
	docker buildx build \
		--platform linux/amd64 \
		--build-arg VERSION=$(VERSION) \
		-f docker/Dockerfile.linux \
		--output type=local,dest=$(RELEASE_DIR)/_linux-amd64 \
		$(DOCKER_CTX)
	@# Package as tarball
	tar -czf $(RELEASE_DIR)/ilum-linux-amd64.tar.gz \
		-C $(RELEASE_DIR)/_linux-amd64 ilum
	@rm -rf $(RELEASE_DIR)/_linux-amd64
	@echo "==> $(RELEASE_DIR)/ilum-linux-amd64.tar.gz"

build-linux-arm64: _ensure-buildx setup-qemu
	@echo "==> Building ilum CLI for linux/arm64 (v$(VERSION))..."
	@echo "    (QEMU emulation — this will be slow, ~10-15 min)"
	@mkdir -p $(RELEASE_DIR)
	docker buildx build \
		--platform linux/arm64 \
		--build-arg VERSION=$(VERSION) \
		-f docker/Dockerfile.linux \
		--output type=local,dest=$(RELEASE_DIR)/_linux-arm64 \
		$(DOCKER_CTX)
	@# Package as tarball
	tar -czf $(RELEASE_DIR)/ilum-linux-arm64.tar.gz \
		-C $(RELEASE_DIR)/_linux-arm64 ilum
	@rm -rf $(RELEASE_DIR)/_linux-arm64
	@echo "==> $(RELEASE_DIR)/ilum-linux-arm64.tar.gz"

build-linux: build-linux-amd64 build-linux-arm64

# ---------------------------------------------------------------------------
# Windows build (Wine, experimental)
# ---------------------------------------------------------------------------

build-windows-amd64: _ensure-buildx
	@echo "==> Building ilum CLI for windows/amd64 via Wine (v$(VERSION))..."
	@echo "    ⚠  EXPERIMENTAL — Wine + PyInstaller is not officially supported"
	@mkdir -p $(RELEASE_DIR)
	docker build \
		--build-arg VERSION=$(VERSION) \
		-f docker/Dockerfile.windows \
		--output type=local,dest=$(RELEASE_DIR)/_windows-amd64 \
		$(DOCKER_CTX)
	@# Package as zip
	cd $(RELEASE_DIR)/_windows-amd64 && zip -q ../ilum-windows-amd64.zip ilum.exe
	@rm -rf $(RELEASE_DIR)/_windows-amd64
	@echo "==> $(RELEASE_DIR)/ilum-windows-amd64.zip"

# ---------------------------------------------------------------------------
# macOS — cannot be Dockerized (Apple licensing)
# ---------------------------------------------------------------------------

build-darwin-amd64 build-darwin-arm64:
	@echo ""
	@echo "ERROR: macOS builds cannot be produced inside Docker containers."
	@echo ""
	@echo "Build natively on a Mac:"
	@echo ""
	@echo "  # Intel Mac (amd64)"
	@echo "  pip install -e '.[build]'"
	@echo "  pyinstaller ilum.spec --clean"
	@echo "  mv dist/ilum dist/ilum-darwin-amd64"
	@echo ""
	@echo "  # Apple Silicon (arm64)"
	@echo "  pip install -e '.[build]'"
	@echo "  pyinstaller ilum.spec --clean"
	@echo "  mv dist/ilum dist/ilum-darwin-arm64"
	@echo ""
	@exit 1

# ---------------------------------------------------------------------------
# Aggregate targets
# ---------------------------------------------------------------------------

build-all: build-linux build-windows-amd64

checksums:
	@echo "==> Generating SHA256SUMS..."
	@cd $(RELEASE_DIR) && sha256sum *.tar.gz *.zip 2>/dev/null > SHA256SUMS
	@echo "==> $(RELEASE_DIR)/SHA256SUMS"
	@cat $(RELEASE_DIR)/SHA256SUMS

release: build-all checksums
	@echo ""
	@echo "==> Release artifacts in $(RELEASE_DIR)/:"
	@ls -lh $(RELEASE_DIR)/

# ---------------------------------------------------------------------------
# Housekeeping
# ---------------------------------------------------------------------------

test-e2e:
	@echo "==> Running Docker E2E installer tests..."
	pytest tests/installer/e2e/ -v -m e2e --tb=short

clean:
	rm -rf $(RELEASE_DIR)

help:
	@echo "ilum CLI — Docker-based cross-platform build system"
	@echo ""
	@echo "Targets:"
	@echo "  build-linux-amd64     Build Linux amd64 binary (native)"
	@echo "  build-linux-arm64     Build Linux arm64 binary (QEMU, ~10-15 min)"
	@echo "  build-linux           Build both Linux architectures"
	@echo "  build-windows-amd64   Build Windows amd64 binary (Wine, experimental)"
	@echo "  build-all             Build all Docker-buildable platforms"
	@echo "  checksums             Generate SHA256SUMS in dist/release/"
	@echo "  release               build-all + checksums"
	@echo "  clean                 Remove dist/release/"
	@echo "  setup-qemu            Set up QEMU + buildx builder (idempotent)"
	@echo "  help                  Show this help"
	@echo ""
	@echo "Options:"
	@echo "  VERSION=x.y.z        Override auto-detected version (default: $(VERSION))"
	@echo ""
	@echo "macOS builds must be done natively. Run 'make build-darwin-amd64'"
	@echo "or 'make build-darwin-arm64' for instructions."
