# Локальные кластеры Kubernetes через kind.
# Основной сценарий: только Docker (+ make) на хосте — скрипты и kind внутри образа kind-k8s-tools.
#
# Автор: Сергей Антропов — https://devops.org.ru
# https://kind.sigs.k8s.io/docs/user/quick-start/

.PHONY: help setup clusters-dir check-docker compose-build create delete list status \
	create-host delete-host status-host check-host kubeconfig create-compose delete-compose

KIND_K8S_DIR := $(abspath $(dir $(lastword $(MAKEFILE_LIST))))
SETUP_ENV_SCRIPT := $(KIND_K8S_DIR)/scripts/setup_env_interactive.py
PYTHON ?= python3
COMPOSE ?= docker compose
# При ошибке «exec format error» у kind в контейнере: make compose-build COMPOSE_BUILD_FLAGS=--platform linux/arm64
COMPOSE_BUILD_FLAGS ?=
K8S_APP := /opt/kind-k8s/app

help: ## Показать справку
	@echo "Команды (из каталога kind-k8s-develop или: make -C kind-k8s-develop <цель>):"
	@echo "  Основной путь — Docker: make create / delete / list / status (kind и Python не нужны на хосте)."
	@grep -E '^[a-zA-Z0-9_-]+:.*?##' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?##"} {printf "  \033[36m%-22s\033[0m %s\n", $$1, $$2}'

setup: ## Интерактивно создать .env по env.example (scripts/setup_env_interactive.py)
	@$(PYTHON) "$(SETUP_ENV_SCRIPT)"

clusters-dir: ## Создать каталог clusters/ для тома (если ещё нет)
	@mkdir -p "$(KIND_K8S_DIR)/clusters"

check-docker: ## Проверить docker/podman в PATH и работу команды COMPOSE (по умолчанию docker compose)
	@command -v docker >/dev/null 2>&1 || command -v podman >/dev/null 2>&1 || { echo "Нужен docker или podman в PATH."; exit 1; }
	@$(COMPOSE) version >/dev/null 2>&1 || { echo "Нужна рабочая команда Compose: «$(COMPOSE)». Для Podman: COMPOSE='podman compose' make check-docker"; exit 1; }
	@echo "$(COMPOSE): OK"

compose-build: clusters-dir ## Собрать образ kind-k8s-tools
	cd "$(KIND_K8S_DIR)" && $(COMPOSE) build $(COMPOSE_BUILD_FLAGS)

# --- Сценарий без установки kind/kubectl/python на хост (только Docker) ---

create: compose-build ## Интерактивно создать кластер (всё в контейнере)
	cd "$(KIND_K8S_DIR)" && $(COMPOSE) run --rm -it kind-k8s-tools python3 $(K8S_APP)/create_cluster.py

delete: compose-build ## Интерактивно удалить кластер и папку clusters/<имя>/
	cd "$(KIND_K8S_DIR)" && $(COMPOSE) run --rm -it kind-k8s-tools python3 $(K8S_APP)/delete_cluster.py

list: compose-build ## Список кластеров kind (kind внутри контейнера)
	cd "$(KIND_K8S_DIR)" && $(COMPOSE) run --rm kind-k8s-tools kind get clusters

status: compose-build ## Статус узлов; make status CLUSTER=имя — один кластер
	cd "$(KIND_K8S_DIR)" && $(COMPOSE) run --rm -it kind-k8s-tools python3 $(K8S_APP)/cluster_status.py $(CLUSTER)

# Совместимость со старыми именами целей
create-compose: ## то же, что create (совместимость)
	@$(MAKE) -C "$(KIND_K8S_DIR)" create

delete-compose: ## то же, что delete (совместимость)
	@$(MAKE) -C "$(KIND_K8S_DIR)" delete

# --- Локальный запуск скриптов на хосте (нужны kind, kubectl, python3) ---

check-host: ## Проверить docker, kind, kubectl, python3 на хосте
	@echo "--- check-host (локальные бинарники) ---"
	@command -v docker >/dev/null 2>&1 && echo "  docker: $$(command -v docker)" || { echo "  docker: НЕ НАЙДЕН"; exit 1; }
	@command -v kind >/dev/null 2>&1 && echo "  kind:   $$(command -v kind)" || { echo "  kind:   НЕ НАЙДЕН (см. https://kind.sigs.k8s.io/docs/user/quick-start/#installation)"; exit 1; }
	@command -v kubectl >/dev/null 2>&1 && echo "  kubectl: $$(command -v kubectl)" || { echo "  kubectl: НЕ НАЙДЕН"; exit 1; }
	@command -v $(PYTHON) >/dev/null 2>&1 && echo "  $(PYTHON): $$(command -v $(PYTHON))" || { echo "  $(PYTHON): НЕ НАЙДЕН"; exit 1; }

create-host: check-host ## Создать кластер скриптом на хосте (не через образ)
	cd "$(KIND_K8S_DIR)" && $(PYTHON) app/create_cluster.py

delete-host: ## Удалить кластер скриптом на хосте
	@command -v $(PYTHON) >/dev/null 2>&1 || { echo "Нужен $(PYTHON)"; exit 1; }
	cd "$(KIND_K8S_DIR)" && $(PYTHON) app/delete_cluster.py

status-host: check-host ## Статус узлов скриптом на хосте
	cd "$(KIND_K8S_DIR)" && \
	if [ -n "$(CLUSTER)" ]; then $(PYTHON) app/cluster_status.py "$(CLUSTER)"; else $(PYTHON) app/cluster_status.py; fi

kubeconfig: ## Путь к kubeconfig на хосте: make kubeconfig CLUSTER=имя
	@if [ -z "$(CLUSTER)" ]; then echo "Использование: make kubeconfig CLUSTER=<имя_кластера>"; exit 1; fi
	@test -f "$(KIND_K8S_DIR)/clusters/$(CLUSTER)/kubeconfig" || { echo "Файл не найден: clusters/$(CLUSTER)/kubeconfig"; exit 1; }
	@echo "$(KIND_K8S_DIR)/clusters/$(CLUSTER)/kubeconfig"
