SHELL := /bin/bash
.ONESHELL:

ESP_ENV  := . ~/scripts/esp_env.sh
SIM_BUILD := simulator/build
PORT     ?= /dev/ttyUSB0

# All firmware targets build with DEBUG=1 so serial commands and DBG lines
# are always available for testing and monitoring.
IDF      := $(ESP_ENV) && idf.py -DDEBUG=1

.PHONY: all firmware sim test flash monitor flash-monitor clean firmware-clean sim-clean case case_live case_clean

all: firmware sim

firmware:
	$(IDF) build

flash:
	$(IDF) flash

monitor:
	$(IDF) monitor

flash-monitor:
	$(IDF) flash monitor

sim:
	cmake --build $(SIM_BUILD) --parallel

test: sim flash
	sleep 5
	$(SIM_BUILD)/test_ble --port $(PORT)

clean: firmware-clean sim-clean case_clean

firmware-clean:
	$(IDF) fullclean

sim-clean:
	cmake --build $(SIM_BUILD) --target clean

# --- case (build123d) ---
CASE_VENV   := case/venv
CASE_PYTHON := $(CASE_VENV)/bin/python
CASE_PIP    := $(CASE_VENV)/bin/pip
CASE_FW     := $(CASE_VENV)/bin/fw123d

$(CASE_VENV)/.installed: case/requirements.txt
	python3.13 -m venv $(CASE_VENV)
	$(CASE_PIP) install --upgrade pip
	$(CASE_PIP) install -r case/requirements.txt
	touch $@

case: $(CASE_VENV)/.installed
	$(CASE_PYTHON) case/case.py

case_live: $(CASE_VENV)/.installed
	$(CASE_FW) case/case.py

case_clean:
	rm -rf $(CASE_VENV) case/output/*.stl
