package org.xyzh.api.workcase.service;

import org.xyzh.api.workcase.dto.TbChatRoomDTO;
import org.xyzh.api.workcase.dto.TbChatRoomMemberDTO;
import org.xyzh.api.workcase.dto.TbChatRoomMessageDTO;
import org.xyzh.api.workcase.dto.TbCustomerServiceDTO;
import org.xyzh.api.workcase.vo.ChatRoomVO;
import org.xyzh.api.workcase.vo.ChatMemberVO;
import org.xyzh.api.workcase.vo.ChatRoomMessageVO;
import org.xyzh.api.workcase.vo.CustomerServiceVO;
import org.xyzh.common.core.domain.ResultDomain;
import org.xyzh.common.core.page.PageRequest;

/**
 * @description    聊天室服务接口，管理聊天室、成员和消息
 * @filename    ChatRoomService.java
 * @author    cascade
 * @copyright xyzh
 * @since 2025-12-22
 */
public interface ChatRoomService {

    // ========================= 聊天室管理 ==========================

    /**
     * @description    创建聊天室
     * @param chatRoom 聊天室信息
     * @author    cascade
     * @since 2025-12-22
     */
    ResultDomain<TbChatRoomDTO> createChatRoom(TbChatRoomDTO chatRoom);

    /**
     * @description    更新聊天室
     * @param chatRoom 聊天室信息
     * @author    cascade
     * @since 2025-12-22
     */
    ResultDomain<TbChatRoomDTO> updateChatRoom(TbChatRoomDTO chatRoom);

    /**
     * @description    关闭聊天室
     * @param roomId 聊天室ID
     * @param closedBy 关闭人
     * @author    cascade
     * @since 2025-12-22
     */
    ResultDomain<Boolean> closeChatRoom(String roomId, String closedBy);

    /**
     * @description    删除聊天室
     * @param roomId 聊天室ID
     * @author    cascade
     * @since 2025-12-22
     */
    ResultDomain<Boolean> deleteChatRoom(String roomId);

    /**
     * @description    根据ID获取聊天室
     * @param roomId 聊天室ID
     * @author    cascade
     * @since 2025-12-22
     */
    ResultDomain<TbChatRoomDTO> getChatRoomById(String roomId);

    /**
     * @description    分页查询聊天室（含当前用户未读数）
     * @param pageRequest 分页请求参数
     * @param userId 当前用户ID（用于查询未读数）
     * @author    cascade
     * @since 2025-12-22
     */
    ResultDomain<ChatRoomVO> getChatRoomPage(PageRequest<TbChatRoomDTO> pageRequest, String userId);

    // ========================= 聊天室成员管理 ==========================

    /**
     * @description    添加聊天室成员
     * @param member 成员信息
     * @author    cascade
     * @since 2025-12-22
     */
    ResultDomain<TbChatRoomMemberDTO> addChatRoomMember(TbChatRoomMemberDTO member);

    /**
     * @description    移除聊天室成员
     * @param memberId 成员ID
     * @author    cascade
     * @since 2025-12-22
     */
    ResultDomain<Boolean> removeChatRoomMember(String memberId);

    /**
     * @description    更新成员信息（如角色、状态）
     * @param member 成员信息
     * @author    cascade
     * @since 2025-12-22
     */
    ResultDomain<TbChatRoomMemberDTO> updateChatRoomMember(TbChatRoomMemberDTO member);

    /**
     * @description    获取聊天室成员列表
     * @param roomId 聊天室ID
     * @author    cascade
     * @since 2025-12-22
     */
    ResultDomain<ChatMemberVO> getChatRoomMemberList(String roomId);

    /**
     * @description    更新成员已读状态
     * @param memberId 成员ID
     * @param lastReadMsgId 最后已读消息ID
     * @author    cascade
     * @since 2025-12-22
     */
    ResultDomain<Boolean> updateMemberReadStatus(String memberId, String lastReadMsgId);

    /**
     * @description    获取当前用户在指定聊天室的未读消息数
     * @param roomId 聊天室ID
     * @param userId 用户ID
     * @author    cascade
     * @since 2025-12-24
     */
    ResultDomain<Integer> getUnreadCount(String roomId, String userId);

    // ========================= 聊天消息管理 ==========================

    /**
     * @description    发送消息
     * @param message 消息内容
     * @author    cascade
     * @since 2025-12-22
     */
    ResultDomain<TbChatRoomMessageDTO> sendMessage(TbChatRoomMessageDTO message);

    /**
     * @description    获取聊天室消息列表/分页
     * @param pageRequest 分页请求
     * @author    cascade
     * @since 2025-12-22
     */
    ResultDomain<ChatRoomMessageVO> getChatMessagePage(PageRequest<TbChatRoomMessageDTO> pageRequest);

    /**
     * @description    删除消息
     * @param messageId 消息ID
     * @author    cascade
     * @since 2025-12-22
     */
    ResultDomain<Boolean> deleteMessage(String messageId);

    // ========================= 客服人员管理 ==========================

    /**
     * @description    添加客服人员配置
     * @param customerService 客服人员信息
     * @author    cascade
     * @since 2025-12-22
     */
    ResultDomain<TbCustomerServiceDTO> addCustomerService(TbCustomerServiceDTO customerService);

    /**
     * @description    更新客服人员配置
     * @param customerService 客服人员信息
     * @author    cascade
     * @since 2025-12-22
     */
    ResultDomain<TbCustomerServiceDTO> updateCustomerService(TbCustomerServiceDTO customerService);

    /**
     * @description    删除客服人员配置
     * @param userId 员工ID
     * @author    cascade
     * @since 2025-12-22
     */
    ResultDomain<Boolean> deleteCustomerService(String userId);

    /**
     * @description    获取客服人员列表/分页
     * @param pageRequest 分页请求
     * @author    cascade
     * @since 2025-12-22
     */
    ResultDomain<CustomerServiceVO> getCustomerServicePage(PageRequest<TbCustomerServiceDTO> pageRequest);

    /**
     * @description    更新客服人员在线状态
     * @param userId 员工ID
     * @param status 状态：online-在线 busy-忙碌 offline-离线
     * @author    cascade
     * @since 2025-12-22
     */
    ResultDomain<Boolean> updateCustomerServiceStatus(String userId, String status);

    /**
     * @description    获取可接待的客服人员（在线且工作量未满）
     * @author    cascade
     * @since 2025-12-22
     */
    ResultDomain<CustomerServiceVO> getAvailableCustomerServices();

    /**
     * @description    自动分配客服人员
     * @param roomId 聊天室ID
     * @author    cascade
     * @since 2025-12-22
     */
    ResultDomain<CustomerServiceVO> assignCustomerService(String roomId);

    // ========================= 聊天室评分管理 ==========================

    /**
     * @description    提交聊天室服务评分
     * @param roomId 聊天室ID
     * @param commentLevel 评分（1-5星）
     * @param userId 评分用户ID
     * @author    cascade
     * @since 2025-12-29
     */
    ResultDomain<Boolean> submitCommentLevel(String roomId, Integer commentLevel, String userId);

}
