# pulse-lets-go — Telephone Load Balancer
# Сборка Go backend + SvelteKit фронта в единый бинарник.

APP    := pulse-lets-go
BINDIR := bin
WEB_DIR := web
PREFIX := /opt/pulse-lets-go

.PHONY: all build build-go build-web clean run test deploy \
        emulate emulate-normal emulate-overload emulate-cpu-low emulate-fail-high \
        emulate-node-down emulate-stale emulate-chaos build-emulator \
        build-siptest siptest-uas siptest-uac siptest-full

all: build

# Полная сборка: фронт + бекенд
build: build-web build-go
	@echo "✓ Сборка завершена: $(BINDIR)/$(APP)"

# Сборка SvelteKit фронта
build-web:
	@echo "→ Сборка SvelteKit..."
	cd $(WEB_DIR) && npm run build

# Сборка Go бинарника (с авто-копированием статики)
build-go:
	@mkdir -p $(BINDIR)
	@echo "→ Сборка Go backend..."
	@if [ -d $(WEB_DIR)/build ]; then \
		rm -rf $(BINDIR)/web && cp -r $(WEB_DIR)/build $(BINDIR)/web; \
		echo "  статика скопирована в $(BINDIR)/web/"; \
	fi
	go build -o $(BINDIR)/$(APP) ./cmd/$(APP)

# Быстрая сборка только Go (без фронта, без статики)
build-go-only:
	@mkdir -p $(BINDIR)
	go build -o $(BINDIR)/$(APP) ./cmd/$(APP)

# Запуск в dev-режиме: Go backend на :8080, SvelteKit dev server на :5173
run:
	@echo "→ Запуск pulse-lets-go (dev)"
	$(BINDIR)/$(APP) &
	cd $(WEB_DIR) && npm run dev

# Продакшн сборка с оптимизациями
build-prod:
	@mkdir -p $(BINDIR)
	cd $(WEB_DIR) && npm run build
	rm -rf $(BINDIR)/web && cp -r $(WEB_DIR)/build $(BINDIR)/web
	CGO_ENABLED=0 go build -ldflags="-s -w" -o $(BINDIR)/$(APP) ./cmd/$(APP)

# Деплой в PREFIX: бинарник + статика + data + log
deploy: build-prod
	@echo "→ Деплой в $(PREFIX)"
	install -d $(PREFIX)/bin $(PREFIX)/data $(PREFIX)/web $(PREFIX)/log
	install -m 755 $(BINDIR)/$(APP) $(PREFIX)/bin/
	cp -r $(WEB_DIR)/build/. $(PREFIX)/web/
	@echo "✓ Готово: $(PREFIX)"
	@echo "  $(PREFIX)/bin/$(APP)"
	@echo "  $(PREFIX)/web/ (SvelteKit статика)"
	@echo "  $(PREFIX)/data/ (config.json, trunks.json, users.json)"
	@echo "  $(PREFIX)/log/ (ASCII-лог метрик)"

# Установка systemd unit
install-systemd:
	install -m 644 deploy/$(APP).service /etc/systemd/system/
	systemctl daemon-reload
	@echo "✓ systemd unit установлен. Запуск: sudo systemctl start $(APP)"

# ============================================================
# Эмулятор метрик
# ============================================================

# Сборка эмулятора
build-emulator:
	@mkdir -p $(BINDIR)
	go build -o $(BINDIR)/emulator ./cmd/emulator

# По умолчанию — normal
emulate: emulate-normal

# Все ноды здоровы, случайная загрузка
emulate-normal: nats build-emulator
	./$(BINDIR)/emulator --scenario normal

# Последняя нода перегружена (active_calls=max_calls)
emulate-overload: nats build-emulator
	./$(BINDIR)/emulator --scenario overload

# Последняя нода с низким idle_cpu (< 5)
emulate-cpu-low: nats build-emulator
	./$(BINDIR)/emulator --scenario cpu-low

# Последняя нода с высоким call_failure_rate (> 15)
emulate-fail-high: nats build-emulator
	./$(BINDIR)/emulator --scenario fail-high

# Последняя нода status="down"
emulate-node-down: nats build-emulator
	./$(BINDIR)/emulator --scenario node-down

# Первая нода замолкает через 10 сек (stale)
emulate-stale: nats build-emulator
	./$(BINDIR)/emulator --scenario stale

# Случайные lethal-состояния
emulate-chaos: nats build-emulator
	./$(BINDIR)/emulator --scenario chaos

# ============================================================
# Агент сбора метрик (pulse-lets-go-agent)
# ============================================================

build-agent:
	@mkdir -p $(BINDIR)
	go build -o $(BINDIR)/pulse-lets-go-agent ./cmd/pulse-lets-go-agent

# ============================================================
# SIP-тестер (e2e проверка с FreeSWITCH)
# ============================================================

build-siptest:
	@mkdir -p $(BINDIR)
	go build -o $(BINDIR)/siptest ./cmd/siptest

# Запуск UAS (PBX-нода, отвечает 200 OK на INVITE)
siptest-uas: build-siptest
	./$(BINDIR)/siptest -mode uas

# Отправка тестового звонка (10 CPS, 100 вызовов)
siptest-uac: build-siptest
	./$(BINDIR)/siptest -mode uac -r 10 -l 100 -m 100

# Полный e2e тест: UAS + UAC
siptest-full: build-siptest
	@echo "→ Запуск UAS (PBX-нода) на порту 5090..."
	./$(BINDIR)/siptest -mode uas &
	@sleep 1
	@echo "→ Запуск UAC (оператор)..."
	./$(BINDIR)/siptest -mode uac -r 10 -l 100 -m 200
	@echo "→ Остановка UAS..."
	pkill siptest 2>/dev/null || true

# ============================================================
# NATS и запуск
# ============================================================

# Запуск NATS-сервера для разработки (в фоне)
nats:
	@echo "→ Запуск NATS на порту 4222..."
	@if ! pgrep -x nats-server > /dev/null; then \
		$(BINDIR)/nats-server -p 4222 -D &>/dev/null & \
		disown; \
		echo "✓ NATS запущен"; \
	else \
		echo "NATS уже запущен"; \
	fi

# Быстрый старт: NATS + pulse-lets-go
start: nats
	@echo "→ Запуск pulse-lets-go..."
	$(BINDIR)/$(APP)

# Очистка
clean:
	rm -rf $(BINDIR)
	cd $(WEB_DIR) && rm -rf build .svelte-kit

# Тесты
test:
	go test ./... -v -cover

# Запуск тестов с race detector
test-race:
	go test ./... -race -v

# Линтинг
lint:
	go vet ./...

# Форматирование
fmt:
	go fmt ./...
