-- =====================================================
-- Timeline 数据库迁移脚本
-- 版本: V1.2.0
-- 日期: 2024
-- 描述: 第二阶段功能增强 - 搜索、标签、评论、通知系统
-- =====================================================

-- -----------------------------------------------------
-- 1. 标签系统表结构（如已存在则跳过）
-- -----------------------------------------------------

-- 标签表
CREATE TABLE IF NOT EXISTS tag (
    id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID',
    instance_id VARCHAR(64) UNIQUE NOT NULL COMMENT '标签唯一标识',
    name VARCHAR(50) NOT NULL COMMENT '标签名称',
    color VARCHAR(20) DEFAULT '#1890ff' COMMENT '标签颜色',
    owner_id VARCHAR(64) NOT NULL COMMENT '创建者ID',
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    is_delete TINYINT DEFAULT 0 COMMENT '是否删除 0-否 1-是',
    INDEX idx_tag_owner (owner_id),
    INDEX idx_tag_name (name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='标签表';

-- 时间线节点与标签关联表
CREATE TABLE IF NOT EXISTS story_item_tag (
    id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID',
    story_item_id VARCHAR(64) NOT NULL COMMENT '时间线节点ID',
    tag_id VARCHAR(64) NOT NULL COMMENT '标签ID',
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    create_id VARCHAR(64) COMMENT '创建者ID',
    UNIQUE KEY uk_item_tag (story_item_id, tag_id),
    INDEX idx_tag_story_item (tag_id, story_item_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='时间线节点标签关联表';

-- -----------------------------------------------------
-- 2. 评论系统表结构
-- -----------------------------------------------------

-- 评论表
CREATE TABLE IF NOT EXISTS story_comment (
    id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID',
    instance_id VARCHAR(64) UNIQUE NOT NULL COMMENT '评论唯一标识',
    story_item_id VARCHAR(64) NOT NULL COMMENT '时间线节点ID',
    user_id VARCHAR(64) NOT NULL COMMENT '评论用户ID',
    parent_id VARCHAR(64) DEFAULT NULL COMMENT '父评论ID，用于回复功能',
    reply_to_user_id VARCHAR(64) DEFAULT NULL COMMENT '回复的用户ID',
    content TEXT NOT NULL COMMENT '评论内容',
    like_count INT DEFAULT 0 COMMENT '点赞数',
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    is_delete TINYINT DEFAULT 0 COMMENT '是否删除 0-否 1-是',
    INDEX idx_comment_story_item (story_item_id, create_time DESC),
    INDEX idx_comment_user (user_id),
    INDEX idx_comment_parent (parent_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='评论表';

-- -----------------------------------------------------
-- 3. 点赞系统表结构
-- -----------------------------------------------------

-- 点赞表（节点点赞）
CREATE TABLE IF NOT EXISTS story_item_like (
    id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID',
    story_item_id VARCHAR(64) NOT NULL COMMENT '时间线节点ID',
    user_id VARCHAR(64) NOT NULL COMMENT '点赞用户ID',
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    UNIQUE KEY uk_item_user (story_item_id, user_id),
    INDEX idx_like_user (user_id, create_time DESC)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='节点点赞表';

-- 评论点赞表
CREATE TABLE IF NOT EXISTS comment_like (
    id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID',
    comment_id VARCHAR(64) NOT NULL COMMENT '评论ID',
    user_id VARCHAR(64) NOT NULL COMMENT '点赞用户ID',
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    UNIQUE KEY uk_comment_user (comment_id, user_id),
    INDEX idx_comment_like_user (user_id, create_time DESC)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='评论点赞表';

-- -----------------------------------------------------
-- 4. 收藏系统表结构
-- -----------------------------------------------------

-- 收藏表
CREATE TABLE IF NOT EXISTS story_item_favorite (
    id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID',
    instance_id VARCHAR(64) UNIQUE NOT NULL COMMENT '收藏记录唯一标识',
    story_item_id VARCHAR(64) NOT NULL COMMENT '时间线节点ID',
    user_id VARCHAR(64) NOT NULL COMMENT '收藏用户ID',
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    UNIQUE KEY uk_item_user (story_item_id, user_id),
    INDEX idx_favorite_user (user_id, create_time DESC)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='收藏表';

-- -----------------------------------------------------
-- 5. 消息通知系统表结构
-- -----------------------------------------------------

-- 消息通知表
CREATE TABLE IF NOT EXISTS notification (
    id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID',
    instance_id VARCHAR(64) UNIQUE NOT NULL COMMENT '消息唯一标识',
    user_id VARCHAR(64) NOT NULL COMMENT '接收用户ID',
    type VARCHAR(20) NOT NULL COMMENT '消息类型: COMMENT/LIKE/MENTION/INVITE/SYSTEM',
    title VARCHAR(200) NOT NULL COMMENT '消息标题',
    content TEXT COMMENT '消息内容',
    related_id VARCHAR(64) COMMENT '关联ID(评论ID/节点ID等)',
    related_type VARCHAR(20) COMMENT '关联类型: STORY_ITEM/COMMENT/STORY',
    sender_id VARCHAR(64) COMMENT '发送者ID',
    sender_name VARCHAR(100) COMMENT '发送者名称',
    sender_avatar VARCHAR(500) COMMENT '发送者头像',
    is_read TINYINT DEFAULT 0 COMMENT '是否已读 0-未读 1-已读',
    read_time DATETIME COMMENT '阅读时间',
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    INDEX idx_notification_user (user_id, is_read, create_time DESC),
    INDEX idx_notification_type (type)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='消息通知表';

-- -----------------------------------------------------
-- 6. 操作历史记录表（支持撤销/重做）
-- -----------------------------------------------------

-- 操作历史表
CREATE TABLE IF NOT EXISTS operation_history (
    id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID',
    instance_id VARCHAR(64) UNIQUE NOT NULL COMMENT '记录唯一标识',
    user_id VARCHAR(64) NOT NULL COMMENT '操作用户ID',
    story_id VARCHAR(64) COMMENT '故事ID',
    operation_type VARCHAR(20) NOT NULL COMMENT '操作类型: CREATE/UPDATE/DELETE/REORDER',
    target_type VARCHAR(20) NOT NULL COMMENT '目标类型: STORY/STORY_ITEM',
    target_id VARCHAR(64) NOT NULL COMMENT '目标ID',
    before_data JSON COMMENT '操作前数据快照',
    after_data JSON COMMENT '操作后数据快照',
    description VARCHAR(200) COMMENT '操作描述',
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    INDEX idx_history_user_story (user_id, story_id, create_time DESC),
    INDEX idx_history_target (target_type, target_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='操作历史记录表';

-- -----------------------------------------------------
-- 7. 用户消息设置表
-- -----------------------------------------------------

-- 用户消息设置表
CREATE TABLE IF NOT EXISTS user_notification_setting (
    id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID',
    user_id VARCHAR(64) UNIQUE NOT NULL COMMENT '用户ID',
    comment_notify TINYINT DEFAULT 1 COMMENT '评论通知 0-关闭 1-开启',
    like_notify TINYINT DEFAULT 1 COMMENT '点赞通知 0-关闭 1-开启',
    mention_notify TINYINT DEFAULT 1 COMMENT '@提及通知 0-关闭 1-开启',
    invite_notify TINYINT DEFAULT 1 COMMENT '邀请通知 0-关闭 1-开启',
    system_notify TINYINT DEFAULT 1 COMMENT '系统通知 0-关闭 1-开启',
    email_notify TINYINT DEFAULT 0 COMMENT '邮件通知 0-关闭 1-开启',
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户消息设置表';

-- -----------------------------------------------------
-- 8. @提及记录表
-- -----------------------------------------------------

-- @提及表
CREATE TABLE IF NOT EXISTS mention (
    id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID',
    instance_id VARCHAR(64) UNIQUE NOT NULL COMMENT '提及记录唯一标识',
    from_user_id VARCHAR(64) NOT NULL COMMENT '提及者ID',
    to_user_id VARCHAR(64) NOT NULL COMMENT '被提及者ID',
    related_type VARCHAR(20) NOT NULL COMMENT '关联类型: COMMENT/STORY_ITEM',
    related_id VARCHAR(64) NOT NULL COMMENT '关联ID',
    is_notified TINYINT DEFAULT 0 COMMENT '是否已发送通知 0-否 1-是',
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    INDEX idx_mention_to (to_user_id, is_notified, create_time DESC),
    INDEX idx_mention_related (related_type, related_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='@提及记录表';

-- -----------------------------------------------------
-- 9. 统计字段更新触发器
-- -----------------------------------------------------

-- 为 story_item 表添加统计字段
ALTER TABLE story_item 
ADD COLUMN comment_count INT DEFAULT 0 COMMENT '评论数',
ADD COLUMN like_count INT DEFAULT 0 COMMENT '点赞数',
ADD COLUMN favorite_count INT DEFAULT 0 COMMENT '收藏数';

-- -----------------------------------------------------
-- 10. 索引优化
-- -----------------------------------------------------

-- 为 story_item 表添加复合索引
CREATE INDEX IF NOT EXISTS idx_story_item_stats 
ON story_item(story_instance_id, is_delete, like_count DESC, create_time DESC);

-- -----------------------------------------------------
-- 数据迁移说明
-- -----------------------------------------------------

-- 1. 新表均为空表，无需数据迁移
-- 2. 统计字段默认值为 0，现有数据无需迁移
-- 3. 建议在低峰期执行此脚本
-- 4. Elasticsearch 索引需要单独创建和同步

-- -----------------------------------------------------
-- 回滚脚本 (如需回滚，请执行以下语句)
-- -----------------------------------------------------

/*
-- 删除新增字段
ALTER TABLE story_item DROP COLUMN comment_count;
ALTER TABLE story_item DROP COLUMN like_count;
ALTER TABLE story_item DROP COLUMN favorite_count;

-- 删除新增索引
DROP INDEX IF EXISTS idx_story_item_stats ON story_item;

-- 删除新增表
DROP TABLE IF EXISTS mention;
DROP TABLE IF EXISTS user_notification_setting;
DROP TABLE IF EXISTS operation_history;
DROP TABLE IF EXISTS notification;
DROP TABLE IF EXISTS story_item_favorite;
DROP TABLE IF EXISTS comment_like;
DROP TABLE IF EXISTS story_item_like;
DROP TABLE IF EXISTS story_comment;
DROP TABLE IF EXISTS story_item_tag;
DROP TABLE IF EXISTS tag;
*/
