-- ============================================
-- AegisOne MAX Bot — Database Schema
-- ============================================
-- Run this to set up all bot tables.
-- Assumes database 'aegisone' already exists.

-- ============================================
-- CLEANUP: Drop ALL old bot tables before recreating
-- ============================================
DROP TABLE IF EXISTS bot_1c_sync_log CASCADE;
DROP TABLE IF EXISTS bot_ticket_messages CASCADE;
DROP TABLE IF EXISTS bot_ticket_statuses CASCADE;
DROP TABLE IF EXISTS bot_tickets CASCADE;
DROP TABLE IF EXISTS bot_messages CASCADE;
DROP TABLE IF EXISTS bot_conversations CASCADE;
DROP TABLE IF EXISTS bot_knowledge_base CASCADE;
DROP TABLE IF EXISTS bot_categories CASCADE;
DROP TABLE IF EXISTS bot_users CASCADE;
DROP TABLE IF EXISTS bot_consent_logs CASCADE;
DROP TABLE IF EXISTS bot_features CASCADE;
DROP TABLE IF EXISTS bot_settings CASCADE;
DROP TABLE IF EXISTS bot_notification_subscriptions CASCADE;
DROP TABLE IF EXISTS bot_notifications CASCADE;
DROP TABLE IF EXISTS bot_risk_questions CASCADE;
DROP TABLE IF EXISTS bot_broadcasts CASCADE;
DROP TABLE IF EXISTS bot_response_templates CASCADE;
DROP TABLE IF EXISTS file_sync_queue CASCADE;

-- 1. BOT SETTINGS
CREATE TABLE IF NOT EXISTS bot_settings (
    id SERIAL PRIMARY KEY,
    key VARCHAR(255) UNIQUE NOT NULL,
    value TEXT,
    created_at TIMESTAMP DEFAULT now(),
    updated_at TIMESTAMP DEFAULT now()
);

-- 2. BOT FEATURES
CREATE TABLE IF NOT EXISTS bot_features (
    id SERIAL PRIMARY KEY,
    key VARCHAR(255) UNIQUE NOT NULL,
    name VARCHAR(255) NOT NULL,
    description TEXT,
    is_enabled BOOLEAN DEFAULT FALSE,
    created_at TIMESTAMP DEFAULT now()
);

-- 3. BOT CATEGORIES (for knowledge base)
CREATE TABLE IF NOT EXISTS bot_categories (
    id SERIAL PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    description TEXT,
    sort_order INTEGER DEFAULT 0,
    created_at TIMESTAMP DEFAULT now()
);

-- 4. BOT KNOWLEDGE BASE (Q&A pairs)
CREATE TABLE IF NOT EXISTS bot_knowledge_base (
    id SERIAL PRIMARY KEY,
    category_id INTEGER REFERENCES bot_categories(id) ON DELETE SET NULL,
    question TEXT NOT NULL,
    answer TEXT,
    keywords TEXT[],
    is_active BOOLEAN DEFAULT TRUE,
    source_url VARCHAR(500),
    sort_order INTEGER DEFAULT 0,
    created_at TIMESTAMP DEFAULT now(),
    updated_at TIMESTAMP DEFAULT now()
);

-- 5. BOT USERS (MAX messenger users)
CREATE TABLE IF NOT EXISTS bot_users (
    id BIGINT PRIMARY KEY,
    first_name VARCHAR(255),
    last_name VARCHAR(255),
    patronymic VARCHAR(255),
    username VARCHAR(255),
    phone VARCHAR(50),
    email VARCHAR(255),
    organization VARCHAR(255),
    address TEXT,
    vcf_raw TEXT,
    contact_hash VARCHAR(255),
    phone_verified BOOLEAN DEFAULT FALSE,
    email_verified BOOLEAN DEFAULT FALSE,
    consent_given BOOLEAN DEFAULT FALSE,
    consent_date TIMESTAMP,
    last_interaction TIMESTAMP,
    total_conversations INTEGER DEFAULT 0,
    total_tickets INTEGER DEFAULT 0,
    created_at TIMESTAMP DEFAULT now(),
    updated_at TIMESTAMP DEFAULT now()
);

