import type { IconName } from "@nodedc/ui-react";

export type RootId =
  | "center"
  | "fleet"
  | "observation"
  | "missions"
  | "data"
  | "polygon"
  | "system";

export type WorkspaceKind =
  | "overview"
  | "device"
  | "spatial"
  | "cameras"
  | "map"
  | "timeline"
  | "missions"
  | "catalog"
  | "lidar-quality"
  | "polygon-datasets";

export type CapabilityStatus = "active" | "ready" | "contract" | "later";

export interface Capability {
  label: string;
  description: string;
  status: CapabilityStatus;
}

export interface CapabilityGroup {
  title: string;
  description: string;
  capabilities: Capability[];
}

export interface WorkspaceDefinition {
  id: string;
  root: RootId;
  label: string;
  title: string;
  eyebrow: string;
  description: string;
  icon: IconName;
  kind: WorkspaceKind;
  internalOnly?: boolean;
  groups: CapabilityGroup[];
}

export interface RootDefinition {
  id: RootId;
  label: string;
  title: string;
  eyebrow: string;
  description: string;
  statement: string;
  accent: string;
}

const active = (label: string, description: string): Capability => ({
  label,
  description,
  status: "active",
});

const ready = (label: string, description: string): Capability => ({
  label,
  description,
  status: "ready",
});

const contract = (label: string, description: string): Capability => ({
  label,
  description,
  status: "contract",
});

const later = (label: string, description: string): Capability => ({
  label,
  description,
  status: "later",
});

export const roots: RootDefinition[] = [
  {
    id: "center",
    label: "Центр",
    title: "Центр управления",
    eyebrow: "ПУНКТ УПРАВЛЕНИЯ",
    description: "Единая оперативная картина, состояние контура и события оператора.",
    statement: "Наблюдать весь контур, быстро видеть отклонения и переходить к действию.",
    accent: "ОПЕРАТИВНЫЙ КОНТУР",
  },
  {
    id: "fleet",
    label: "Парк",
    title: "Аппараты и устройства",
    eyebrow: "ПАРК / УСТРОЙСТВА",
    description: "Реестр аппаратов, локальное подключение, сенсоры и конфигурации борта.",
    statement: "Одинаково подключать одиночный стенд, наземную платформу и будущий рой.",
    accent: "АППАРАТЫ И ПОЛЕЗНАЯ НАГРУЗКА",
  },
  {
    id: "observation",
    label: "Наблюдение",
    title: "Наблюдение",
    eyebrow: "СИТУАЦИОННАЯ ОСВЕДОМЛЁННОСТЬ",
    description: "Пространственная сцена, камеры, карты, объекты, телеметрия и время.",
    statement: "Свести все сенсоры в синхронную и управляемую операторскую картину.",
    accent: "ЗРЕНИЕ И ПРОСТРАНСТВО",
  },
  {
    id: "missions",
    label: "Миссии",
    title: "Миссии",
    eyebrow: "УПРАВЛЕНИЕ МИССИЯМИ",
    description: "Планирование, маршруты, сценарии и наблюдение за исполнением.",
    statement: "Собрать задачу из точек, ограничений и действий до передачи на борт.",
    accent: "ПЛАНИРОВАНИЕ И ИСПОЛНЕНИЕ",
  },
  {
    id: "data",
    label: "Данные",
    title: "Данные и записи",
    eyebrow: "РАБОЧАЯ ОБЛАСТЬ ДАННЫХ",
    description: "Сессии, потоки, сущности, воспроизведение и экспорт доказательств.",
    statement: "Хранить живой контур и воспроизводимый эксперимент как одну модель данных.",
    accent: "ПОТОКИ И ДОКАЗАТЕЛЬСТВА",
  },
  {
    id: "polygon",
    label: "Полигон",
    title: "Полигон",
    eyebrow: "СИМУЛЯЦИЯ И КВАЛИФИКАЦИЯ",
    description: "Датасеты и виртуальные среды для воспроизводимой проверки алгоритмов.",
    statement: "Проверять алгоритмы и поведение машины на версионированных входах.",
    accent: "КВАЛИФИКАЦИЯ И ДОКАЗАТЕЛЬСТВА",
  },
  {
    id: "system",
    label: "Система",
    title: "Система",
    eyebrow: "УПРАВЛЕНИЕ ПЛАТФОРМОЙ",
    description: "Модули, интеграции, сеть, аудит и параметры операторского пункта.",
    statement: "Подключать новые возможности модульно, не связывая интерфейс с одним устройством.",
    accent: "МОДУЛИ И ИНТЕГРАЦИИ",
  },
];

