create schema if not exists gis;

CREATE TABLE if not exists gis.services
(
  service_id text NOT NULL DEFAULT next_id(),
  name text NOT NULL, -- Назва сервісу
  service_key text, -- Унікальний ключ
  description text, -- Опис сервісу
  keywords text[], -- Ключові слова
  category text, -- Категорія сервісу
  service_type text NOT NULL, -- Тип сервісу
  holder text, -- (Опційно) Власник/Утримучач/Відповідальний
  version text DEFAULT '1.0.0'::text, -- Версія сервісу
  source_type text, -- Тип джерела
  service_url text, -- Поислання на сервіс (якщо source_type = 'service')
  source_path text, -- Шлях до файлу або таблиця в БД
  query text, -- Умова для сервісу
  geom_type text, -- Тип геометрії для цього шару
  geometry_column text, -- Назва колонки гемотрії
  sql_list jsonb, -- Перелік sql підзапитів для додаткової інформації
  attributes jsonb, -- Атрибути (для зберігання інформації)
  filters jsonb, -- Фільтри
  popup jsonb, -- Налаштування попапів
  cartocss text, -- Стилі css
  layers jsonb, -- Налаштування шарів mapbox
  srid integer DEFAULT 4326, -- Просторова референтна система
  bbox geometry(Polygon,4326), -- Область покриття сервісу
  center geometry(Point,4326), -- Центр покриття
  is_public boolean NOT NULL DEFAULT false, -- Чи є сервіс публічним?
  is_active boolean DEFAULT true, -- Позначка доступності сервісу
  is_downloadable boolean DEFAULT false, -- Чи можна завантажити дані з цього сервісу?
  metadata jsonb, -- Додаткові метадані
  access_restrictions text, -- Опис обмеження доступу
  metadata_url text, -- Опціонально посилання на документ XML або метадані
  thumbnail_url text, -- Опціонально посилання на фото прев'ю
  config jsonb, -- Опціональна конфігурація
  created_by text NOT NULL,
  updated_by text,
  updated_at timestamp without time zone,
  created_at timestamp without time zone NOT NULL DEFAULT now(),
  image text, -- Зображення
  group_id text, -- Id-групи
  style text, -- Стилі (кольори, товщина лінії тощо)
  interface text, -- Інтерфейс
  legend jsonb, -- Layer legend
  card json,
  CONSTRAINT services_pkey PRIMARY KEY (service_id),
  CONSTRAINT services_group_id_fkey FOREIGN KEY (group_id)
      REFERENCES gis.group_list (group_id)
);

alter table gis.services add column if not exists template text;
comment on column gis.services.template is 'Назва шаблону';

DROP INDEX if exists gis.gis_services_category_gin_idx;

CREATE INDEX gis_services_category_gin_idx
  ON gis.services
  USING gin
  (category COLLATE pg_catalog."default" gin_trgm_ops);

DROP INDEX if exists gis.gis_services_category_gin_idx_lower;

CREATE INDEX gis_services_category_gin_idx_lower
  ON gis.services
  USING gin
  (lower(category) COLLATE pg_catalog."default" gin_trgm_ops);

DROP INDEX if exists gis.gis_services_description_gin_idx;

CREATE INDEX gis_services_description_gin_idx
  ON gis.services
  USING gin
  (description COLLATE pg_catalog."default" gin_trgm_ops);

DROP INDEX if exists gis.gis_services_description_gin_idx_lower;

CREATE INDEX gis_services_description_gin_idx_lower
  ON gis.services
  USING gin
  (lower(description) COLLATE pg_catalog."default" gin_trgm_ops);

DROP INDEX if exists gis.gis_services_holder_gin_idx;

CREATE INDEX gis_services_holder_gin_idx
  ON gis.services
  USING gin
  (holder COLLATE pg_catalog."default" gin_trgm_ops);

DROP INDEX if exists gis.gis_services_holder_gin_idx_lower;

CREATE INDEX gis_services_holder_gin_idx_lower
  ON gis.services
  USING gin
  (lower(holder) COLLATE pg_catalog."default" gin_trgm_ops);

DROP INDEX if exists gis.gis_services_name_gin_idx;

CREATE INDEX gis_services_name_gin_idx
  ON gis.services
  USING gin
  (name COLLATE pg_catalog."default" gin_trgm_ops);

DROP INDEX if exists gis.gis_services_name_gin_idx_lower;

CREATE INDEX gis_services_name_gin_idx_lower
  ON gis.services
  USING gin
  (lower(name) COLLATE pg_catalog."default" gin_trgm_ops);

DROP INDEX if exists gis.gis_services_service_type_btree_idx;

CREATE INDEX gis_services_service_type_btree_idx
  ON gis.services
  USING btree
  (service_type COLLATE pg_catalog."default");

DROP INDEX if exists gis.gis_services_source_path_btree_idx;

