# Штурман — единые dev-команды (расширяется по планам реализации).
set shell := ["bash", "-uc"]

# список целей
default:
    @just --list

# собрать весь воркспейс
build:
    cargo build --workspace

# тесты (unit + integration)
test:
    cargo test --workspace

# линт: формат + clippy (warnings = ошибки)
lint:
    cargo fmt --all --check
    cargo clippy --workspace --all-targets -- -D warnings

# лицензии + advisories
deny:
    cargo deny check

# интеграционные тесты на session-шине (нужен dbus: brew install dbus / в Lima).
# --test-threads=1: тесты владеют одними well-known именами на общей шине → серийно (иначе кросс-talk/вис).
test-integration:
    dbus-run-session -- cargo test --workspace -- --ignored --test-threads=1

# полный локальный гейт
ci: lint test deny

# --- плагины (F02/F03) ---

# валидировать манифест плагина
validate-manifest path:
    cargo run -q -p shturman-manifest-validator -- {{path}}

# сгенерировать каркас плагина в plugins/<name> и проверить валидатором
new-plugin name:
    #!/usr/bin/env bash
    set -euo pipefail
    dest="plugins/{{name}}"
    [ -e "$dest" ] && { echo "уже существует: $dest"; exit 1; }
    mkdir -p "$dest"
    cp -R templates/plugin/. "$dest/"
    for f in $(find "$dest" -type f); do
      tmp=$(mktemp); sed "s/__NAME__/{{name}}/g" "$f" > "$tmp" && mv "$tmp" "$f"
    done
    echo "создан плагин: $dest"
    cargo run -q -p shturman-manifest-validator -- "$dest/manifest.yaml"

# dev-запуск плагина (каркас; полноценно — с App-Host, v3)
plugin-dev-run path:
    @echo "plugin-dev-run {{path}}: нужен App-Host (приходит в v3). Пока — валидация манифеста:"
    cargo run -q -p shturman-manifest-validator -- {{path}}/manifest.yaml

# Vehicle Simulator (плейсхолдер; домен E, v2)
sim:
    @echo "Vehicle Simulator — v2 (домен E): vcan + ELM327-emu; каркас в sim/."

# --- Lima-VM (часть 2 Плана 5: нужен limactl — brew install lima) ---

# поднять dev-VM (создание + провижининг). --tty=false: неинтерактивный старт (без редактора YAML).
vm-up:
    limactl start --tty=false --name=shturman lima/shturman.yaml

# остановить VM
vm-down:
    limactl stop shturman

# шелл в VM
vm-shell:
    limactl shell shturman

# пересоздать VM «с нуля» (сброс — ничего на хосте не ломаем)
vm-reset:
    -limactl stop shturman
    -limactl delete shturman
    limactl start --tty=false --name=shturman lima/shturman.yaml

# собрать + развернуть + поднять target в VM (boot → сервисы → кадр); без reboot (фаза pre)
run:
    limactl shell --workdir /shturman shturman -- bash -lc 'E2E_PHASE=pre bash tests/e2e/run.sh'

# сквозной E2E в VM (приёмка v0.1/v0.6 + шагающий скелет): pre → reboot → post
e2e:
    #!/usr/bin/env bash
    set -euo pipefail
    echo "== E2E фаза PRE (сборка → подъём → проверки → персист-проба) =="
    limactl shell --workdir /shturman shturman -- bash -lc 'E2E_PHASE=pre bash tests/e2e/run.sh'
    echo
    echo "== reboot VM (проверка персиста + machine-id every-boot bind) =="
    limactl shell --workdir / shturman -- sudo systemctl reboot 2>/dev/null || true
    echo "== ждём возврат VM =="
    for i in $(seq 1 60); do
      sleep 2
      if limactl shell --workdir / shturman -- true 2>/dev/null; then echo "VM вернулась (попытка $i)"; break; fi
    done
    limactl shell --workdir / shturman -- bash -lc 'for i in $(seq 1 30); do systemctl is-active --quiet shturman.target && break; sleep 1; done' 2>/dev/null || true
    echo
    echo "== E2E фаза POST (персист после reboot) =="
    limactl shell --workdir /shturman shturman -- bash -lc 'E2E_PHASE=post bash tests/e2e/run.sh'
    echo
    echo "== E2E OK ✅ =="

# ручная инспекция кадра: headless software-render первого кадра → PNG (без дисплея/композитора, §6)
shell-frame path="target/shell-frame.png":
    cargo run -q -p shturman-shell -- --screenshot {{path}}
    @echo "кадр записан: {{path}}"

# инспекция splash-кадра (Stage 0): headless software-render → PNG
splash-frame path="target/splash-frame.png":
    cargo run -q -p shturman-splash -- --screenshot {{path}}
    @echo "splash записан: {{path}}"
