CREATE TABLE IF NOT EXISTS BitrixTokens (
    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 NOT NULL DEFAULT CURRENT_TIMESTAMP
);

DO $$
BEGIN
    IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'FieldsType') THEN
CREATE TYPE FieldsType AS ENUM (
            'CRM_LEAD',
            'CRM_COMPANY',
            'CRM_CONTACT',
            'CRM_DEAL',
            'CRM_INVOICE',
            'CRM_SMART_INVOICE',
            'CRM_QUOTE',
            'CRM_REQUISITE'
);
END IF;
END $$;

DO $$
BEGIN
    IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'CustomFieldsType') THEN
CREATE TYPE CustomFieldsType AS ENUM (
    'string',
    'integer',
    'double',
    'boolean',
    'datetime',
    'enumeration',
    'iblock_section',
    'iblock_element',
    'employee',
    'crm_status',
    'crm',
    'address',
    'money',
    'url',
    'file',
    'crm_pena_tag'
        );
END IF;
END $$;


CREATE TABLE IF NOT EXISTS BitrixFields (
    ID BIGSERIAL UNIQUE NOT NULL PRIMARY KEY,
    BitrixID VARCHAR(255) NOT NULL, -- Айдишник field в битриксе
    AccountID VARCHAR(255) NOT NULL,-- ID портала битрикса
    EntityID FieldsType NOT NULL,-- тип поля
    FieldName VARCHAR(255) NOT NULL,-- имя поля
    EditFromLabel VARCHAR(255) NOT NULL,-- заголовок вопроса
    FieldType CustomFieldsType NOT NULL, -- тип поля
    Deleted BOOLEAN NOT NULL DEFAULT FALSE,
    CreatedAt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE IF NOT EXISTS BitrixAccountUsers (
    ID BIGSERIAL UNIQUE NOT NULL PRIMARY KEY,
    AccountID VARCHAR(255) NOT NULL, -- ID портала битрикса
    BitrixIDUserID VARCHAR(255) NOT NULL, -- ID пользователя в битриксе
    Name VARCHAR(255) NOT NULL default '', -- Имя
    LastName VARCHAR(255) NOT NULL default '',-- Фамилия
    SecondName VARCHAR(255) NOT NULL default '', -- Отчество
    Title VARCHAR(255) NOT NULL default '',
    Email VARCHAR(255) NOT NULL default '', -- Почта
    UFDepartment INT[], -- Массив департаментов
    WorkPosition VARCHAR(255) NOT NULL default '', -- Должность
    Deleted BOOLEAN NOT NULL DEFAULT FALSE,
    CreatedAt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE IF NOT EXISTS BitrixAccounts (
    ID BIGSERIAL UNIQUE NOT NULL PRIMARY KEY,
    AccountID VARCHAR(30) NOT NULL, -- ID аккаунта у нас
    BitrixID VARCHAR(255) NOT NULL, -- ID портала битрикса
    Deleted BOOLEAN NOT NULL DEFAULT FALSE,
    CreatedAt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    Subdomain VARCHAR(50) NOT NULL -- поддомен
);

CREATE TABLE IF NOT EXISTS PipelineBitrix (
    ID BIGSERIAL UNIQUE NOT NULL PRIMARY KEY,
    BitrixID INT NOT NULL, -- Айдишник воронки в битриксе
    AccountID VARCHAR(255) NOT NULL, -- ID портала битрикса
    Name VARCHAR(255) NOT NULL, -- Название воронки
    EntityTypeId INT NOT NULL, -- Тип по номерам
    Deleted BOOLEAN NOT NULL DEFAULT FALSE,
    CreatedAt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    CONSTRAINT validEntityType CHECK (EntityTypeId IN (1, 2, 3, 4, 5, 7, 8, 31))
);

CREATE TABLE IF NOT EXISTS StepBitrix (
    ID BIGSERIAL UNIQUE NOT NULL PRIMARY KEY,
    AccountID VARCHAR(255) NOT NULL, -- ID портала битрикса
    BitrixID VARCHAR(255) NOT NULL, -- Айдишник состояния в битриксе
    EntityID VARCHAR(255) NOT NULL, -- Тип сущности
    StatusID VARCHAR(255) NOT NULL, -- Текстовый формат ID статуса
    Name VARCHAR(255) NOT NULL default '', -- Название
    NameInit VARCHAR(255) NOT NULL default '', -- возможно это изначальное название
    Color VARCHAR(50) NOT NULL default '', -- Цвет
    PipelineID INT NOT NULL, -- ID воронки
    Deleted BOOLEAN NOT NULL DEFAULT FALSE,
    CreatedAt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE IF NOT EXISTS BitrixRule (
    ID BIGSERIAL UNIQUE NOT NULL PRIMARY KEY,
    AccountID VARCHAR(255) NOT NULL, -- ID портала битрикса
    QuizID INT NOT NULL, -- ID квиза на которое вешается правило
    PerformerID VARCHAR(255) NOT NULL, -- ID пользователя в битриксе который ответсвенный
    PipelineID INT NOT NULL, -- ID воронки
    TypeID VARCHAR(255) NOT NULL, -- шаг сделки только с "ENTITY_ID":"DEAL_TYPE","STATUS_ID":"SALE"
    StageID VARCHAR(255) NOT NULL, -- стадия сделки,  шаг "ENTITY_ID":"DEAL_STAGE","STATUS_ID":"NEW"
    SourceID VARCHAR(255) NOT NULL, -- тип источника, шаг "ENTITY_ID":"SOURCE","STATUS_ID":"CALL"
    StatusID VARCHAR(255) NOT NULL, -- тип источника, шаг "ENTITY_ID":"STATUS","STATUS_ID":"IN_PROCESS"
    FieldsRule JSONB NOT NULL DEFAULT '{}', -- вложенная структура
    TagsToAdd JSONB NOT NULL DEFAULT '{}', -- структура тегов которые надо дбавлять
    Deleted BOOLEAN NOT NULL DEFAULT FALSE,
    CreatedAt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,

    LeadFlag BOOLEAN NOT NULL DEFAULT FALSE -- если true то делаем лид а не сделку
);

CREATE TABLE IF NOT EXISTS bitrixCRMStatuses (
      ID BIGSERIAL UNIQUE NOT NULL PRIMARY KEY,
      AccountID VARCHAR(255) NOT NULL, -- ID портала битрикса
      DealID INT NOT NULL, -- id сделки или лида в которую добавлялось
      AnswerID BIGINT NOT NULL REFERENCES answer(id), -- id true result который вызвал действие
      Status TEXT NOT NULL DEFAULT '', -- запись о ошибке, либо успехе
      CreatedAt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE IF NOT EXISTS bitrixContact (
    ID BIGSERIAL UNIQUE NOT NULL PRIMARY KEY,
    AccountID VARCHAR(255) NOT NULL, -- ID "компании" в амо
    BitrixID INT NOT NULL, -- ID контакта в амо
    Field text NOT NULL DEFAULT '' -- значение чего то email? phone? etc
);

CREATE UNIQUE INDEX idx_unique_pipeline_bitrix ON PipelineBitrix (BitrixID, AccountID) WHERE Deleted = false;
CREATE UNIQUE INDEX idx_unique_step_bitrix ON StepBitrix (BitrixID, AccountID) WHERE Deleted = false;
CREATE UNIQUE INDEX idx_unique_field_bitrix ON BitrixFields (BitrixID, AccountID, EntityID);
ALTER TABLE answer ADD COLUMN version integer NOT NULL default 0;
