PIDFILE := /tmp/piface-dev.pid
GTX1080TI_UUID ?= $(shell nvidia-smi --query-gpu=uuid,name --format=csv,noheader 2>/dev/null | awk -F', ' '/GTX 1080 Ti/{print $$1; exit}')

.PHONY: serve dev install-torch-cu126 serve-audio-1080 dev-audio-1080 background-dev-audio-1080 serve-speech-1080 dev-speech-1080 background-dev-speech-1080 background-dev stop-dev test lint format build-frontend release

serve:
	uv run piface serve

dev:
	uv run piface serve --dev

install-torch-cu126:
	uv pip install --index-strategy unsafe-best-match --index-url https://download.pytorch.org/whl/cu126 --extra-index-url https://pypi.org/simple "torch==2.10.0+cu126" "torchaudio==2.10.0+cu126"

serve-audio-1080:
	@if [ -z "$(GTX1080TI_UUID)" ]; then \
		echo "GTX 1080 Ti not detected via nvidia-smi."; \
		echo "Run: nvidia-smi --query-gpu=uuid,name --format=csv,noheader"; \
		exit 1; \
	fi
	@echo "Using GTX 1080 Ti for audio workloads (CUDA_VISIBLE_DEVICES=$(GTX1080TI_UUID))"
	@CUDA_VISIBLE_DEVICES=$(GTX1080TI_UUID) uv run piface serve --speech-gpu --tts-gpu

dev-audio-1080:
	@if [ -z "$(GTX1080TI_UUID)" ]; then \
		echo "GTX 1080 Ti not detected via nvidia-smi."; \
		echo "Run: nvidia-smi --query-gpu=uuid,name --format=csv,noheader"; \
		exit 1; \
	fi
	@echo "Using GTX 1080 Ti for audio workloads in dev mode (CUDA_VISIBLE_DEVICES=$(GTX1080TI_UUID))"
	@CUDA_VISIBLE_DEVICES=$(GTX1080TI_UUID) uv run piface serve --dev --speech-gpu --tts-gpu

background-dev-audio-1080: stop-dev
	@if [ -z "$(GTX1080TI_UUID)" ]; then \
		echo "GTX 1080 Ti not detected via nvidia-smi."; \
		echo "Run: nvidia-smi --query-gpu=uuid,name --format=csv,noheader"; \
		exit 1; \
	fi
	@nohup env CUDA_VISIBLE_DEVICES=$(GTX1080TI_UUID) uv run piface serve --dev --speech-gpu --tts-gpu > /tmp/piface-dev.log 2>&1 & \
		echo $$! > $(PIDFILE); \
		echo "Started piface-dev (audio pinned to GTX 1080 Ti, pid $$(cat $(PIDFILE))), log: /tmp/piface-dev.log"

serve-speech-1080: serve-audio-1080

dev-speech-1080: dev-audio-1080

background-dev-speech-1080: background-dev-audio-1080

stop-dev:
	@if [ -f $(PIDFILE) ] && kill -0 $$(cat $(PIDFILE)) 2>/dev/null; then \
		kill $$(cat $(PIDFILE)) 2>/dev/null; \
		echo "Stopped piface-dev (pid $$(cat $(PIDFILE)))"; \
	fi
	@rm -f $(PIDFILE)
	@PID=$$(lsof -ti :7832 2>/dev/null) && \
		kill $$PID 2>/dev/null && \
		echo "Killed existing process on :7832 (pid $$PID)" && \
		sleep 0.5 || true

background-dev: stop-dev
	@nohup uv run piface serve --dev > /tmp/piface-dev.log 2>&1 & \
		echo $$! > $(PIDFILE); \
		echo "Started piface-dev (pid $$(cat $(PIDFILE))), log: /tmp/piface-dev.log"

test:
	uv run pytest -v

lint:
	uv run ruff check piface/ tests/

format:
	uv run ruff format piface/ tests/

build-frontend:
	@command -v pnpm >/dev/null 2>&1 || { echo "pnpm not found on PATH. Install: npm install -g pnpm"; exit 1; }
	cd frontend && CI=true pnpm install --frozen-lockfile && pnpm build
	rm -rf piface/static
	cp -r frontend/dist piface/static

release: build-frontend
	rm -rf dist
	uv build
	@echo ""
	@echo "Built artifacts:"
	@ls -1 dist/
	@echo ""
	@echo "Next: uv publish --token <TOKEN>  (or use TestPyPI first)"
