PRAGMA journal_mode=WAL;
PRAGMA foreign_keys=ON;

CREATE TABLE IF NOT EXISTS organizations (
    id            INTEGER PRIMARY KEY AUTOINCREMENT,
    name          TEXT NOT NULL,
    intradesk_id  INTEGER UNIQUE,   -- id из intradesk_clients (NULL = ручное создание)
    created_at    TEXT NOT NULL DEFAULT (datetime('now'))
);

-- Белый список телефонов по организациям.
-- phone хранится только цифрами, напр. "79001234567"
CREATE TABLE IF NOT EXISTS org_users (
    id           INTEGER PRIMARY KEY AUTOINCREMENT,
    org_id       INTEGER NOT NULL REFERENCES organizations(id) ON DELETE CASCADE,
    phone        TEXT NOT NULL,
    display_name TEXT,
    created_at   TEXT NOT NULL DEFAULT (datetime('now')),
    UNIQUE(phone)
);

-- Реальные пользователи MAX, которые написали боту
CREATE TABLE IF NOT EXISTS bot_users (
    id            INTEGER PRIMARY KEY AUTOINCREMENT,
    max_user_id   INTEGER NOT NULL UNIQUE,
    max_chat_id   INTEGER,
    username      TEXT,
    first_name    TEXT,
    phone         TEXT,            -- заполняется после шаринга контакта
    org_id        INTEGER REFERENCES organizations(id),
    is_authorized INTEGER NOT NULL DEFAULT 0,  -- 1 = авторизован
    is_blocked    INTEGER NOT NULL DEFAULT 0,  -- 1 = заблокирован
    created_at    TEXT NOT NULL DEFAULT (datetime('now')),
    updated_at    TEXT NOT NULL DEFAULT (datetime('now'))
);

CREATE TABLE IF NOT EXISTS tickets (
    id           INTEGER PRIMARY KEY AUTOINCREMENT,
    org_id       INTEGER NOT NULL REFERENCES organizations(id),
    created_by   INTEGER NOT NULL REFERENCES bot_users(id),
    description  TEXT NOT NULL,
    status       TEXT NOT NULL DEFAULT 'open',  -- open / in_progress / closed
    last_comment TEXT,
    created_at   TEXT NOT NULL DEFAULT (datetime('now')),
    updated_at   TEXT NOT NULL DEFAULT (datetime('now'))
);

CREATE TABLE IF NOT EXISTS ticket_attachments (
    id              INTEGER PRIMARY KEY AUTOINCREMENT,
    ticket_id       INTEGER NOT NULL REFERENCES tickets(id) ON DELETE CASCADE,
    attachment_type TEXT NOT NULL,   -- image / audio / file / video
    attachment_url  TEXT,
    filename        TEXT,
    created_at      TEXT NOT NULL DEFAULT (datetime('now'))
);

-- Лог всех входящих и исходящих сообщений
CREATE TABLE IF NOT EXISTS message_log (
    id              INTEGER PRIMARY KEY AUTOINCREMENT,
    direction       TEXT NOT NULL,   -- 'in' / 'out'
    max_user_id     INTEGER,
    max_chat_id     INTEGER,
    message_id      TEXT,
    text            TEXT,
    attachment_json TEXT,            -- JSON-строка списка вложений
    created_at      TEXT NOT NULL DEFAULT (datetime('now'))
);

-- ── Intradesk: синхронизируемые справочники ────────────────────────────────

-- Клиенты/организации из Intradesk (clientType 10=компания, 20=физлицо)
CREATE TABLE IF NOT EXISTS intradesk_clients (
    id          INTEGER PRIMARY KEY,   -- id из Intradesk
    name        TEXT NOT NULL,
    client_type INTEGER,               -- 10 / 20
    email       TEXT,
    address     TEXT,
    description TEXT,
    updated_at  TEXT,
    synced_at   TEXT NOT NULL DEFAULT (datetime('now'))
);

-- Пользователи (контактные лица) клиентов из Intradesk
CREATE TABLE IF NOT EXISTS intradesk_users (
    id          INTEGER PRIMARY KEY,   -- id (contactPersonId) из Intradesk
    name        TEXT,
    first_name  TEXT,
    last_name   TEXT,
    middle_name TEXT,
    email       TEXT,
    phone       TEXT,
    client_id   INTEGER,               -- userGroup.id из Intradesk
    is_archived INTEGER NOT NULL DEFAULT 0,
    synced_at   TEXT NOT NULL DEFAULT (datetime('now'))
);

-- Заявки из Intradesk
CREATE TABLE IF NOT EXISTS intradesk_tasks (
    id                INTEGER PRIMARY KEY,   -- id из Intradesk
    task_number       INTEGER,
    name              TEXT,
    description       TEXT,
    status_id         INTEGER,
    status_name       TEXT,
    priority_id       INTEGER,
    priority_name     TEXT,
    client_id         INTEGER,               -- clientid из Intradesk
    initiator_id      INTEGER,
    initiator_name    TEXT,
    executor_id       INTEGER,
    executor_name     TEXT,
    executor_group    INTEGER,
    service_name      TEXT,
    service_full_name TEXT,
    created_at        TEXT,
    updated_at        TEXT,
    closed_at         TEXT,
    created_by        TEXT,
    updated_by        TEXT,
    synced_at         TEXT NOT NULL DEFAULT (datetime('now'))
);

-- Лог запусков синхронизации
CREATE TABLE IF NOT EXISTS intradesk_sync_log (
    id             INTEGER PRIMARY KEY AUTOINCREMENT,
    sync_type      TEXT NOT NULL,                          -- clients / users / tasks / all
    started_at     TEXT NOT NULL DEFAULT (datetime('now')),
    finished_at    TEXT,
    status         TEXT NOT NULL DEFAULT 'running',        -- running / success / error
    records_synced INTEGER NOT NULL DEFAULT 0,
    error_message  TEXT
);
