# =============================================================================
# Image identity
# =============================================================================

IMAGE_NAME  := pmocrazycoder
IMAGE_TAG   := latest

# =============================================================================
# Registry
# =============================================================================

REGISTRY    := niepce.petite-maison-orange.fr/public

# =============================================================================
# Build platforms
# =============================================================================

PLATFORMS   := linux/amd64,linux/arm64

# =============================================================================
# Derived image identifiers
# =============================================================================

FULL_IMAGE  := $(REGISTRY)/$(IMAGE_NAME):$(IMAGE_TAG)
OCI_ARCHIVE := $(IMAGE_NAME)-$(IMAGE_TAG).oci.tar

# =============================================================================
# Docker buildx builder
# =============================================================================

BUILDER := $(IMAGE_NAME)-builder

# =============================================================================
# OCI image annotations (injected via --build-arg)
# =============================================================================

OCI_VERSION  := $(IMAGE_TAG)
OCI_CREATED  := $(shell date -u +%Y-%m-%dT%H:%M:%SZ)
OCI_REVISION := $(shell git rev-parse --short HEAD 2>/dev/null || echo unknown)

# =============================================================================
# Build context
# =============================================================================

PROJECT_DIR    := $(shell pwd)
BUILD_CONTEXT  := .
DOCKERFILE     := Dockerfile

BUILD_ARGS := \
	--build-arg OCI_VERSION=$(OCI_VERSION) \
	--build-arg OCI_CREATED=$(OCI_CREATED) \
	--build-arg OCI_REVISION=$(OCI_REVISION)

# =============================================================================
# Dev container
# =============================================================================

WORKSPACE      := /workspace
CONTAINER_NAME := ai-dev-container
MCP_LOG        := $(WORKSPACE)/.ai_index/mcp.log

# =============================================================================
# Targets
# =============================================================================

.PHONY: all build build-multiplatform push run run-mcp \
        init-index mcp-list embeddings update-graph \
        restart-mcp bootstrap clean clean-builder help

## all                 : Build multi-platform image, push to registry
all: build-multiplatform push

## build               : Build for the native platform and load into the local Docker daemon
build:
	docker build $(BUILD_ARGS) \
		--tag $(FULL_IMAGE) \
		--file $(DOCKERFILE) \
		$(BUILD_CONTEXT)

## build-multiplatform : Build for $(PLATFORMS) and export as a local OCI archive
build-multiplatform: .builder-ready
	docker buildx build $(BUILD_ARGS) \
		--builder $(BUILDER) \
		--platform $(PLATFORMS) \
		--tag $(FULL_IMAGE) \
		--file $(DOCKERFILE) \
		--provenance=false \
		--output type=oci,dest=$(OCI_ARCHIVE) \
		$(BUILD_CONTEXT)

# Create the buildx builder with docker-container driver (once)
.builder-ready:
	docker buildx inspect $(BUILDER) > /dev/null 2>&1 \
		|| docker buildx create --name $(BUILDER) --driver docker-container --bootstrap
	touch .builder-ready

## push                : Push the OCI archive to the registry using skopeo, then pull locally
push: $(OCI_ARCHIVE)
	skopeo copy \
		--dest-tls-verify=true \
		--multi-arch all \
		oci-archive:$(OCI_ARCHIVE) \
		docker://$(FULL_IMAGE)
	docker pull $(FULL_IMAGE)

# Ensure the OCI archive exists before pushing
$(OCI_ARCHIVE):
	$(MAKE) build-multiplatform

## run                 : Run interactive container with mounted project
run:
	docker run -v $(PROJECT_DIR):$(WORKSPACE) -it --rm $(FULL_IMAGE)

## run-mcp             : Run container with MCP server in background
run-mcp:
	docker run -v $(PROJECT_DIR):$(WORKSPACE) -it --rm $(FULL_IMAGE) bash

## init-index          : Initialize .ai_index directory structure
init-index:
	@echo "[MAKE] Initializing .ai_index..."
	mkdir -p $(PROJECT_DIR)/.ai_index/ast
	mkdir -p $(PROJECT_DIR)/.ai_index/embeddings
	@if [ ! -f $(PROJECT_DIR)/.ai_index/graph.db ]; then \
		sqlite3 $(PROJECT_DIR)/.ai_index/graph.db "VACUUM;"; \
	fi

## mcp-list            : Run MCP list_imports tool
mcp-list:
	@echo "[MAKE] Running MCP list_imports.py..."
	python3 $(PROJECT_DIR)/opt/dev-tools/list_imports.py --project $(WORKSPACE)

## embeddings          : Generate embeddings
embeddings:
	@echo "[MAKE] Generating embeddings..."
	python3 $(PROJECT_DIR)/opt/dev-tools/generate_embeddings.py --project $(WORKSPACE)

## update-graph        : Update dependency graph
update-graph:
	@echo "[MAKE] Updating dependency graph..."
	python3 $(PROJECT_DIR)/opt/dev-tools/update_graph.py --project $(WORKSPACE)

## restart-mcp         : Restart MCP server inside running container
restart-mcp:
	docker exec -it $(CONTAINER_NAME) bash -c "\
		pkill -f mcp-server; \
		/opt/bin/mcp-server --project $(WORKSPACE) > $(MCP_LOG) 2>&1 & \
	"

## bootstrap           : Build container and init index
bootstrap: build init-index
	@echo "[MAKE] Bootstrap complete. Run 'make run' to start the container."

## clean               : Remove OCI archive, local image and generated files
clean: clean-builder
	docker rmi --force $(FULL_IMAGE) 2>/dev/null || true
	rm -f $(OCI_ARCHIVE)
	rm -f $(PROJECT_DIR)/.ai_index/*.log
	rm -rf $(PROJECT_DIR)/.ai_index/ast/*
	rm -rf $(PROJECT_DIR)/.ai_index/embeddings/*

## clean-builder       : Remove the buildx builder
clean-builder:
	docker buildx rm $(BUILDER) 2>/dev/null || true
	rm -f .builder-ready

## help                : Show this help
help:
	@grep -E '^## ' $(MAKEFILE_LIST) | sed 's/^## //'
