# yaml-language-server: $schema=https://taskfile.dev/schema.json
#
# Запуск команд проекта через Task (https://taskfile.dev).
# Список задач: `task --list`.

version: '3'

vars:
  BINARY: healthlog
  PKG: ./cmd/healthlog
  # Версии инструментов для воспроизводимой установки (см. задачу setup).
  GOLANGCI_VERSION: v2.12.2
  # Проверка раскладки документов по канону av-dev-pm. Пусто — путь ищется в
  # кеше плагинов (версия в пути меняется при обновлении, поэтому не зашита).
  DOCS_PY: '{{.DOCS_PY | default ""}}'

tasks:
  default:
    desc: Список доступных задач
    cmds:
      - task --list
    silent: true

  run:
    desc: 'Локальный запуск (config.toml не обязателен — есть умолчания)'
    cmds:
      - go run {{.PKG}} --config ./config.toml | hl

  build:
    desc: Статический бинарь linux/amd64 для сервера
    cmds:
      - CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -trimpath -ldflags='-s -w' -o {{.BINARY}} {{.PKG}}

  test:
    desc: Прогон тестов
    cmds:
      - go test ./...

  verify:archive:
    desc: 'Сходимость на живом архиве: весь ./data/raw через разбор, повторный прогон обязан дать то же состояние'
    cmds:
      # Не входит в `task test` и `task gate` намеренно: архив в репозиторий не
      # попадает, прогон занимает минуту, и держать его на каждом гейте значит
      # платить за проверку, которая возможна только на этой машине.
      - go test ./internal/replay -run TestReplay -healthlog.archive={{.ARCHIVE | default (printf "%s/data/raw" .ROOT_DIR)}} -v -count=1

  verify:busy:
    desc: 'Свёртка под удерживаемой блокировкой базы: занятость обязана оставить доставку в очереди (около 25 секунд)'
    cmds:
      # Не входит в `task test` и `task gate` намеренно: busy_timeout — пять
      # секунд, повторов транзакции пять, и гейт гоняет тесты трижды. Проверяет
      # при этом центральное решение задачи «разнести ответ и свёртку»:
      # занятость базы — обстоятельство, а не свойство доставки.
      - go test ./internal/fold -run TestBusy -healthlog.busy -v -count=1

  lint:
    desc: Запуск golangci-lint
    cmds:
      - golangci-lint run

  up:
    desc: 'Собрать и поднять сервис в контейнере (данные в ./data переживают пересборку)'
    deps: [build]
    cmds:
      - docker compose up -d --build
      - task: wait

  down:
    desc: Остановить контейнер
    cmds:
      - docker compose down

  restart:
    desc: 'Пересобрать бинарь и перезапустить сервис — основной цикл разработки'
    deps: [build]
    cmds:
      - docker compose up -d --build
      - task: wait

  wait:
    desc: 'Дождаться, пока сервис ответит на /healthz'
    internal: true
    cmds:
      - |
        for i in $(seq 1 30); do
          if curl -fsS --max-time 2 http://127.0.0.1:8080/healthz >/dev/null 2>&1; then
            echo "healthlog отвечает на :8080"; exit 0
          fi
          sleep 1
        done
        echo "healthlog не поднялся за 30 секунд, смотри: task logs" >&2
        exit 1

  logs:
    desc: 'Логи сервиса (LINES=N — сколько строк, по умолчанию 50)'
    vars:
      LINES: '{{.LINES | default "50"}}'
    cmds:
      - docker compose logs --tail {{.LINES}} healthlog

  ps:
    desc: Состояние контейнера
    cmds:
      - docker compose ps

  gate:
    desc: 'Детерминированный гейт ревью: build/vet/lint/test/race/покрытие диффа/миграции/секреты/раскладка документов. BASE=<rev> — база диффа'
    cmds:
      - python3 scripts/gate.py {{.BASE}}
      # Раскладка документов по канону av-dev-pm. Путь переопределяется
      # переменной DOCS_PY — переустановка плагина не должна править Taskfile.
      # Шаг обязан краснеть внятно, если скрипта нет: молча пропущенная
      # проверка раскладки хуже отсутствующей.
      - |
        ds="{{.DOCS_PY}}"
        if [ -z "$ds" ]; then
          ds=$(ls -t "$HOME"/.claude/plugins/cache/*/av-dev-pm/*/skills/canon/scripts/docs.py 2>/dev/null | head -1)
        fi
        if [ -z "$ds" ] || [ ! -f "$ds" ]; then
          echo "гейт: docs.py не найден"
          echo "  плагин av-dev-pm не установлен либо переехал —"
          echo "  поставь его или задай DOCS_PY=<путь> при вызове task gate"
          exit 1
        fi
        python3 "$ds" check --dir . {{if .BASE}}--base {{.BASE}}{{end}}

  review:context:
    desc: 'Вход для архитектурного прохода ревью: пакеты, граф зависимостей, инвентарь концепций'
    cmds:
      - python3 scripts/review-context.py

  tidy:
    desc: go mod tidy
    cmds:
      - go mod tidy

  clean:
    desc: Удалить собранный бинарь
    cmds:
      - rm -f {{.BINARY}}

  setup:
    desc: Установка инструментов разработки
    cmds:
      - go install github.com/golangci/golangci-lint/v2/cmd/golangci-lint@{{.GOLANGCI_VERSION}}
