-- 141_okn_objects.sql
-- #1066 (Site Finder v2 / GG-форсайт) — объекты культурного наследия (ОКН/памятники)
-- ЕКБ и Свердловской обл. из АИС ЕГРКН Минкультуры.
--
-- Источник: https://okn-mk.mkrf.ru/Maps/searchMap (POST, application/x-www-form-urlencoded)
-- Формат ответа: GeoJSON FeatureCollection с полями id + coordinates[lat, lon] (Яндекс-порядок).
--
-- Обновляется еженедельно воркером okn_objects_sync (tasks/okn_objects_sync.py).
-- Ключ дедупликации: source_id (id фичи карты ЕГРКН).
-- Категория берётся из прохода по cob_category_type=1/2/4 (federal/regional/local).
--
-- Deploy: auto-applied deploy.yml через _schema_migrations (ровно один раз по NN).
-- Idempotent (CREATE TABLE/INDEX IF NOT EXISTS + guarded DO-блоки по pg_constraint).
-- Без INSERT — данные приходят из Celery-воркера.

BEGIN;

-- ── 1. Таблица okn_objects ────────────────────────────────────────────────────
CREATE TABLE IF NOT EXISTS okn_objects (
    id          BIGSERIAL PRIMARY KEY,
    source_id   TEXT        NOT NULL,           -- id фичи из ЕГРКН карты (дедуп)
    category    TEXT,                           -- 'federal' | 'regional' | 'local'
    geom        geometry(Point, 4326) NOT NULL, -- WGS84 точка (lon, lat)
    raw_props   JSONB,                          -- сырые props GeoJSON-фичи
    fetched_at  TIMESTAMPTZ NOT NULL DEFAULT now()
);

COMMENT ON TABLE okn_objects IS
    'Объекты культурного наследия (ОКН/памятники) ЕКБ и Свердловской обл. (#1066). '
    'Источник: АИС ЕГРКН Минкультуры (okn-mk.mkrf.ru/Maps/searchMap). '
    'Обновляется еженедельно воркером okn_objects_sync.';

COMMENT ON COLUMN okn_objects.source_id IS
    'id фичи из GeoJSON ответа карты ЕГРКН. Используется как ключ дедупликации.';
COMMENT ON COLUMN okn_objects.category IS
    'Категория ОКН: federal (cob_category_type=1), regional (=2), local (=4).';
COMMENT ON COLUMN okn_objects.geom IS
    'Точка в WGS84 (EPSG:4326). Координаты из ЕГРКН [lat, lon] перевёрнуты: '
    'ST_MakePoint(coordinates[1], coordinates[0]).';

-- ── 2. UNIQUE по source_id — ключ дедупликации для UPSERT ────────────────────
DO $$
BEGIN
    IF NOT EXISTS (
        SELECT 1 FROM pg_constraint WHERE conname = 'uq_okn_objects_source_id'
    ) THEN
        ALTER TABLE okn_objects
            ADD CONSTRAINT uq_okn_objects_source_id UNIQUE (source_id);
    END IF;
END
$$;

-- ── 3. GIST-индекс по геометрии (ST_DWithin / пространственный lookup) ────────
CREATE INDEX IF NOT EXISTS idx_okn_objects_geom
    ON okn_objects USING GIST (geom);

-- ── 4. Индекс по категории (фильтрация по federal/regional/local) ─────────────
CREATE INDEX IF NOT EXISTS idx_okn_objects_category
    ON okn_objects (category);

-- ── 5. Индекс по свежести данных ─────────────────────────────────────────────
CREATE INDEX IF NOT EXISTS idx_okn_objects_fetched_at
    ON okn_objects (fetched_at DESC);

COMMIT;
