create table if not exists gis.metadata
(
    metadata_id            text      default next_id()     not null primary key,
    layer_id               text                                  not null,
    name                   text,
    metadata_key           text unique,
    abstract               text,
    purpose                text,
    source                 text,
    access_constraints     text,
    use_constraints        text,
    license                text,
    topic_category         text,
    keywords               text[],
    accuracy_statement     text,
    update_frequency       text,
    scale                  text,
    encoding               text      default 'UTF-8'::text       not null,
    language               text      default 'ua'::text          not null,
    katottg                text,
    region                 text,
    size                   numeric,
    standards              text      default '4'::text           not null,
    service_type           text      default 'web_service'::text not null,
    geom                   geometry,
    date_created           date,
    date_updated           date,
    year                   integer,
    data_owner_code        text                                  not null,
    data_producer_code     text,
    created_at             timestamp default now(),
    created_by             text,
    updated_by             text,
    updated_at             timestamp,
    contact_id             text,
    srid                   text      default 4326,
    description            text,
    resource_level         text,
    atu_id                 text,
    metadata_owner_id      text,
    metadata_producer_id   text,
    frequency_update       text,
    limit_access           json,
    resource_locator       json,
    history                json,
    z_max                  integer,
    z_min                  integer,
    high_scale             text,
    low_scale              text,
    spatial_resolution     text,
    coord_ref_system       text,
    cdate                  timestamp default now(),
    uid                    text,
    editor_id              text,
    editor_date            timestamp,
    files                  json,
    character_encoding     text,
    conditions_access      text,
    processing_environment text,
    dataresource_source    json,
    type_localization      integer[],
    way_create_obj         text,
    eval_method_scope      text,
    type_of_financing      text,
    conformity             text,
    links                  json,
    tender_id              text,
    rights                 json,
    limitations            json,
    enabled                boolean   default true,
    product_cost           numeric,
    attribution_text       text,
    is_verify              boolean   default false,
    image                  text,
    object_id              text,
    type                   text      default 'service'::text     not null
);

comment on table gis.metadata is 'Каталог метаданих';

comment on column gis.metadata.metadata_id is 'Id метаданих';

comment on column gis.metadata.layer_id is 'Ідентифікатор ресурсу';

comment on column gis.metadata.name is 'Назва метаданих';

comment on column gis.metadata.metadata_key is 'Унікальний ключ';

comment on column gis.metadata.abstract is 'Опис набору даних або шару';

comment on column gis.metadata.purpose is 'Мета метаданих';

comment on column gis.metadata.source is 'Джерело даних';

comment on column gis.metadata.access_constraints is 'Обмеження доступу';

comment on column gis.metadata.use_constraints is 'Обмеження використання';

comment on column gis.metadata.license is 'Ліцензія';

comment on column gis.metadata.topic_category is 'Тематична категорія ресурсу';

comment on column gis.metadata.keywords is 'Ключові слова';

comment on column gis.metadata.accuracy_statement is 'Точність метаданих';

comment on column gis.metadata.update_frequency is 'Частота оновлення';

comment on column gis.metadata.scale is 'Масштаб';

comment on column gis.metadata.encoding is 'Код набору символів';

comment on column gis.metadata.language is 'Мова метаданих';

comment on column gis.metadata.katottg is 'Код КАТОТТГ';

comment on column gis.metadata.region is 'Територіального охоплення';

comment on column gis.metadata.size is 'Розмір';

comment on column gis.metadata.standards is 'Інформація про відповідність метаданих стандартам';

comment on column gis.metadata.service_type is 'Тип сервісу';

comment on column gis.metadata.geom is 'Охоплення (екстент)';

comment on column gis.metadata.date_created is 'Дата створення мемаданих';

comment on column gis.metadata.date_updated is 'Дата оновлення мемаданих';

comment on column gis.metadata.year is 'Рік актуальності метаданих';

comment on column gis.metadata.data_owner_code is 'Код суб''єкта, що є власником ресурсу';