CREATE INDEX gis_services_source_path_btree_idx
  ON gis.services
  USING btree
  (source_path COLLATE pg_catalog."default");

DROP INDEX if exists gis.gis_services_source_path_gin_idx;

CREATE INDEX gis_services_source_path_gin_idx
  ON gis.services
  USING gin
  (source_path COLLATE pg_catalog."default" gin_trgm_ops);

DROP INDEX if exists gis.gis_services_source_path_gin_idx_lower;

CREATE INDEX gis_services_source_path_gin_idx_lower
  ON gis.services
  USING gin
  (lower(source_path) COLLATE pg_catalog."default" gin_trgm_ops);

DROP INDEX if exists gis.services_service_key_idx;

CREATE UNIQUE INDEX services_service_key_idx
  ON gis.services
  USING btree
  (service_key COLLATE pg_catalog."default");

-- Add new columns if they do not exist
ALTER TABLE gis.services ADD COLUMN IF NOT EXISTS service_id text;
ALTER TABLE gis.services ADD COLUMN IF NOT EXISTS name text;
ALTER TABLE gis.services ADD COLUMN IF NOT EXISTS service_key text;
ALTER TABLE gis.services ADD COLUMN IF NOT EXISTS description text;
ALTER TABLE gis.services ADD COLUMN IF NOT EXISTS keywords text[];
ALTER TABLE gis.services ADD COLUMN IF NOT EXISTS category text;
ALTER TABLE gis.services ADD COLUMN IF NOT EXISTS service_type text;
ALTER TABLE gis.services ADD COLUMN IF NOT EXISTS holder text;
ALTER TABLE gis.services ADD COLUMN IF NOT EXISTS version text;
ALTER TABLE gis.services ADD COLUMN IF NOT EXISTS source_type text;
ALTER TABLE gis.services ADD COLUMN IF NOT EXISTS service_url text;
ALTER TABLE gis.services ADD COLUMN IF NOT EXISTS source_path text;
ALTER TABLE gis.services ADD COLUMN IF NOT EXISTS query text;
ALTER TABLE gis.services ADD COLUMN IF NOT EXISTS geom_type text;
ALTER TABLE gis.services ADD COLUMN IF NOT EXISTS geometry_column text;
ALTER TABLE gis.services ADD COLUMN IF NOT EXISTS sql_list jsonb;
ALTER TABLE gis.services ADD COLUMN IF NOT EXISTS attributes jsonb;
ALTER TABLE gis.services ADD COLUMN IF NOT EXISTS filters jsonb;
ALTER TABLE gis.services ADD COLUMN IF NOT EXISTS popup jsonb;
ALTER TABLE gis.services ADD COLUMN IF NOT EXISTS cartocss text;
ALTER TABLE gis.services ADD COLUMN IF NOT EXISTS layers jsonb;
ALTER TABLE gis.services ADD COLUMN IF NOT EXISTS srid integer;
ALTER TABLE gis.services ADD COLUMN IF NOT EXISTS bbox geometry(Polygon,4326);
ALTER TABLE gis.services ADD COLUMN IF NOT EXISTS center geometry(Point,4326);
ALTER TABLE gis.services ADD COLUMN IF NOT EXISTS is_public boolean;
ALTER TABLE gis.services ADD COLUMN IF NOT EXISTS is_active boolean;
ALTER TABLE gis.services ADD COLUMN IF NOT EXISTS is_downloadable boolean;
ALTER TABLE gis.services ADD COLUMN IF NOT EXISTS metadata jsonb;
ALTER TABLE gis.services ADD COLUMN IF NOT EXISTS access_restrictions text;
ALTER TABLE gis.services ADD COLUMN IF NOT EXISTS metadata_url text;
ALTER TABLE gis.services ADD COLUMN IF NOT EXISTS thumbnail_url text;
ALTER TABLE gis.services ADD COLUMN IF NOT EXISTS config jsonb;
ALTER TABLE gis.services ADD COLUMN IF NOT EXISTS created_by text;
ALTER TABLE gis.services ADD COLUMN IF NOT EXISTS updated_by text;
ALTER TABLE gis.services ADD COLUMN IF NOT EXISTS updated_at timestamp without time zone;
ALTER TABLE gis.services ADD COLUMN IF NOT EXISTS created_at timestamp without time zone;
ALTER TABLE gis.services ADD COLUMN IF NOT EXISTS image text;
ALTER TABLE gis.services ADD COLUMN IF NOT EXISTS group_id text;
ALTER TABLE gis.services ADD COLUMN IF NOT EXISTS style text;
ALTER TABLE gis.services ADD COLUMN IF NOT EXISTS interface text;
ALTER TABLE gis.services ADD COLUMN IF NOT EXISTS legend jsonb;
ALTER TABLE gis.services ADD COLUMN IF NOT EXISTS card json;

