CREATE TABLE IF NOT EXISTS tokens (
    AccountID VARCHAR(30) PRIMARY KEY, -- связь с users AccountID неявная посредством join
    RefreshToken VARCHAR(512) NOT NULL ,
    AccessToken VARCHAR(512) NOT NULL ,
    AuthCode VARCHAR(512) 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 , -- id  квизе из токена
    AmoID INT NOT NULL , -- id в амо
    Name VARCHAR(50) NOT NULL DEFAULT '', -- имя в амо
    Email VARCHAR(50) NOT NULL DEFAULT '', -- почта в амо
    Role VARCHAR(50) NOT NULL DEFAULT '', -- роль в амо
    "Group" JSONB, -- вложенная структура так как в амо группы хранятся массивом структур
    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 $$;

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 VARCHAR(50) NOT NULL DEFAULT '', -- тип поля
    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
);

ALTER TABLE quiz
ADD COLUMN utm jsonb NOT NULL DEFAULT '{}';
ALTER TABLE quiz
ADD COLUMN rules jsonb NOT NULL DEFAULT '{}';

ALTER TABLE pipelines ADD CONSTRAINT unique_pipeline UNIQUE (amoID, accountID);
ALTER TABLE steps ADD CONSTRAINT unique_step UNIQUE (amoID, accountID, PipelineID);
ALTER TABLE fields ADD CONSTRAINT unique_field UNIQUE (amoID, accountID, entity);
ALTER TABLE tags ADD CONSTRAINT unique_tag UNIQUE (amoID, accountID, entity);