comment on column gis.metadata.data_producer_code is 'Код виробника даних';

comment on column gis.metadata.contact_id is 'Суб''єкт, що є власником ресурсу';

comment on column gis.metadata.srid is 'Просторова система координат';

comment on column gis.metadata.description is 'Опис метаданих';

comment on column gis.metadata.resource_level is 'Рівень (міжнар, нац., місц.)';

comment on column gis.metadata.atu_id is 'Територіальне охоплення';

comment on column gis.metadata.metadata_owner_id is 'Власник даних';

comment on column gis.metadata.metadata_producer_id is 'Виробники даних';

comment on column gis.metadata.frequency_update is 'Частота оновлення';

comment on column gis.metadata.limit_access is 'Права та ліцензія';

comment on column gis.metadata.resource_locator is 'Посиланння';

comment on column gis.metadata.history is 'історія';

comment on column gis.metadata.z_max is 'Максимальний зум';

comment on column gis.metadata.z_min is 'Мінімальний зум';

comment on column gis.metadata.high_scale is 'Максимальний масштаб подання даних';

comment on column gis.metadata.low_scale is 'Мінімальний масштаб подання даних';

comment on column gis.metadata.spatial_resolution is 'Роздільна здатність в масштабі';

comment on column gis.metadata.coord_ref_system is 'Система координат';

comment on column gis.metadata.editor_id is 'Ідентифікатор редактора';

comment on column gis.metadata.files is 'Файли';

comment on column gis.metadata.character_encoding is 'Система кодування';

comment on column gis.metadata.conditions_access is 'Умови до даних';

comment on column gis.metadata.processing_environment is 'Середовище обробки (ПЗ)';

comment on column gis.metadata.dataresource_source is 'Опис джерела даних';

comment on column gis.metadata.type_localization is 'Спосіб просторового подання об’єкта місцевості';

comment on column gis.metadata.way_create_obj is 'Спосіб створення об’єкта місцевості';

comment on column gis.metadata.eval_method_scope is 'Правила цифрового опису';

comment on column gis.metadata.type_of_financing is 'Джерело фінансування';

comment on column gis.metadata.conformity is 'Відповідність стандартам, специфікаціям для інетроперабельності';

comment on column gis.metadata.links is 'Розповсюдження даних';

comment on column gis.metadata.tender_id is 'Посилання на тендер';

comment on column gis.metadata.rights is 'Права';

comment on column gis.metadata.limitations is 'Обмеження у використанні';

comment on column gis.metadata.product_cost is 'Вартість продукції';

comment on column gis.metadata.attribution_text is 'Атрибуція текстова';

comment on column gis.metadata.is_verify is 'Ознака чи верифіковано метадані';

comment on column gis.metadata.image is 'Прев''ю метаданих';

comment on column gis.metadata.object_id is 'ID Об''єкта';

create unique index if not exists layer_id_unique
    on gis.metadata (metadata_id, layer_id);

create index if not exists gis_metadata_metadata_id_gin_idx
    on gis.metadata using gin (metadata_id public.gin_trgm_ops);

create index if not exists gis_metadata_metadata_key_gin_idx_lower
    on gis.metadata using gin (lower(metadata_key) public.gin_trgm_ops);

create index if not exists gis_metadata_abstract_gin_idx
    on gis.metadata using gin (abstract public.gin_trgm_ops);

create index if not exists gis_metadata_abstract_gin_idx_lower
    on gis.metadata using gin (lower(abstract) public.gin_trgm_ops);

create index if not exists gis_metadata_metadata_id_gin_idx_lower
    on gis.metadata using gin (lower(metadata_id) public.gin_trgm_ops);

create index if not exists gis_metadata_name_gin_idx_lower
    on gis.metadata using gin (lower(name) public.gin_trgm_ops);

create index if not exists gis_metadata_metadata_key_gin_idx
    on gis.metadata using gin (metadata_key public.gin_trgm_ops);