export const workspaces: WorkspaceDefinition[] = [
  {
    id: "polygon-datasets",
    root: "polygon",
    label: "Датасеты",
    title: "Датасеты",
    eyebrow: "ПОЛИГОН / ДАТАСЕТЫ",
    description: "Версионированные входы для replay-регрессии и независимой оценки алгоритмов.",
    icon: "grid",
    kind: "polygon-datasets",
    groups: [],
  },
  {
    id: "command-overview",
    root: "center",
    label: "Оперативный обзор",
    title: "Оперативный обзор",
    eyebrow: "ЦЕНТР / СЕЙЧАС",
    description: "Живое состояние локального контура и быстрые переходы к рабочим поверхностям.",
    icon: "activity",
    kind: "overview",
    groups: [
      {
        title: "Оперативная картина",
        description: "Состояние, которое уже приходит из локального адаптера.",
        capabilities: [
          active("Состояние устройства", "Фаза подключения, адрес и активный режим источника."),
          active("Метрики потока", "Частота кадров, точки в кадре, задержка и пропуски предпросмотра."),
          ready("Единый индикатор готовности", "Нормализованная готовность сенсоров и транспорта."),
        ],
      },
      {
        title: "Будущий контур",
        description: "Сводка нескольких аппаратов без изменения оболочки.",
        capabilities: [
          contract("Парк на карте", "Положение, связь и назначенная миссия каждого аппарата."),
          contract("Очередь тревог", "Отклонения, потери связи и запросы оператора."),
          later("Командные роли", "Разделение наблюдения, планирования и подтверждения действий."),
        ],
      },
    ],
  },
  {
    id: "contour-health",
    root: "center",
    label: "Состояние контура",
    title: "Состояние контура",
    eyebrow: "ЦЕНТР / СОСТОЯНИЕ",
    description: "Сенсоры, транспорт, вычисления и внешние сервисы в одном диагностическом дереве.",
    icon: "shield",
    kind: "catalog",
    groups: [
      {
        title: "Критический путь",
        description: "От физического устройства до операторского интерфейса.",
        capabilities: [
          active("Локальный API", "Проверка состояния, резервный REST-опрос и канал событий WebSocket."),
          active("Приём данных", "Плагинский транспорт, нормализация облака точек и позы."),
          ready("Визуальный движок", "Встроенный веб-визуализатор Rerun ожидает совместимый источник."),
          contract("Бортовой шлюз", "Будущий транспортный адаптер между ROS 2/Zenoh и пунктом управления."),
        ],
      },
    ],
  },
  {
    id: "operator-activity",
    root: "center",
    label: "Активность",
    title: "Активность оператора",
    eyebrow: "ЦЕНТР / АКТИВНОСТЬ",
    description: "Хронология подключений, запусков, остановок и изменений конфигурации.",
    icon: "list",
    kind: "timeline",
    groups: [
      {
        title: "События",
        description: "Операции интерфейса и ответы локального контура.",
        capabilities: [
          active("Текущие статусы", "REST и WebSocket уже передают фазу и текст операции."),
          contract("Журнал действий", "Нормализованные события с пользователем, временем и результатом."),
          later("Подпись подтверждений", "Аудит опасных команд и изменение полномочий."),
        ],
      },
    ],
  },
  {
    id: "vehicles",
    root: "fleet",
    label: "Аппараты",
    title: "Реестр аппаратов",
    eyebrow: "ПАРК / РЕЕСТР",
    description: "Нейтральный реестр наземных, воздушных и стационарных платформ.",
    icon: "apps",
    kind: "catalog",
    groups: [
      {
        title: "Идентичность аппарата",
        description: "Никакой привязки продуктовой модели к конкретному производителю.",
        capabilities: [
          ready("Локальный стенд", "Первый аппарат представлен текущим устройством и его адаптером."),
          contract("Паспорт борта", "Тип, серийный профиль, вычислитель, питание и транспорт."),
          contract("Состояние доступности", "Онлайн, занят, обслуживание, потеря связи."),
          later("Группы и рои", "Логические группы, роли и совместное назначение миссий."),
        ],
      },
    ],
  },
  {
    id: "local-device",
    root: "fleet",
    label: "Локальное устройство",
    title: "Локальное устройство",
    eyebrow: "ПАРК / ТЕКУЩИЙ АДАПТЕР",
    description: "Выбор модели, сценарий установленного плагина и запуск доступного потока.",
    icon: "network",
    kind: "device",
    groups: [],
  },
  {
    id: "payload",
    root: "fleet",
    label: "Сенсоры и каналы",
    title: "Сенсоры и каналы",
    eyebrow: "ПАРК / ПОЛЕЗНАЯ НАГРУЗКА",
    description: "Полезная нагрузка аппарата и каналы данных, которые она публикует.",
    icon: "grid",
    kind: "catalog",
    groups: [
      {
        title: "Пространственные сенсоры",
        description: "Единый контракт для разных источников.",
        capabilities: [
          active("Облако точек", "Доказанный декодированный поток точек текущего устройства."),
          active("Поза и траектория", "Доказанный поток позы и накопление пути."),
          contract("Камеры", "Изображение, видео, глубина, внутренние и внешние параметры."),
          contract("Навигация", "IMU, GNSS/RTK, одометрия и система координат."),
        ],
      },
    ],
  },
  {
    id: "configurations",
    root: "fleet",
    label: "Компоновки",
    title: "Компоновки борта",
    eyebrow: "ПАРК / КОМПОНОВКИ",
    description: "Версионируемые сочетания сенсоров, вычислителей, транспорта и питания.",
    icon: "settings",
    kind: "catalog",
    groups: [
      {
        title: "Шаблон компоновки",
        description: "Повторяемая конфигурация для одинаковых аппаратов.",
        capabilities: [
          contract("Состав модулей", "Сенсоры, адаптеры, обработчики и зависимости."),
          contract("Калибровки", "Системы координат, преобразования, внутренние и внешние параметры."),
          contract("Профиль сети", "Локальная сеть, ячеистая сеть, LTE и серверный маршрут."),
          later("Развёртывание на борт", "Пакет конфигурации и контролируемое обновление."),
        ],
      },
    ],
  },
  {
    id: "spatial-scene",
    root: "observation",
    label: "Пространственная сцена",
    title: "Пространственная сцена",
    eyebrow: "НАБЛЮДЕНИЕ / ЭФИР",
    description: "Облако точек, траектория, преобразования и пространственные слои в единой 3D-сцене.",
    icon: "globe",
    kind: "spatial",
    groups: [
      {
        title: "Базовая геометрия",
        description: "Главный контур реального времени текущего этапа.",
        capabilities: [
          ready("Облако точек (Points3D)", "Точки, радиус, интенсивность, градиент и накопление."),
          ready("Траектории (LineStrips3D)", "Траектория аппарата, маршруты и границы."),
          ready("Преобразования (Transform3D)", "Дерево координат, поза и области обзора камер."),
          contract("Поверхности и глубина", "Сетки, карты глубины и восстановленная геометрия."),
        ],
      },
      {
        title: "Управление сценой",
        description: "Функции движка перераспределены в интерфейс пункта управления.",
        capabilities: [
          contract("Выбор сущности", "Выбор объекта в сцене и синхронный инспектор."),
          contract("Переопределения", "Видимость, цвет, радиус, подписи и порядок отрисовки."),
          contract("Компоновка (Blueprint)", "Сохранение и загрузка продуктовой компоновки представлений."),
          contract("2D / 3D / карта", "Синхронное переключение пространственных представлений."),
        ],
      },
    ],
  },
  {
    id: "cameras",
    root: "observation",
    label: "Камеры",
    title: "Камеры",
    eyebrow: "НАБЛЮДЕНИЕ / КАМЕРЫ",
    description: "Синхронные каналы видео, изображений и глубины с пространственной разметкой.",
    icon: "video",
    kind: "cameras",
    groups: [
      {
        title: "Изображение",
        description: "Встроенные классы 2D-представления.",
        capabilities: [
          contract("Изображение и видео (Image / Video)", "Живые кадры и кодированное видео на общей временной шкале."),
          contract("Карта глубины (DepthImage)", "Глубина с цветовой шкалой и масштабом в метрах."),
          contract("Перспективная камера (Pinhole)", "Калибровка, разрешение и проекция 3D↔2D."),
          contract("Тензоры (TensorView)", "Отладка карт признаков и многомерных выходов моделей."),
        ],
      },
    ],
  },
  {
    id: "world-map",
    root: "observation",
    label: "Карта",
    title: "Карта и поверхность",
    eyebrow: "НАБЛЮДЕНИЕ / КАРТА",
    description: "Географическая, высотная и локальная карта для аппарата и миссии.",
    icon: "globe",
    kind: "map",
    groups: [
      {
        title: "Представления карты",
        description: "Один интерфейс для глобальной и локальной геометрии.",
        capabilities: [
          contract("Геоточки и линии (GeoPoints / GeoLineStrings)", "Положение аппарата, трек, геозоны и маршруты."),
          contract("Карта высот (GridMap)", "Высота, уклон, неровность и проходимость."),
          contract("Воксельная карта (VoxelGridMap)", "Объёмные занятые и свободные области."),
          later("Картографический модуль", "Подключение grid_map, OctoMap или nvblox по профилю борта."),
        ],
      },
    ],
  },
  {
    id: "objects",
    root: "observation",
    label: "Объекты и разметка",
    title: "Объекты и разметка",
    eyebrow: "НАБЛЮДЕНИЕ / РАЗМЕТКА",
    description: "Детекции, сегментация, ключевые точки и связи — без привязки к конкретной модели.",
    icon: "panel",
    kind: "catalog",
    groups: [
      {
        title: "Примитивы восприятия",
        description: "Готовые визуальные контракты; алгоритмы подключаются отдельными обработчиками.",
        capabilities: [
          contract("Рамки 2D / 3D (Boxes)", "Объекты в камере и пространстве с классом и уверенностью модели."),
          contract("Сегментация (SegmentationImage)", "Семантические и объектные маски поверх видеокадра."),
          contract("Ключевые точки (Points2D)", "Скелеты, ориентиры и траектории признаков."),
          contract("Граф связей (GraphView)", "Связи между объектами, сценами и состояниями."),
          later("Модули восприятия", "Детекторы и трекеры не входят в текущий этап интерфейса."),
        ],
      },
    ],
  },
  {
    id: "telemetry",
    root: "observation",
    label: "Телеметрия",
    title: "Телеметрия",
    eyebrow: "НАБЛЮДЕНИЕ / СИГНАЛЫ",
    description: "Числовые сигналы, состояния и диагностические таблицы на общей временной оси.",
    icon: "activity",
    kind: "catalog",
    groups: [
      {
        title: "Временные представления",
        description: "Встроенные классы для чисел, состояний и таблиц.",
        capabilities: [
          active("Метрики потока в реальном времени", "Время до Rerun SDK, частота кадров, число точек и пропуски предпросмотра."),
          contract("Временные ряды (TimeSeriesView)", "Скалярные серии, несколько линий и диапазоны."),
          contract("Шкала состояний (StateTimelineView)", "Переходы режимов, ошибки и статусы подсистем."),
          contract("Таблица данных (DataframeView)", "Табличная диагностика и атрибуты сущностей."),
          contract("Столбчатая диаграмма (BarChartView)", "Распределения и компактные сравнения."),
        ],
      },
    ],
  },
  {
    id: "sensor-time",
    root: "observation",
    label: "Временная шкала",
    title: "Временная шкала",
    eyebrow: "НАБЛЮДЕНИЕ / ВРЕМЯ",
    description: "Синхронная навигация по кадрам, событиям, сенсорам и выбранным сущностям.",
    icon: "list",
    kind: "timeline",
    groups: [
      {
        title: "Управление временем",
        description: "Единая шкала для реального времени и воспроизведения.",
        capabilities: [
          ready("Время и последовательность", "Наносекундное время или порядковые номера кадров."),
          ready("Пуск, пауза и переход", "API движка поддерживает управление воспроизведением."),
          contract("Синхронный выбор", "Кадр, точка, объект и телеметрия в одной позиции времени."),
          contract("Следовать за эфиром", "Автоматическое удержание последнего события."),
        ],
      },
    ],
  },
  {
    id: "mission-planner",
    root: "missions",
    label: "Планировщик",
    title: "Планировщик миссии",
    eyebrow: "МИССИИ / ЧЕРНОВИК",
    description: "Черновик миссии, аппараты, зона, маршрут, действия и ограничения.",
    icon: "edit",
    kind: "missions",
    groups: [
      {
        title: "Состав миссии",
        description: "Продуктовый контракт без отправки команд на борт.",
        capabilities: [
          contract("Назначение аппарата", "Один аппарат сейчас, несколько — в будущем."),
          contract("Зона и маршрут", "Точки, коридор, высота/скорость и геозоны."),
          contract("Полезная нагрузка", "Запуск сенсоров и требуемые выходные данные."),
          later("Проверка выполнимости", "Расчёт энергии, связи, столкновений и резервов."),
        ],
      },
    ],
  },
  {
    id: "routes",
    root: "missions",
    label: "Маршруты и точки",
    title: "Маршруты и точки",
    eyebrow: "МИССИИ / МАРШРУТЫ",
    description: "Библиотека маршрутов по точкам, геозон и областей обследования.",
    icon: "globe",
    kind: "map",
    groups: [
      {
        title: "Геометрия задания",
        description: "Маршрут является отдельной версионируемой сущностью.",
        capabilities: [
          contract("Маршрутные точки", "Порядок, допуск, скорость и действие в точке."),
          contract("Коридоры", "Допустимый пространственный коридор движения."),
          contract("Области", "Области обхода, обследования и запрета."),
          later("Импорт карт", "Внешние форматы после выбора геодезической модели."),
        ],
      },
    ],
  },
  {
    id: "scenarios",
    root: "missions",
    label: "Сценарии",
    title: "Сценарии",
    eyebrow: "МИССИИ / СЦЕНАРИИ",
    description: "Переиспользуемые последовательности действий и реакции на события.",
    icon: "apps",
    kind: "catalog",
    groups: [
      {
        title: "Поведение",
        description: "Интерфейсный контракт будущего исполнителя миссий.",
        capabilities: [
          contract("Последовательность", "Взлёт/старт, маршрут, наблюдение, возврат."),
          contract("Условия", "Событие сенсора, качество связи, заряд и таймаут."),
          contract("Ветвление", "Повтор, переход, безопасная остановка."),
          later("Исполнитель на борту", "Автономное выполнение без сервера и интерфейса."),
        ],
      },
    ],
  },
  {
    id: "execution",
    root: "missions",
    label: "Исполнение",
    title: "Исполнение миссии",
    eyebrow: "МИССИИ / ИСПОЛНЕНИЕ",
    description: "Наблюдение за ходом миссии и корректировки в разрешённых границах.",
    icon: "activity",
    kind: "timeline",
    groups: [
      {
        title: "Оперативное исполнение",
        description: "Интерфейс не входит в контур стабилизации или аварийного торможения.",
        capabilities: [
          contract("Прогресс", "Текущий этап, точка, отклонение и оценка завершения."),
          contract("События", "Предупреждения, отклонения и запросы подтверждения."),
          contract("Безопасные корректировки", "Пауза, продолжение и новая цель верхнего уровня."),
          later("Командный канал", "Появится только после отдельной проверки безопасности."),
        ],
      },
    ],
  },
  {
    id: "sessions",
    root: "data",
    label: "Сессии и записи",
    title: "Сессии и записи",
    eyebrow: "ДАННЫЕ / ЗАПИСИ",
    description: "Живые и записанные эксперименты с воспроизводимым набором потоков.",
    icon: "folder",
    kind: "catalog",
    groups: [
      {
        title: "Артефакты",
        description: "Сохраняется политика «сначала исходные данные».",
        capabilities: [
          active("Нативные захваты", "Сырые конверты устройства и обезличенный манифест."),
          active("Воспроизведение", "Повтор исходной записи через адаптер выбранной модели."),
          ready("Запись RRD", "Совместимая запись Rerun после появления потокового адаптера."),
          ready("Компоновка RBL", "Версионируемая компоновка визуализатора рядом с кодом."),
        ],
      },
    ],
  },
  {
    id: "streams",
    root: "data",
    label: "Потоки",
    title: "Потоки данных",
    eyebrow: "ДАННЫЕ / ПОТОКИ",
    description: "Каталог источников, транспортов, частот, задержек и схем.",
    icon: "network",
    kind: "catalog",
    groups: [
      {
        title: "Транспорт",
        description: "Источник отделён от визуального представления.",
        capabilities: [
          active("Плагинский вход", "Локальный поток активной модели устройства."),
          active("Управление REST / WebSocket", "Состояние и управляющие операции локального адаптера."),
          ready("Rerun gRPC", "Нативный источник реального времени для встроенного веб-визуализатора."),
          ready("RRD по HTTP", "Открытие одной или нескольких записей."),
          later("ROS 2 / Zenoh", "Бортовой и межсетевой транспорт следующего этапа."),
        ],
      },
    ],
  },
  {
    id: "lidar-quality",
    root: "fleet",
    label: "Диагностика LiDAR",
    title: "Диагностика LiDAR",
    eyebrow: "ПАРК / СЕНСОРЫ / LIDAR",
    description:
      "Состояние данных и качество записей выбранного LiDAR.",
    icon: "activity",
    kind: "lidar-quality",
    groups: [],
  },
  {
    id: "entities",
    root: "data",
    label: "Слои и сущности",
    title: "Слои и сущности",
    eyebrow: "ДАННЫЕ / СУЩНОСТИ",
    description: "Единое дерево аппаратов, сенсоров, объектов, пространств и визуальных переопределений.",
    icon: "list",
    kind: "catalog",
    groups: [
      {
        title: "Модель сущностей",
        description: "Продуктовая оболочка поверх путей сущностей Rerun.",
        capabilities: [
          contract("Иерархия", "Аппарат → сенсор → поток → сущность."),
          contract("Видимость", "Включение слоя, режим соло и временное скрытие."),
          contract("Выбор сущности", "Выбранная сущность синхронизирует сцену и инспектор."),
          contract("Переопределения", "Цвет, радиус, подписи и представление на уровне сущности."),
        ],
      },
    ],
  },
  {
    id: "playback",
    root: "data",
    label: "Воспроизведение",
    title: "Воспроизведение",
    eyebrow: "ДАННЫЕ / ВОСПРОИЗВЕДЕНИЕ",
    description: "Открытие записи, выбор временной шкалы, диапазона и синхронный разбор события.",
    icon: "video",
    kind: "timeline",
    groups: [
      {
        title: "API воспроизведения",
        description: "Движок уже предоставляет программный контроль времени.",
        capabilities: [
          ready("Открыть / закрыть запись", "Адрес RRD или источник Rerun gRPC."),
          ready("Активная запись", "Выбор одной записи среди нескольких."),
          ready("Шкала времени и диапазон", "Переключение времени и чтение границ."),
          ready("Воспроизведение, пауза и переход", "Программное управление воспроизведением."),
          contract("Сравнение прогонов", "Синхронный разбор нескольких записей."),
        ],
      },
    ],
  },
  {
    id: "exports",
    root: "data",
    label: "Экспорт",
    title: "Экспорт",
    eyebrow: "ДАННЫЕ / ЭКСПОРТ",
    description: "Контролируемый экспорт записей, компоновок, кадров и отчётов.",
    icon: "download",
    kind: "catalog",
    groups: [
      {
        title: "Выходные артефакты",
        description: "Экспорт не подменяет файлы исходных данных.",
        capabilities: [
          contract("RRD", "Переносимая запись визуализируемых данных."),
          contract("RBL", "Версионируемая компоновка."),
          contract("Кадр / снимок", "Операторский снимок выбранного момента."),
          active("Обезличенный манифест", "Безопасный индекс чувствительных локальных артефактов."),
        ],
      },
    ],
  },
  {
    id: "modules",
    root: "system",
    label: "Вычислительные модули",
    title: "Вычислительные модули",
    eyebrow: "СИСТЕМА / МОДУЛИ",
    description: "Контракты будущих вычислительных модулей без их запуска на текущем интерфейсном этапе.",
    icon: "apps",
    kind: "catalog",
    groups: [
      {
        title: "Вычислительные роли",
        description: "Каждый модуль публикует стандартные выходы, интерфейс только отображает их.",
        capabilities: [
          active("Адаптер устройства", "Закрытый протокол текущего устройства уже изолирован."),
          contract("Восприятие", "Рамки, маски, ключевые точки, траектории и семантические подписи."),
          contract("Картирование", "Высота, занятость, сетки и проходимость."),
          contract("Локализация", "Поза, одометрия, TF и неопределённость."),
          contract("Исполнитель миссий", "Состояние графа миссии и действия верхнего уровня."),
        ],
      },
    ],
  },
  {
    id: "integrations",
    root: "system",
    label: "Интеграции",
    title: "Интеграции",
    eyebrow: "СИСТЕМА / ИНТЕГРАЦИИ",
    description: "Адаптеры данных и внешние контуры с явной границей ответственности.",
    icon: "network",
    kind: "catalog",
    groups: [
      {
        title: "Точки интеграции",
        description: "Внешние системы не определяют продуктовую навигацию.",
        capabilities: [
          active("Локальный API устройства", "Текущий контур управления FastAPI."),
          ready("Визуализатор Rerun", "Открытый веб-визуализатор встроен в пространственную рабочую поверхность."),
          contract("Мост ROS 2", "Стандартные PointCloud2, Pose, Odometry, TF и диагностика."),
          contract("Шлюз Zenoh", "Маршрутизация разрешённых потоков между бортом и сервером."),
          later("Сервисы парка", "Задачи, зарядки и координация нескольких аппаратов."),
        ],
      },
    ],
  },
  {
    id: "network",
    root: "system",
    label: "Сеть",
    title: "Сеть",
    eyebrow: "СИСТЕМА / СЕТЬ",
    description: "Локальный контур, бортовая сеть, ячеистая сеть/LTE и серверные маршруты.",
    icon: "globe",
    kind: "catalog",
    groups: [
      {
        title: "Сетевые зоны",
        description: "Потоки управления и высокой пропускной способности разделяются архитектурно.",
        capabilities: [
          active("Локальная сеть", "Устройство и рабочая станция в одной доступной сети."),
          active("Локальное управление", "Точка приёма учётных данных и браузерный контур управления ограничены локальным хостом."),
          contract("Бортовая сеть", "Сенсоры, вычислитель и маршрутизатор внутри аппарата."),
          contract("Дальний транспорт", "Ячеистая сеть или LTE передаёт предпросмотр, позу, события и изменения карты."),
        ],
      },
    ],
  },
  {
    id: "audit",
    root: "system",
    label: "Журнал и аудит",
    title: "Журнал и аудит",
    eyebrow: "СИСТЕМА / АУДИТ",
    description: "Технические события, действия оператора и воспроизводимость эксперимента.",
    icon: "clipboard",
    kind: "timeline",
    groups: [
      {
        title: "Доказательность",
        description: "Git хранит код, обезличенные метаданные и правила воспроизведения.",
        capabilities: [
          active("Первичное сохранение сырья", "Сырые сообщения сохраняются до декодирования предпросмотра."),
          active("Манифест сессии", "Версии, хэши и обезличенные сведения о прогоне."),
          contract("События аудита интерфейса", "Переходы, операции и подтверждения пользователя."),
          later("Центральный сервис аудита", "Поиск и корреляция событий нескольких аппаратов."),
        ],
      },
    ],
  },
  {
    id: "settings",
    root: "system",
    label: "Настройки",
    title: "Настройки пункта управления",
    eyebrow: "СИСТЕМА / НАСТРОЙКИ",
    description: "Компоновки, визуальные профили, ограничения ресурсов и локальные параметры.",
    icon: "settings",
    kind: "catalog",
    groups: [
      {
        title: "Рабочая область",
        description: "Настройки не смешиваются с конфигурацией физического аппарата.",
        capabilities: [
          contract("Профили компоновки", "Компоновки представлений для наблюдения, разбора и миссий."),
          contract("Визуальные профили", "Градиенты, размеры, фон, сетка и подписи."),
          ready("Ограничение памяти визуализатора", "Контроль объёма потоковых и записанных данных."),
          contract("Локальные предпочтения", "Тема, единицы и поведение панелей."),
        ],
      },
    ],
  },
];

export function rootById(id: RootId | null): RootDefinition | null {
  return id ? roots.find((root) => root.id === id) ?? null : null;
}

export function workspaceById(id: string | null): WorkspaceDefinition | null {
  return id ? workspaces.find((workspace) => workspace.id === id) ?? null : null;
}

export function workspacesForRoot(root: RootId | null): WorkspaceDefinition[] {
  return root
    ? workspaces.filter((workspace) => workspace.root === root && !workspace.internalOnly)
    : [];
}

export const capabilityStatusLabel: Record<CapabilityStatus, string> = {
  active: "Работает",
  ready: "Готово к данным",
  contract: "Интерфейс готов",
  later: "Следующий этап",
};
