-- InsightFlow Phase 3 - Database Schema
-- 支持知识生长与多文件融合

-- 项目表
CREATE TABLE IF NOT EXISTS projects (
    id TEXT PRIMARY KEY,
    name TEXT NOT NULL,
    description TEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 文件/转录表
CREATE TABLE IF NOT EXISTS transcripts (
    id TEXT PRIMARY KEY,
    project_id TEXT NOT NULL,
    filename TEXT,
    full_text TEXT,
    type TEXT DEFAULT 'audio',  -- 'audio' 或 'document'
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (project_id) REFERENCES projects(id)
);

-- 全局实体表（跨文件共享）
CREATE TABLE IF NOT EXISTS entities (
    id TEXT PRIMARY KEY,
    project_id TEXT NOT NULL,
    name TEXT NOT NULL,
    canonical_name TEXT,  -- 规范名称（用于对齐）
    type TEXT,
    definition TEXT,
    aliases TEXT,  -- JSON 数组：["别名1", "别名2"]
    embedding TEXT,  -- JSON 数组：实体名称+定义的 embedding
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (project_id) REFERENCES projects(id)
);

-- 实体提及表（文件中的具体位置）
CREATE TABLE IF NOT EXISTS entity_mentions (
    id TEXT PRIMARY KEY,
    entity_id TEXT NOT NULL,
    transcript_id TEXT NOT NULL,
    start_pos INTEGER,
    end_pos INTEGER,
    text_snippet TEXT,
    confidence REAL DEFAULT 1.0,
    FOREIGN KEY (entity_id) REFERENCES entities(id),
    FOREIGN KEY (transcript_id) REFERENCES transcripts(id)
);

-- 实体关系表
CREATE TABLE IF NOT EXISTS entity_relations (
    id TEXT PRIMARY KEY,
    project_id TEXT NOT NULL,
    source_entity_id TEXT NOT NULL,
    target_entity_id TEXT NOT NULL,
    relation_type TEXT,  -- "belongs_to", "works_with", "depends_on" 等
    evidence TEXT,  -- 关系来源文本
    transcript_id TEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (project_id) REFERENCES projects(id),
    FOREIGN KEY (source_entity_id) REFERENCES entities(id),
    FOREIGN KEY (target_entity_id) REFERENCES entities(id)
);

-- 术语表（项目级热词，用于 ASR 优化）
CREATE TABLE IF NOT EXISTS glossary (
    id TEXT PRIMARY KEY,
    project_id TEXT NOT NULL,
    term TEXT NOT NULL,
    pronunciation TEXT,  -- 发音提示，如 "K8s" -> "Kubernetes"
    frequency INTEGER DEFAULT 1,
    FOREIGN KEY (project_id) REFERENCES projects(id)
);

-- Phase 5: 属性模板表
CREATE TABLE IF NOT EXISTS attribute_templates (
    id TEXT PRIMARY KEY,
    project_id TEXT NOT NULL,
    name TEXT NOT NULL,
    type TEXT NOT NULL,  -- text/number/date/select/multiselect
    description TEXT,
    options TEXT,  -- JSON 数组，用于 select/multiselect 类型
    is_required INTEGER DEFAULT 0,
    default_value TEXT,
    sort_order INTEGER DEFAULT 0,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (project_id) REFERENCES projects(id)
);

-- Phase 5: 实体属性值表
CREATE TABLE IF NOT EXISTS entity_attributes (
    id TEXT PRIMARY KEY,
    entity_id TEXT NOT NULL,
    template_id TEXT,
    name TEXT NOT NULL,
    type TEXT NOT NULL,  -- text/number/date/select/multiselect
    value TEXT,  -- 存储实际值
    options TEXT,  -- JSON 数组，用于 select/multiselect
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (entity_id) REFERENCES entities(id) ON DELETE CASCADE,
    FOREIGN KEY (template_id) REFERENCES attribute_templates(id) ON DELETE SET NULL,
    UNIQUE(entity_id, name)
);

-- Phase 5: 属性变更历史表
CREATE TABLE IF NOT EXISTS attribute_history (
    id TEXT PRIMARY KEY,
    entity_id TEXT NOT NULL,
    attribute_name TEXT NOT NULL,
    old_value TEXT,
    new_value TEXT,
    changed_by TEXT,  -- 用户ID或系统
    changed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    change_reason TEXT,
    FOREIGN KEY (entity_id) REFERENCES entities(id) ON DELETE CASCADE
);

-- Phase 5: 属性模板表（项目级自定义属性定义）
CREATE TABLE IF NOT EXISTS attribute_templates (
    id TEXT PRIMARY KEY,
    project_id TEXT NOT NULL,
    name TEXT NOT NULL,  -- 属性名称，如"年龄"、"职位"
    type TEXT NOT NULL,  -- 属性类型: text, number, date, select, multiselect, boolean
    options TEXT,  -- JSON 数组，用于 select/multiselect 类型
    default_value TEXT,  -- 默认值
    description TEXT,  -- 属性描述
    is_required BOOLEAN DEFAULT 0,  -- 是否必填
    display_order INTEGER DEFAULT 0,  -- 显示顺序
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (project_id) REFERENCES projects(id)
);

-- Phase 5: 实体属性值表
CREATE TABLE IF NOT EXISTS entity_attributes (
    id TEXT PRIMARY KEY,
    entity_id TEXT NOT NULL,
    template_id TEXT NOT NULL,
    value TEXT,  -- 属性值（以JSON或字符串形式存储）
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (entity_id) REFERENCES entities(id) ON DELETE CASCADE,
    FOREIGN KEY (template_id) REFERENCES attribute_templates(id) ON DELETE CASCADE,
    UNIQUE(entity_id, template_id)  -- 每个实体每个属性只能有一个值
);

-- Phase 5: 属性变更历史表
CREATE TABLE IF NOT EXISTS attribute_history (
    id TEXT PRIMARY KEY,
    entity_id TEXT NOT NULL,
    template_id TEXT NOT NULL,
    old_value TEXT,
    new_value TEXT,
    changed_by TEXT,  -- 用户ID或"system"
    changed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    change_reason TEXT,  -- 变更原因
    FOREIGN KEY (entity_id) REFERENCES entities(id) ON DELETE CASCADE,
    FOREIGN KEY (template_id) REFERENCES attribute_templates(id) ON DELETE CASCADE
);

-- 创建索引以提高查询性能
CREATE INDEX IF NOT EXISTS idx_entities_project ON entities(project_id);
CREATE INDEX IF NOT EXISTS idx_entities_name ON entities(name);
CREATE INDEX IF NOT EXISTS idx_transcripts_project ON transcripts(project_id);
CREATE INDEX IF NOT EXISTS idx_mentions_entity ON entity_mentions(entity_id);
CREATE INDEX IF NOT EXISTS idx_mentions_transcript ON entity_mentions(transcript_id);
CREATE INDEX IF NOT EXISTS idx_relations_project ON entity_relations(project_id);
CREATE INDEX IF NOT EXISTS idx_glossary_project ON glossary(project_id);

-- Phase 5: 属性相关索引
CREATE INDEX IF NOT EXISTS idx_attr_templates_project ON attribute_templates(project_id);
CREATE INDEX IF NOT EXISTS idx_entity_attributes_entity ON entity_attributes(entity_id);
CREATE INDEX IF NOT EXISTS idx_entity_attributes_template ON entity_attributes(template_id);
CREATE INDEX IF NOT EXISTS idx_attr_history_entity ON attribute_history(entity_id);

-- Phase 7: 协作与共享 - 项目分享表
CREATE TABLE IF NOT EXISTS project_shares (
    id TEXT PRIMARY KEY,
    project_id TEXT NOT NULL,
    token TEXT NOT NULL UNIQUE,           -- 分享令牌
    permission TEXT DEFAULT 'read_only',  -- 权限级别: read_only, comment, edit, admin
    created_by TEXT NOT NULL,             -- 创建者
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    expires_at TIMESTAMP,                 -- 过期时间
    max_uses INTEGER,                     -- 最大使用次数
    use_count INTEGER DEFAULT 0,          -- 已使用次数
    password_hash TEXT,                   -- 密码保护(哈希)
    is_active BOOLEAN DEFAULT 1,          -- 是否激活
    allow_download BOOLEAN DEFAULT 0,     -- 允许下载
    allow_export BOOLEAN DEFAULT 0,       -- 允许导出
    FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE
);

-- Phase 7: 协作与共享 - 评论表
CREATE TABLE IF NOT EXISTS comments (
    id TEXT PRIMARY KEY,
    project_id TEXT NOT NULL,
    target_type TEXT NOT NULL,            -- 目标类型: entity, relation, transcript, project
    target_id TEXT NOT NULL,              -- 目标ID
    parent_id TEXT,                       -- 父评论ID(支持回复)
    author TEXT NOT NULL,                 -- 作者ID
    author_name TEXT,                     -- 作者显示名
    content TEXT NOT NULL,                -- 评论内容
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    resolved BOOLEAN DEFAULT 0,           -- 是否已解决
    resolved_by TEXT,                     -- 解决者
    resolved_at TIMESTAMP,                -- 解决时间
    mentions TEXT,                        -- JSON数组: 提及的用户
    attachments TEXT,                     -- JSON数组: 附件
    FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE,
    FOREIGN KEY (parent_id) REFERENCES comments(id) ON DELETE CASCADE
);

-- Phase 7: 协作与共享 - 变更历史表
CREATE TABLE IF NOT EXISTS change_history (
    id TEXT PRIMARY KEY,
    project_id TEXT NOT NULL,
    change_type TEXT NOT NULL,            -- 变更类型: create, update, delete, merge, split
    entity_type TEXT NOT NULL,            -- 实体类型: entity, relation, transcript, project
    entity_id TEXT NOT NULL,              -- 实体ID
    entity_name TEXT,                     -- 实体名称(用于显示)
    changed_by TEXT NOT NULL,             -- 变更者ID
    changed_by_name TEXT,                 -- 变更者显示名
    changed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    old_value TEXT,                       -- JSON: 旧值
    new_value TEXT,                       -- JSON: 新值
    description TEXT,                     -- 变更描述
    session_id TEXT,                      -- 会话ID(批量变更关联)
    reverted BOOLEAN DEFAULT 0,           -- 是否已回滚
    reverted_at TIMESTAMP,                -- 回滚时间
    reverted_by TEXT,                     -- 回滚者
    FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE
);

-- Phase 7: 协作与共享 - 团队成员表
CREATE TABLE IF NOT EXISTS team_members (
    id TEXT PRIMARY KEY,
    project_id TEXT NOT NULL,
    user_id TEXT NOT NULL,                -- 用户ID
    user_name TEXT,                       -- 用户名
    user_email TEXT,                      -- 用户邮箱
    role TEXT DEFAULT 'viewer',           -- 角色: owner, admin, editor, viewer, commenter
    joined_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    invited_by TEXT,                      -- 邀请者
    last_active_at TIMESTAMP,             -- 最后活跃时间
    permissions TEXT,                     -- JSON数组: 具体权限列表
    FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE,
    UNIQUE(project_id, user_id)           -- 每个项目每个用户只能有一条记录
);

-- Phase 7: 协作与共享索引
CREATE INDEX IF NOT EXISTS idx_shares_project ON project_shares(project_id);
CREATE INDEX IF NOT EXISTS idx_shares_token ON project_shares(token);
CREATE INDEX IF NOT EXISTS idx_comments_project ON comments(project_id);
CREATE INDEX IF NOT EXISTS idx_comments_target ON comments(target_type, target_id);
CREATE INDEX IF NOT EXISTS idx_comments_parent ON comments(parent_id);
CREATE INDEX IF NOT EXISTS idx_change_history_project ON change_history(project_id);
CREATE INDEX IF NOT EXISTS idx_change_history_entity ON change_history(entity_type, entity_id);
CREATE INDEX IF NOT EXISTS idx_change_history_session ON change_history(session_id);
CREATE INDEX IF NOT EXISTS idx_team_members_project ON team_members(project_id);
CREATE INDEX IF NOT EXISTS idx_team_members_user ON team_members(user_id);
