-- =========================================
-- 消息中心模块 (message.sql)
-- 功能：用户私聊、系统通知
-- =========================================

-- ========================================
-- 清除旧表
-- ========================================
DROP TABLE IF EXISTS `sys_chat_message`;
DROP TABLE IF EXISTS `sys_conversation_member`;
DROP TABLE IF EXISTS `sys_conversation`;
DROP TABLE IF EXISTS `sys_notification_receiver`;
DROP TABLE IF EXISTS `sys_notification`;
DROP TABLE IF EXISTS `sys_message_receiver`;
DROP TABLE IF EXISTS `sys_message`;
DROP TABLE IF EXISTS `sys_message_remark`;
DROP VIEW IF EXISTS `v_user_conversations`;

-- ========================================
-- 1. 系统通知相关表（用于 /system/message 页面）
-- ========================================

-- 系统通知表
DROP TABLE IF EXISTS `sys_notification`;
CREATE TABLE `sys_notification` (
  `notification_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '通知ID',
  `title` varchar(255) NOT NULL COMMENT '通知标题',
  `content` text NOT NULL COMMENT '通知内容',
  `notification_type` varchar(50) DEFAULT 'system' COMMENT '通知类型（system系统通知 maintenance维护通知 announcement公告）',
  `priority` char(1) DEFAULT '0' COMMENT '优先级（0普通 1重要 2紧急）',
  `sender_id` bigint(20) DEFAULT NULL COMMENT '发送者ID（系统通知为NULL）',
  `sender_name` varchar(100) DEFAULT '系统' COMMENT '发送者名称',
  `target_type` char(1) DEFAULT '1' COMMENT '目标类型（1全部用户 2指定用户 3指定角色）',
  `target_users` text COMMENT '目标用户ID列表（JSON格式）',
  `target_roles` text COMMENT '目标角色ID列表（JSON格式）',
  `status` char(1) DEFAULT '1' COMMENT '状态（0草稿 1已发布 2已撤回）',
  `publish_time` datetime DEFAULT NULL COMMENT '发布时间',
  `expire_time` datetime DEFAULT NULL COMMENT '过期时间',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`notification_id`),
  KEY `idx_sender_id` (`sender_id`),
  KEY `idx_status` (`status`),
  KEY `idx_publish_time` (`publish_time`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='系统通知表';

-- 通知接收记录表
DROP TABLE IF EXISTS `sys_notification_receiver`;
CREATE TABLE `sys_notification_receiver` (
  `receiver_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '接收记录ID',
  `notification_id` bigint(20) NOT NULL COMMENT '通知ID',
  `user_id` bigint(20) NOT NULL COMMENT '接收者用户ID',
  `user_name` varchar(100) DEFAULT NULL COMMENT '接收者用户名',
  `is_read` char(1) DEFAULT '0' COMMENT '是否已读（0未读 1已读）',
  `read_time` datetime DEFAULT NULL COMMENT '阅读时间',
  `is_deleted` char(1) DEFAULT '0' COMMENT '是否删除（0未删除 1已删除）',
  `delete_time` datetime DEFAULT NULL COMMENT '删除时间',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`receiver_id`),
  UNIQUE KEY `uk_notification_user` (`notification_id`, `user_id`),
  KEY `idx_user_id` (`user_id`),
  KEY `idx_is_read` (`is_read`),
  KEY `idx_user_read` (`user_id`, `is_read`, `is_deleted`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='通知接收记录表';

-- ========================================
-- 2. 用户对话相关表（用于 /message 页面）
-- ========================================

-- 会话表
DROP TABLE IF EXISTS `sys_conversation`;
CREATE TABLE `sys_conversation` (
  `conversation_id` varchar(100) NOT NULL COMMENT '会话ID',
  `conversation_type` char(1) DEFAULT '1' COMMENT '会话类型（1私聊 2群聊）',
  `conversation_name` varchar(255) DEFAULT NULL COMMENT '会话名称（群聊使用）',
  `creator_id` bigint(20) DEFAULT NULL COMMENT '创建者ID',
  `creator_name` varchar(100) DEFAULT NULL COMMENT '创建者名称',
  `last_message_id` bigint(20) DEFAULT NULL COMMENT '最后一条消息ID',
  `last_message_time` datetime DEFAULT NULL COMMENT '最后消息时间',
  `status` char(1) DEFAULT '1' COMMENT '状态（0禁用 1正常）',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`conversation_id`),
  KEY `idx_creator_id` (`creator_id`),
  KEY `idx_last_message_time` (`last_message_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='会话表';

-- 会话参与者表
DROP TABLE IF EXISTS `sys_conversation_member`;
CREATE TABLE `sys_conversation_member` (
  `member_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '成员ID',
  `conversation_id` varchar(100) NOT NULL COMMENT '会话ID',
  `user_id` bigint(20) NOT NULL COMMENT '用户ID',
  `user_name` varchar(100) DEFAULT NULL COMMENT '用户名',
  `nick_name` varchar(100) DEFAULT NULL COMMENT '用户昵称',
  `remark_name` varchar(100) DEFAULT NULL COMMENT '备注名称',
  `role` char(1) DEFAULT '1' COMMENT '角色（1普通成员 2管理员 3群主）',
  `join_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '加入时间',
  `last_read_message_id` bigint(20) DEFAULT NULL COMMENT '最后已读消息ID',
  `unread_count` int(11) DEFAULT 0 COMMENT '未读消息数',
  `is_muted` char(1) DEFAULT '0' COMMENT '是否免打扰（0否 1是）',
  `is_deleted` char(1) DEFAULT '0' COMMENT '是否删除（0否 1是）',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`member_id`),
  UNIQUE KEY `uk_conversation_user` (`conversation_id`, `user_id`),
  KEY `idx_user_id` (`user_id`),
  KEY `idx_conversation_id` (`conversation_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='会话参与者表';

-- 对话消息表
DROP TABLE IF EXISTS `sys_chat_message`;
CREATE TABLE `sys_chat_message` (
  `message_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '消息ID',
  `conversation_id` varchar(100) NOT NULL COMMENT '会话ID',
  `sender_id` bigint(20) NOT NULL COMMENT '发送者ID',
  `sender_name` varchar(100) NOT NULL COMMENT '发送者名称',
  `message_type` varchar(20) DEFAULT 'text' COMMENT '消息类型（text文本 image图片 file文件 voice语音）',
  `content` text NOT NULL COMMENT '消息内容',
  `reply_to_message_id` bigint(20) DEFAULT NULL COMMENT '回复的消息ID',
  `status` char(1) DEFAULT '1' COMMENT '状态（0已删除 1正常 2已撤回）',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`message_id`),
  KEY `idx_conversation_id` (`conversation_id`),
  KEY `idx_sender_id` (`sender_id`),
  KEY `idx_create_time` (`create_time`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='对话消息表';

-- ========================================
-- 3. 插入测试数据
-- ========================================

-- 系统通知测试数据
INSERT INTO `sys_notification` (`notification_id`, `title`, `content`, `notification_type`, `priority`, `status`, `publish_time`) VALUES
(1, '欢迎使用YuShu管理系统', '欢迎您使用YuShu管理系统！这是一条系统欢迎消息。', 'system', '1', '1', NOW()),
(2, '系统维护通知', '系统将于今晚22:00-23:00进行维护，请提前保存工作内容。', 'maintenance', '2', '1', NOW());

-- 给admin用户发送通知
INSERT INTO `sys_notification_receiver` (`notification_id`, `user_id`, `user_name`, `is_read`) VALUES
(1, 1, 'admin', '0'),
(2, 1, 'admin', '0');

-- 会话测试数据（只为实际存在的用户创建）
-- admin(用户ID=1) 和 ry(用户ID=2) 的对话
INSERT INTO `sys_conversation` (`conversation_id`, `conversation_type`, `creator_id`, `creator_name`, `last_message_time`) VALUES
('conv_admin_ry', '1', 1, 'admin', NOW());

-- 会话参与者（只包含系统已有的两个用户）
INSERT INTO `sys_conversation_member` (`conversation_id`, `user_id`, `user_name`, `nick_name`, `unread_count`) VALUES
('conv_admin_ry', 1, 'admin', 'admin', 0),
('conv_admin_ry', 2, 'ry', 'ry', 0);

-- 对话消息测试数据（可选，如果需要初始消息）
-- INSERT INTO `sys_chat_message` (`message_id`, `conversation_id`, `sender_id`, `sender_name`, `content`) VALUES
-- (1, 'conv_admin_ry', 2, 'ry', '你好'),
-- (2, 'conv_admin_ry', 1, 'admin', '你好！');

-- 更新会话的最后消息ID（如果有初始消息）
-- UPDATE `sys_conversation` SET `last_message_id` = 2 WHERE `conversation_id` = 'conv_admin_ry';

-- ========================================
-- 4. 创建视图简化查询
-- ========================================

-- 会话列表视图（用户视角）
DROP VIEW IF EXISTS `v_user_conversations`;
CREATE VIEW `v_user_conversations` AS
SELECT 
    c.conversation_id,
    c.conversation_type,
    c.conversation_name,
    c.last_message_time,
    cm.user_id as current_user_id,
    cm.unread_count,
    cm.is_muted,
    cm.remark_name,
    -- 获取对方用户信息（私聊）
    (SELECT GROUP_CONCAT(
        CASE 
            WHEN cm2.remark_name IS NOT NULL THEN cm2.remark_name
            WHEN cm2.nick_name IS NOT NULL THEN cm2.nick_name
            ELSE cm2.user_name
        END
        SEPARATOR ', '
    ) 
     FROM sys_conversation_member cm2 
     WHERE cm2.conversation_id = c.conversation_id 
     AND cm2.user_id != cm.user_id 
     AND cm2.is_deleted = '0') as other_members,
    -- 获取最后一条消息
    (SELECT content FROM sys_chat_message WHERE message_id = c.last_message_id) as last_message
FROM sys_conversation c
INNER JOIN sys_conversation_member cm ON c.conversation_id = cm.conversation_id
WHERE cm.is_deleted = '0' AND c.status = '1';

-- 查看测试结果
SELECT '=== 系统通知 ===' as info;
SELECT * FROM sys_notification;

SELECT '=== 通知接收记录 ===' as info;
SELECT * FROM sys_notification_receiver;

SELECT '=== 会话列表 ===' as info;
SELECT * FROM sys_conversation;

SELECT '=== 会话成员 ===' as info;
SELECT * FROM sys_conversation_member;

SELECT '=== 对话消息 ===' as info;
SELECT * FROM sys_chat_message;

SELECT '=== 用户会话视图（admin用户） ===' as info;
SELECT * FROM v_user_conversations WHERE current_user_id = 1 ORDER BY last_message_time DESC;
