DO $$
DECLARE
	_path  character varying(256) := 'patch-2026_03_03-ProhibitingPolicies';
	_build integer := 16616;
BEGIN
	IF EXISTS (SELECT 1 FROM public."Versions" WHERE "Path" = _path) THEN
		RETURN;
	END IF;

	IF EXISTS (SELECT 1 FROM public."Versions" WHERE "Build" >= _build) THEN
		RETURN;
	END IF;

	BEGIN
        -- Скрипт создания таблицы политик доступа
        CREATE TABLE IF NOT EXISTS public."ProhibitingPolicies"
        (
            "Id"                    bigserial primary key   NOT NULL, -- Идентификатор
            "Name"                  character varying(500)  NOT NULL, -- Название
            "Description"           character varying(4000) NULL,     -- Описание (опционально)  
            "CustomerId"            bigint                  NOT NULL, -- Идентификатор организации

            -- Проверка на уникальность очереди
            CONSTRAINT "ProhibitingPolicies_pk" UNIQUE ("Name")
        );

        -- Скрипт создания таблицы, хранящей связь многие-ко-многим политик и добавленных сущностей политик
        CREATE TABLE IF NOT EXISTS public."ProhibitingPoliciesMembers"
        (
            "PolicyId"   bigint not null, -- Идентификатор политики
            "EntityId"   bigint not null, -- Идентификатор сущности
            "EntityType" int    not null, -- enum EntityTypes

            primary key ("PolicyId", "EntityId", "EntityType")
        );

        -- Скрипт создания таблицы, хранящей связь один-ко-многим политик и ограничений
        CREATE TABLE IF NOT EXISTS public."ProhibitingPoliciesRules"
        (
            "PolicyId"       bigint not null, -- Идентификатор политики
            "Module"         int    not null, -- enum EntityTypes
            "EntityType"     int    not null, -- enum EntityTypes
            "ActionType"     int    not null, -- ActionTypes
            "RuleParamsJson" text   null,     -- Сериализованный объект параметра

            primary key ("PolicyId", "Module", "EntityType", "ActionType")
        );

        CREATE INDEX IF NOT EXISTS "ProhibitingPoliciesRules_PolicyId" ON public."ProhibitingPoliciesRules" ("PolicyId");

	EXCEPTION
		WHEN OTHERS THEN
			RAISE NOTICE '[ERR] %: %', _path, SQLERRM;
	END;
END;
$$;
