-- 170_osm_utility_infrastructure_ekb.sql
-- Context: Таблица инженерных сетей («инженерные сети») Екатеринбурга из OSM (#1746).
--          No-B2B open-data путь: Overpass API. Хранит магистральные линии
--          (ЛЭП, трубопроводы — way → LineString) И точки/узлы (опоры ЛЭП,
--          подстанции, водозаборы, ЦТП, вышки связи — node → Point) для быстрых
--          ST_DWithin-запросов «инж.сети в радиусе участка».
--          Дополняет osm_noise_sources_ekb (там utility-срез завязан на noise-loader);
--          этот слой — самостоятельный, типизированный по infrastructure_kind.
-- Source: Overpass API (power/water/gas/heat/communication queries).
-- Geometry: mixed (LineString для way / Point для node) -> geometry(Geometry, 4326)
-- Dependencies: PostGIS (уже установлен в prod)
-- Deploy order: standalone, нет зависимостей от других таблиц
-- Idempotent: да (IF NOT EXISTS / IF NOT EXISTS на индексах)

BEGIN;

CREATE TABLE IF NOT EXISTS osm_utility_infrastructure_ekb (
    id                   BIGSERIAL PRIMARY KEY,
    osm_id               BIGINT NOT NULL,
    osm_type             TEXT   NOT NULL,   -- 'node' | 'way' | 'relation'
    -- Нормализованный вид инженерной сети:
    -- 'power' | 'water' | 'gas' | 'heat' | 'communication' | 'sewage'
    infrastructure_kind  TEXT   NOT NULL,
    name                 TEXT,
    geom                 GEOMETRY(Geometry, 4326) NOT NULL,  -- линии И точки
    source_tag           TEXT,              -- OSM key=value, по которому элемент пойман
    tags                 JSONB  DEFAULT '{}'::jsonb,
    fetched_at           TIMESTAMPTZ NOT NULL DEFAULT now(),
    UNIQUE (osm_type, osm_id)
);

-- GIST индекс для ST_DWithin / ST_Intersects запросов (инж.сети в радиусе участка)
CREATE INDEX IF NOT EXISTS osm_utility_infrastructure_ekb_geom_idx
    ON osm_utility_infrastructure_ekb USING GIST (geom);

-- Индекс по виду сети для фильтрации (power/water/gas/...)
CREATE INDEX IF NOT EXISTS osm_utility_infrastructure_ekb_kind_idx
    ON osm_utility_infrastructure_ekb (infrastructure_kind);

COMMENT ON TABLE osm_utility_infrastructure_ekb IS
    'Инженерные сети Екатеринбурга из OSM (power/water/gas/heat/communication/sewage). '
    'No-B2B open-data источник: Overpass API. Линии (ЛЭП/трубопроводы) и узлы '
    '(подстанции/водозаборы/ЦТП/вышки связи) для site-finder utility-infrastructure. '
    'Маппинг OSM-тегов -> infrastructure_kind: '
    'backend/app/services/site_finder/utility_infrastructure_loader.py';

COMMENT ON COLUMN osm_utility_infrastructure_ekb.infrastructure_kind IS
    'Нормализованный вид сети: power | water | gas | heat | communication | sewage.';

COMMENT ON COLUMN osm_utility_infrastructure_ekb.source_tag IS
    'OSM key=value, по которому элемент пойман (например power=line, pipeline=gas).';

COMMIT;