-- Set default values
ALTER TABLE gis.services ALTER COLUMN service_id SET DEFAULT next_id();
ALTER TABLE gis.services ALTER COLUMN version SET DEFAULT '1.0.0';
ALTER TABLE gis.services ALTER COLUMN srid SET DEFAULT 4326;
ALTER TABLE gis.services ALTER COLUMN is_public SET DEFAULT false;
ALTER TABLE gis.services ALTER COLUMN is_active SET DEFAULT true;
ALTER TABLE gis.services ALTER COLUMN is_downloadable SET DEFAULT false;
ALTER TABLE gis.services ALTER COLUMN created_at SET DEFAULT now();

-- Set NOT NULL constraints
ALTER TABLE gis.services ALTER COLUMN service_id SET NOT NULL;
update gis.services set name='' where name is null;
ALTER TABLE gis.services ALTER COLUMN name SET NOT NULL;
update gis.services set service_type='' where service_type is null;
ALTER TABLE gis.services ALTER COLUMN service_type SET NOT NULL;
update gis.services set is_public=false where is_public is null;
ALTER TABLE gis.services ALTER COLUMN is_public SET NOT NULL;
update gis.services set created_by='1' where created_by is null;
ALTER TABLE gis.services ALTER COLUMN created_by SET NOT NULL;
update gis.services set created_by=now() where created_at is null;
ALTER TABLE gis.services ALTER COLUMN created_at SET NOT NULL;

COMMENT ON TABLE gis.services IS 'Сервіси';
COMMENT ON COLUMN gis.services.name IS 'Назва сервісу';
COMMENT ON COLUMN gis.services.service_key IS 'Унікальний ключ';
COMMENT ON COLUMN gis.services.description IS 'Опис сервісу';
COMMENT ON COLUMN gis.services.keywords IS 'Ключові слова';
COMMENT ON COLUMN gis.services.category IS 'Категорія сервісу';
COMMENT ON COLUMN gis.services.service_type IS 'Тип сервісу';
COMMENT ON COLUMN gis.services.holder IS '(Опційно) Власник/Утримучач/Відповідальний';
COMMENT ON COLUMN gis.services.version IS 'Версія сервісу';
COMMENT ON COLUMN gis.services.source_type IS 'Тип джерела';
COMMENT ON COLUMN gis.services.service_url IS 'Поислання на сервіс (якщо source_type = ''service'')';
COMMENT ON COLUMN gis.services.source_path IS 'Шлях до файлу або таблиця в БД';
COMMENT ON COLUMN gis.services.query IS 'Умова для сервісу';
COMMENT ON COLUMN gis.services.geom_type IS 'Тип геометрії для цього шару';
COMMENT ON COLUMN gis.services.geometry_column IS 'Назва колонки гемотрії';
COMMENT ON COLUMN gis.services.sql_list IS 'Перелік sql підзапитів для додаткової інформації';
COMMENT ON COLUMN gis.services.attributes IS 'Атрибути (для зберігання інформації)';
COMMENT ON COLUMN gis.services.filters IS 'Фільтри';
COMMENT ON COLUMN gis.services.popup IS 'Налаштування попапів';
COMMENT ON COLUMN gis.services.cartocss IS 'Стилі css';
COMMENT ON COLUMN gis.services.layers IS 'Налаштування шарів mapbox';
COMMENT ON COLUMN gis.services.srid IS 'Просторова референтна система';
COMMENT ON COLUMN gis.services.bbox IS 'Область покриття сервісу';
COMMENT ON COLUMN gis.services.center IS 'Центр покриття';
COMMENT ON COLUMN gis.services.is_public IS 'Чи є сервіс публічним?';
COMMENT ON COLUMN gis.services.is_active IS 'Позначка доступності сервісу';
COMMENT ON COLUMN gis.services.is_downloadable IS 'Чи можна завантажити дані з цього сервісу?';
COMMENT ON COLUMN gis.services.metadata IS 'Додаткові метадані';
COMMENT ON COLUMN gis.services.access_restrictions IS 'Опис обмеження доступу';
COMMENT ON COLUMN gis.services.metadata_url IS 'Опціонально посилання на документ XML або метадані';
COMMENT ON COLUMN gis.services.thumbnail_url IS 'Опціонально посилання на фото прев''ю';
COMMENT ON COLUMN gis.services.config IS 'Опціональна конфігурація';
COMMENT ON COLUMN gis.services.image IS 'Зображення';
COMMENT ON COLUMN gis.services.group_id IS 'Id-групи';
COMMENT ON COLUMN gis.services.style IS 'Стилі (кольори, товщина лінії тощо)';
COMMENT ON COLUMN gis.services.interface IS 'Інтерфейс';
COMMENT ON COLUMN gis.services.legend IS 'Layer legend';