-- 159_alter_cad_territorial_zones_multipolygon.sql
-- ---------------------------------------------------------------------------
-- Контекст:
--   NSPD ПЗЗ территориальные зоны (layer 875838) зачастую возвращают
--   MultiPolygon (у зоны несколько геометрических контуров). Колонка
--   cad_territorial_zones.geom = GEOGRAPHY(POLYGON, 4326) strict → INSERT
--   падал через SAVEPOINT в per-row begin_nested() и строки молча дропались.
--
--   Поведение зеркалит cad_zouit (фикс в 93_cad_parcels_geom_multipolygon.sql
--   как прецедент); патч _save_territorial_zones аналогичен upsert_zouit.
--
-- Действия:
--   1. ALTER COLUMN geom TYPE geography(MultiPolygon, 4326)
--      USING ST_Multi(geom::geometry)::geography
--      — lossless conversion существующих Polygon-строк в MultiPolygon.
--   2. DROP + CREATE GIST-индекса (ALTER TYPE требует пересоздания индекса
--      для geography-колонки).
--
-- Idempotent: DO $$...END$$ проверяет текущий type по geometry_columns
-- (geography тоже попадает через postgis_topology_views). Если уже
-- MultiPolygon — пропускает ALTER; GIST пересоздаётся DROP IF EXISTS + IF NOT EXISTS.
--
-- Зависимые VIEW: нет (проверено grep data/sql/ и backend/).
-- Apply after: 158_pzz_zones_ekb_nulls_not_distinct.sql
-- ---------------------------------------------------------------------------

BEGIN;

-- 1. ALTER COLUMN: POLYGON → MULTIPOLYGON (idempotent через geometry_columns)
DO $$
DECLARE
    current_type TEXT;
BEGIN
    SELECT upper(type) INTO current_type
    FROM geometry_columns
    WHERE f_table_name = 'cad_territorial_zones'
      AND f_geometry_column = 'geom';

    IF current_type = 'POLYGON' THEN
        ALTER TABLE cad_territorial_zones
            ALTER COLUMN geom TYPE geography(MultiPolygon, 4326)
            USING ST_Multi(geom::geometry)::geography;
        RAISE NOTICE 'cad_territorial_zones.geom converted POLYGON -> MULTIPOLYGON (rows: %)',
            (SELECT COUNT(*) FROM cad_territorial_zones WHERE geom IS NOT NULL);
    ELSE
        RAISE NOTICE 'cad_territorial_zones.geom type=% — skip ALTER', current_type;
    END IF;
END$$;

-- 2. GIST индекс — DROP + CREATE (тип column изменился, индекс пересоздаём)
DROP INDEX IF EXISTS cad_territorial_zones_geom_gist;
CREATE INDEX IF NOT EXISTS cad_territorial_zones_geom_gist
    ON cad_territorial_zones USING GIST (geom);

COMMIT;