create index if not exists gis_metadata_layer_id_gin_idx
    on gis.metadata using gin (layer_id public.gin_trgm_ops);

create index if not exists gis_metadata_layer_id_gin_idx_lower
    on gis.metadata using gin (lower(layer_id) public.gin_trgm_ops);

create index if not exists gis_metadata_name_gin_idx
    on gis.metadata using gin (name public.gin_trgm_ops);

create index if not exists gis_metadata_purpose_gin_idx
    on gis.metadata using gin (purpose public.gin_trgm_ops);

create index if not exists gis_metadata_source_gin_idx_lower
    on gis.metadata using gin (lower(source) public.gin_trgm_ops);

create index if not exists gis_metadata_purpose_gin_idx_lower
    on gis.metadata using gin (lower(purpose) public.gin_trgm_ops);

create index if not exists gis_metadata_use_constraints_gin_idx_lower
    on gis.metadata using gin (lower(use_constraints) public.gin_trgm_ops);

create index if not exists gis_metadata_access_constraints_gin_idx
    on gis.metadata using gin (access_constraints public.gin_trgm_ops);

create index if not exists gis_metadata_source_gin_idx
    on gis.metadata using gin (source public.gin_trgm_ops);

create index if not exists gis_metadata_use_constraints_gin_idx
    on gis.metadata using gin (use_constraints public.gin_trgm_ops);

create index if not exists gis_metadata_topic_category_gin_idx
    on gis.metadata using gin (topic_category public.gin_trgm_ops);

create index if not exists gis_metadata_license_gin_idx
    on gis.metadata using gin (license public.gin_trgm_ops);

create index if not exists gis_metadata_access_constraints_gin_idx_lower
    on gis.metadata using gin (lower(access_constraints) public.gin_trgm_ops);

create index if not exists gis_metadata_license_gin_idx_lower
    on gis.metadata using gin (lower(license) public.gin_trgm_ops);

create index if not exists gis_metadata_topic_category_gin_idx_lower
    on gis.metadata using gin (lower(topic_category) public.gin_trgm_ops);

create index if not exists gis_metadata_accuracy_statement_gin_idx
    on gis.metadata using gin (accuracy_statement public.gin_trgm_ops);

create index if not exists gis_metadata_accuracy_statement_gin_idx_lower
    on gis.metadata using gin (lower(accuracy_statement) public.gin_trgm_ops);

create index if not exists gis_metadata_update_frequency_gin_idx
    on gis.metadata using gin (update_frequency public.gin_trgm_ops);

create index if not exists gis_metadata_update_frequency_gin_idx_lower
    on gis.metadata using gin (lower(update_frequency) public.gin_trgm_ops);

create index if not exists gis_metadata_scale_gin_idx_lower
    on gis.metadata using gin (lower(scale) public.gin_trgm_ops);

create index if not exists gis_metadata_encoding_gin_idx_lower
    on gis.metadata using gin (lower(encoding) public.gin_trgm_ops);

create index if not exists gis_metadata_language_gin_idx
    on gis.metadata using gin (language public.gin_trgm_ops);

create index if not exists gis_metadata_katottg_gin_idx
    on gis.metadata using gin (katottg public.gin_trgm_ops);

create index if not exists gis_metadata_language_gin_idx_lower
    on gis.metadata using gin (lower(language) public.gin_trgm_ops);

create index if not exists gis_metadata_region_gin_idx_lower
    on gis.metadata using gin (lower(region) public.gin_trgm_ops);

create index if not exists gis_metadata_region_gin_idx
    on gis.metadata using gin (region public.gin_trgm_ops);

create index if not exists gis_metadata_katottg_gin_idx_lower
    on gis.metadata using gin (lower(katottg) public.gin_trgm_ops);

create index if not exists gis_metadata_size_btree_idx
    on gis.metadata (size);

create index if not exists gis_metadata_standards_gin_idx
    on gis.metadata using gin (standards public.gin_trgm_ops);

