-- 85_pzz_zones_ekb.sql
-- Таблица территориальных зон ЕКБ из Росреестр PKK6 (Публичная кадастровая карта).
--
-- Данные: ArcGIS REST https://pkk.rosreestr.ru/arcgis/rest/services/PKK6/ZONES/MapServer/5/query
-- Загружается через Celery task tasks.pzz_sync.sync_pzz_zones_ekb
-- (ad-hoc: POST /api/v1/admin/scrape/pzz-sync).
--
-- Зависимости: PostGIS (уже установлен); PostgreSQL 15+ для UNIQUE NULLS NOT
--   DISTINCT на rosreestr_id (prod — PG16, postgis/postgis:16-3.4).
-- Применять: psql gendesign < data/sql/85_pzz_zones_ekb.sql

BEGIN;

CREATE TABLE IF NOT EXISTS pzz_zones_ekb (
    id           BIGSERIAL PRIMARY KEY,
    rosreestr_id BIGINT,                           -- OBJECTID из PKK6
    zone_code    TEXT,                             -- "Ж-2.1", "ОД-1" и т.д.
    zone_name    TEXT,                             -- полное наименование зоны
    description  TEXT,
    raw_props    JSONB DEFAULT '{}'::jsonb,
    geom         GEOMETRY(MultiPolygon, 4326) NOT NULL,
    fetched_at   TIMESTAMPTZ NOT NULL DEFAULT now(),
    -- NULLS NOT DISTINCT (PG15+): rosreestr_id nullable (PKK6 при f=geojson иногда
    -- кладёт OBJECTID в feature-level id, а не в properties → loader получает NULL).
    -- Без этого NULL != NULL в обычном UNIQUE → ON CONFLICT (rosreestr_id) НЕ матчит
    -- существующие NULL-строки → каждый повторный sync копит дубли зон (#1361).
    -- Прецедент в репо: м.110 (uq_infra_dedupe), м.125, м.140.
    UNIQUE NULLS NOT DISTINCT (rosreestr_id)
);

CREATE INDEX IF NOT EXISTS pzz_zones_ekb_geom_idx ON pzz_zones_ekb USING GIST(geom);
CREATE INDEX IF NOT EXISTS pzz_zones_ekb_code_idx ON pzz_zones_ekb (zone_code);

COMMENT ON TABLE pzz_zones_ekb IS
    'Территориальные зоны ЕКБ из Росреестр PKK6 (Public Cadastral Map). '
    'Содержит границы зон + код/имя. '
    'Регламенты (max_height, FAR) — отдельно через pzz_regulations.';

COMMIT;