-- 6. BOT CONVERSATIONS
CREATE TABLE IF NOT EXISTS bot_conversations (
    id BIGSERIAL PRIMARY KEY,
    user_id BIGINT NOT NULL REFERENCES bot_users(id) ON DELETE CASCADE,
    state VARCHAR(50) DEFAULT 'greeting',
    intent VARCHAR(50),
    inquiry_text TEXT,
    created_at TIMESTAMP DEFAULT now(),
    updated_at TIMESTAMP DEFAULT now()
);

-- 7. BOT MESSAGES
CREATE TABLE IF NOT EXISTS bot_messages (
    id BIGSERIAL PRIMARY KEY,
    conversation_id BIGINT NOT NULL REFERENCES bot_conversations(id) ON DELETE CASCADE,
    direction VARCHAR(10) NOT NULL,
    text TEXT,
    attachment_json TEXT,
    created_at TIMESTAMP DEFAULT now()
);

-- 8. BOT TICKETS (support tickets)
CREATE TABLE IF NOT EXISTS bot_tickets (
    id BIGSERIAL PRIMARY KEY,
    user_id BIGINT NOT NULL REFERENCES bot_users(id) ON DELETE CASCADE,
    title VARCHAR(500),
    description TEXT,
    priority VARCHAR(20) DEFAULT 'normal',
    status VARCHAR(20) DEFAULT 'Новая',
    created_by VARCHAR(100) DEFAULT 'bot',
    assigned_to BIGINT,
    created_at TIMESTAMP DEFAULT now(),
    updated_at TIMESTAMP DEFAULT now()
);

-- 9. BOT TICKET MESSAGES
CREATE TABLE IF NOT EXISTS bot_ticket_messages (
    id BIGSERIAL PRIMARY KEY,
    ticket_id BIGINT NOT NULL REFERENCES bot_tickets(id) ON DELETE CASCADE,
    direction VARCHAR(10) NOT NULL,
    text TEXT,
    created_at TIMESTAMP DEFAULT now()
);

-- 10. BOT TICKET STATUSES (change log)
CREATE TABLE IF NOT EXISTS bot_ticket_statuses (
    id BIGSERIAL PRIMARY KEY,
    ticket_id BIGINT NOT NULL REFERENCES bot_tickets(id) ON DELETE CASCADE,
    old_status VARCHAR(20),
    new_status VARCHAR(20) NOT NULL,
    changed_by VARCHAR(100),
    created_at TIMESTAMP DEFAULT now()
);

-- ============================================
-- CLEANUP: Drop unused tables from old bot
-- ============================================
DROP TABLE IF EXISTS bot_notification_subscriptions CASCADE;
DROP TABLE IF EXISTS bot_notifications CASCADE;
DROP TABLE IF EXISTS bot_risk_questions CASCADE;
DROP TABLE IF EXISTS bot_broadcasts CASCADE;
DROP TABLE IF EXISTS file_sync_queue CASCADE;
DROP TABLE IF EXISTS bot_response_templates CASCADE;

-- ============================================
-- INDEXES
-- ============================================
CREATE INDEX IF NOT EXISTS idx_bot_conversations_user_id ON bot_conversations(user_id);
CREATE INDEX IF NOT EXISTS idx_bot_conversations_state ON bot_conversations(state);
CREATE INDEX IF NOT EXISTS idx_bot_messages_conversation_id ON bot_messages(conversation_id);
CREATE INDEX IF NOT EXISTS idx_bot_tickets_user_id ON bot_tickets(user_id);
CREATE INDEX IF NOT EXISTS idx_bot_tickets_status ON bot_tickets(status);
CREATE INDEX IF NOT EXISTS idx_bot_ticket_messages_ticket_id ON bot_ticket_messages(ticket_id);
CREATE INDEX IF NOT EXISTS idx_bot_knowledge_base_category ON bot_knowledge_base(category_id);
CREATE INDEX IF NOT EXISTS idx_bot_knowledge_base_active ON bot_knowledge_base(is_active);
CREATE INDEX IF NOT EXISTS idx_bot_knowledge_base_keywords ON bot_knowledge_base USING gin(keywords);