create index if not exists gis_metadata_standards_gin_idx_lower
    on gis.metadata using gin (lower(standards) public.gin_trgm_ops);

create index if not exists gis_metadata_service_type_gin_idx
    on gis.metadata using gin (service_type public.gin_trgm_ops);

create index if not exists gis_metadata_service_type_gin_idx_lower
    on gis.metadata using gin (lower(service_type) public.gin_trgm_ops);

create index if not exists gis_metadata_scale_gin_idx
    on gis.metadata using gin (scale public.gin_trgm_ops);

create index if not exists gis_metadata_geom_4326_idx
    on gis.metadata using gist (st_transform(geom, 4326));

create index if not exists gis_metadata_geom_area_true_idx
    on gis.metadata (st_area(geom::geography, true));

create index if not exists gis_metadata_encoding_gin_idx
    on gis.metadata using gin (encoding public.gin_trgm_ops);

create index if not exists gis_metadata_geom_gist1_idx
    on gis.metadata using gist (geom);

create index if not exists gis_metadata_geom_area_idx
    on gis.metadata (st_area(st_transform(geom, 3857)));

create index if not exists gis_metadata_date_updated_btree_idx
    on gis.metadata (date_updated);

create index if not exists gis_metadata_year_btree_idx
    on gis.metadata (year);

create index if not exists gis_metadata_date_created_btree_idx
    on gis.metadata (date_created);

create index if not exists gis_metadata_data_owner_code_gin_idx
    on gis.metadata using gin (data_owner_code public.gin_trgm_ops);

create index if not exists gis_metadata_data_owner_code_gin_idx_lower
    on gis.metadata using gin (lower(data_owner_code) public.gin_trgm_ops);

create index if not exists gis_metadata_data_producer_code_gin_idx
    on gis.metadata using gin (data_producer_code public.gin_trgm_ops);

create index if not exists gis_metadata_data_producer_code_gin_idx_lower
    on gis.metadata using gin (lower(data_producer_code) public.gin_trgm_ops);

create index if not exists gis_metadata_updated_by_gin_idx_lower
    on gis.metadata using gin (lower(updated_by) public.gin_trgm_ops);

create index if not exists gis_metadata_updated_by_gin_idx
    on gis.metadata using gin (updated_by public.gin_trgm_ops);

create index if not exists gis_metadata_created_by_gin_idx
    on gis.metadata using gin (created_by public.gin_trgm_ops);

create index if not exists gis_metadata_updated_at_btree_idx
    on gis.metadata (updated_at);

create index if not exists gis_metadata_created_by_gin_idx_lower
    on gis.metadata using gin (lower(created_by) public.gin_trgm_ops);

create index if not exists gis_metadata_created_at_btree_idx
    on gis.metadata (created_at);

create index if not exists gis_metadata_contact_id_btree_idx
    on gis.metadata (contact_id);

create index if not exists gis_metadata_layer_id_btree_idx
    on gis.metadata (layer_id);

create index if not exists gis_metadata_topic_category_btree_idx
    on gis.metadata (topic_category);

create index if not exists gis_metadata_resource_level_btree_idx
    on gis.metadata (resource_level);

create index if not exists gis_metadata_metadata_owner_id_trgm_idx
    on gis.metadata using gin (metadata_owner_id public.gin_trgm_ops);

create index if not exists gis_metadata_metadata_producer_id_trgm_idx
    on gis.metadata using gin (metadata_producer_id public.gin_trgm_ops);

create index if not exists gis_metadata_frequency_update_btree_idx
    on gis.metadata (frequency_update);

create index if not exists gis_metadata_conditions_access_btree_idx
    on gis.metadata (conditions_access);

alter table gis.metadata add column if not exists producer text;
alter table gis.metadata add column if not exists group_id text;
alter table gis.metadata add column if not exists license text;
alter table gis.metadata add column if not exists type text;
alter table gis.metadata alter column data_owner_code drop not null;