CREATE TABLE IF NOT EXISTS tokens (
    AccountID VARCHAR(30) PRIMARY KEY, -- связь с users AccountID неявная посредством join
    RefreshToken TEXT NOT NULL ,
    AccessToken TEXT NOT NULL ,
    AuthCode TEXT NOT NULL , -- код авторизации который получаем при вебхук
    Expiration TIMESTAMP NOT NULL, -- время истечения токенов
    CreatedAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE IF NOT EXISTS users (
    ID BIGSERIAL UNIQUE NOT NULL PRIMARY KEY,
    AccountID VARCHAR(30) NOT NULL DEFAULT '', -- id  квизе из токена
    AmoID INT NOT NULL , -- id в амо
    Name VARCHAR(50) NOT NULL DEFAULT '', -- имя в амо
    Email VARCHAR(50) NOT NULL DEFAULT '', -- почта в амо
    Role INT NOT NULL DEFAULT 0, -- роль в амо
    "Group" INT NOT NULL DEFAULT 0, -- вложенная структура так как в амо группы хранятся массивом структур
    Deleted BOOLEAN NOT NULL DEFAULT FALSE,
    CreatedAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    Subdomain VARCHAR(50) NOT NULL DEFAULT '',
    AmoUserID INT NOT NULL , -- id пользователя который подключал интеграцию
    Country VARCHAR(50) NOT NULL DEFAULT '' -- страна в амо
);

CREATE TABLE IF NOT EXISTS pipelines (
    ID BIGSERIAL UNIQUE NOT NULL PRIMARY KEY,
    AmoID INT NOT NULL , --id воронки в амо
    AccountID INT NOT NULL , --id аккаунта в амо связь с таблицей users AmoID неявная посредством join
    Name VARCHAR(50) NOT NULL DEFAULT '', --название воронки в амо
    IsArchive BOOLEAN NOT NULL DEFAULT FALSE, --флаг архивной воронки в амо
    Deleted BOOLEAN NOT NULL DEFAULT FALSE,
    CreatedAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE IF NOT EXISTS steps (
    ID BIGSERIAL UNIQUE NOT NULL PRIMARY KEY,
    AmoID INT NOT NULL, --id шага воронки в амо
    PipelineID INT NOT NULL, --id воронки AmoID pipelines неявная посредством join
    AccountID INT NOT NULL, --id аккаунта в амо связь с таблицей users AmoID неявная посредством join
    Name VARCHAR(50) NOT NULL DEFAULT '', --название воронки в амо
    Color VARCHAR(50) NOT NULL DEFAULT '', --цвет шага в амо*
    Deleted BOOLEAN NOT NULL DEFAULT FALSE,
    CreatedAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
DO $$
    BEGIN
        IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'entitytype') THEN
            CREATE TYPE EntityType AS ENUM ('leads', 'contacts', 'companies', 'customers');
    END IF;
END $$;

DO $$
    BEGIN
        IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'fieldtype') THEN
            CREATE TYPE FieldType AS ENUM ('text', 'numeric', 'checkbox', 'select', 'multiselect', 'date', 'url', 'textarea', 'radiobutton', 'streetaddress', 'smart_address', 'birthday', 'legal_entity', 'date_time', 'price', 'category', 'items', 'tracking_data', 'linked_entity', 'chained_list', 'monetary', 'file', 'payer', 'supplier', 'multitext');
    END IF;
END $$;

CREATE TABLE IF NOT EXISTS fields (
    ID BIGSERIAL UNIQUE NOT NULL PRIMARY KEY,
    AmoID INT NOT NULL, -- айдишник кастомного поля в амо
    Code VARCHAR(255) NOT NULL DEFAULT '', -- кодовое слово в амо
    AccountID INT NOT NULL, -- id аккаунта в амо связь с таблицей users AmoID неявная посредством join
    Name VARCHAR(50) NOT NULL DEFAULT '', -- название воронки в амо
    Entity EntityType NOT NULL, -- тип сущности в амо, для которой это кастомное поле
    Type FieldType NOT NULL, -- тип поля
    Deleted BOOLEAN NOT NULL DEFAULT FALSE,
    CreatedAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE IF NOT EXISTS tags (
    ID BIGSERIAL UNIQUE NOT NULL PRIMARY KEY,
    AmoID INT NOT NULL, -- айдишник тега в амо
    AccountID INT NOT NULL, -- id аккаунта в амо связь с таблицей users AmoID неявная посредством join
    Entity EntityType NOT NULL, -- сущность, к которой принадлежит этот тег
    Name VARCHAR(50) NOT NULL DEFAULT '', -- название тега в амо
    Color VARCHAR(50) NOT NULL DEFAULT '', -- цвет тега в амо
    Deleted BOOLEAN NOT NULL DEFAULT FALSE,
    CreatedAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE IF NOT EXISTS utms (
    ID BIGSERIAL UNIQUE NOT NULL PRIMARY KEY,
    AmoFieldID INT NOT NULL DEFAULT 0, -- id field в амо
    QuizID INT NOT NULL, -- id опроса
    AccountID INT NOT NULL, -- id аккаунта в амо AMOID
    Name VARCHAR(50) NOT NULL DEFAULT '', -- название utm
    Deleted BOOLEAN NOT NULL DEFAULT FALSE,
    CreatedAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE IF NOT EXISTS rules (
    ID BIGSERIAL UNIQUE NOT NULL PRIMARY KEY,
    AccountID INT NOT NULL, -- id аккаунта в амо AMOID
    QuizID INT NOT NULL, -- id опроса
    PerformerID INT NOT NULL, -- айдишник ответственного за сделку
    PipelineID INT NOT NULL, --id воронки AmoID pipelines неявная посредством join
    StepID INT NOT NULL , -- id этапа steps AmoID join
    UTMS INTEGER[], -- список UTM для этого опроса id utm
    FieldsRule JSONB NOT NULL DEFAULT '{}', -- вложенная структура
    Deleted BOOLEAN NOT NULL DEFAULT FALSE,
    CreatedAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE UNIQUE INDEX idx_unique_users ON users (amoID);
CREATE UNIQUE INDEX idx_unique_pipeline ON pipelines (amoID, accountID) WHERE Deleted = false;
CREATE UNIQUE INDEX idx_unique_step ON steps (amoID, accountID, PipelineID) WHERE Deleted = false;
CREATE UNIQUE INDEX idx_unique_field ON fields (amoID, accountID, entity) WHERE Deleted = false;
CREATE UNIQUE INDEX idx_unique_tag ON tags (amoID, accountID, entity) WHERE Deleted = false;
CREATE UNIQUE INDEX idx_unique_rules ON rules (accountID, QuizID) WHERE Deleted = false;
