/**
 * utility-table — построение строк таблицы «Сети» §3 из ТОГО ЖЕ источника, что
 * рисует карта (#1953 unify): osm_utility_infrastructure_ekb через
 * useUtilityInfrastructure → groupUtilityByKind.
 *
 * Почему так: раньше таблица читала data.utilities (osm_noise_sources_ekb,
 * агрегат by_subtype), а карта — osm_utility_infrastructure_ekb. Два разных
 * источника → два разных счётчика («электричество 5 точек», а на карте 10+).
 * Теперь строки таблицы выводятся из ровно тех же сгруппированных features, что
 * рисует UtilityInfrastructureLayer, поэтому count в строке == число объектов
 * этого вида на карте BY CONSTRUCTION (одна и та же Map<UtilityKind, …>).
 *
 * Расстояние per-kind считаем как минимум feature.distance_m среди РИСУЕМЫХ
 * (валидная геометрия) features этого вида — не из summary.nearest_by_kind,
 * который агрегирует по всем features (включая без геометрии), иначе строка
 * могла бы показывать «ближайший 40 м», которого на карте нет.
 *
 * Поля напряжения / диаметра в OSM ОТСУТСТВУЮТ — здесь их нет и не выдумываем.
 */

import type { UtilityInfrastructureFeature } from "@/hooks/useUtilityInfrastructure";
import {
  UTILITY_ALL_KINDS,
  UTILITY_KIND_STYLES,
  groupUtilityByKind,
  type UtilityKind,
} from "@/components/site-finder/UtilityInfrastructureLayer";

export interface UtilityTableRow {
  kind: UtilityKind;
  /** Человеческая подпись вида (электричество/газ/…) — из UTILITY_KIND_STYLES. */
  label: string;
  /** token-hex цвета вида (тот же, что dot на карте/в легенде). */
  color: string;
  /** Кол-во РИСУЕМЫХ объектов этого вида в радиусе — == счётчик карты. */
  count: number;
  /** Ближайшее расстояние, м (минимум по рисуемым features). null — нет объектов. */
  nearestM: number | null;
}

/**
 * Из ответа useUtilityInfrastructure строит строки таблицы «Сети» — по одной на
 * каждый непустой UtilityKind, в порядке UTILITY_ALL_KINDS (power первым).
 * Виды без рисуемых объектов опускаются (graceful — пустая таблица, если совсем
 * ничего; вызывающий показывает empty-state).
 */
export function buildUtilityTableRows(
  features: UtilityInfrastructureFeature[],
): UtilityTableRow[] {
  const grouped = groupUtilityByKind(features);
  const rows: UtilityTableRow[] = [];

  for (const kind of UTILITY_ALL_KINDS) {
    const items = grouped.get(kind) ?? [];
    if (items.length === 0) continue;

    let nearestM: number | null = null;
    for (const { feature } of items) {
      const d = feature.distance_m;
      if (typeof d !== "number" || Number.isNaN(d)) continue;
      if (nearestM === null || d < nearestM) nearestM = d;
    }

    rows.push({
      kind,
      label: UTILITY_KIND_STYLES[kind].label,
      color: UTILITY_KIND_STYLES[kind].color,
      count: items.length,
      nearestM,
    });
  }

  return rows;
}
