package org.xyzh.message.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.xyzh.common.dto.message.TbSysMessage;
import org.xyzh.common.dto.message.MessageVO;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 消息Mapper接口
 *
 * @description 消息主体表的数据访问接口
 * @filename MessageMapper.java
 * @author Claude
 * @copyright xyzh
 * @since 2025-11-13
 */
@Mapper
public interface MessageMapper extends BaseMapper<TbSysMessage> {

    /**
     * 根据消息ID查询消息
     *
     * @param messageID 消息ID
     * @return TbSysMessage 消息信息
     * @author Claude
     * @since 2025-11-13
     */
    TbSysMessage selectMessageById(@Param("messageID") String messageID);

    /**
     * 插入消息
     *
     * @param message 消息信息
     * @return int 影响行数
     * @author Claude
     * @since 2025-11-13
     */
    int insertMessage(@Param("message") TbSysMessage message);

    /**
     * 更新消息
     *
     * @param message 消息信息
     * @return int 影响行数
     * @author Claude
     * @since 2025-11-13
     */
    int updateMessage(@Param("message") TbSysMessage message);

    /**
     * 删除消息（逻辑删除）
     *
     * @param messageID 消息ID
     * @return int 影响行数
     * @author Claude
     * @since 2025-11-13
     */
    int deleteMessage(@Param("messageID") String messageID);

    /**
     * 统计消息总数（带权限过滤）
     *
     * @param filter 过滤条件
     * @param currentUserDeptID 当前用户部门ID
     * @return int 总数
     * @author Claude
     * @since 2025-11-13
     */
    int countMessage(@Param("filter") TbSysMessage filter,
                    @Param("currentUserDeptID") String currentUserDeptID);

    /**
     * 分页查询消息列表（带权限过滤）
     *
     * @param filter 过滤条件
     * @param currentUserDeptID 当前用户部门ID
     * @return List<MessageVO> 消息列表
     * @author Claude
     * @since 2025-11-13
     */
    List<MessageVO> selectMessagePage(@Param("filter") TbSysMessage filter,
                                      @Param("currentUserDeptID") String currentUserDeptID);

    /**
     * 查询消息详情
     *
     * @param messageID 消息ID
     * @return MessageVO 消息详情
     * @author Claude
     * @since 2025-11-13
     */
    MessageVO selectMessageDetail(@Param("messageID") String messageID);

    /**
     * 查询待发送的定时消息
     *
     * @param currentTime 当前时间
     * @return List<TbSysMessage> 待发送的消息列表
     * @author Claude
     * @since 2025-11-13
     */
    List<TbSysMessage> selectPendingScheduledMessages(@Param("currentTime") LocalDateTime currentTime);

    /**
     * CAS更新消息状态（防止并发）
     *
     * @param messageID 消息ID
     * @param expectedStatus 期望的当前状态
     * @param newStatus 新状态
     * @return int 更新的行数（1表示成功，0表示失败）
     * @author Claude
     * @since 2025-11-13
     */
    int compareAndSetStatus(@Param("messageID") String messageID,
                           @Param("expectedStatus") String expectedStatus,
                           @Param("newStatus") String newStatus);

    /**
     * 更新消息统计信息
     *
     * @param messageID 消息ID
     * @param sentCount 已发送数量
     * @param successCount 成功数量
     * @param failedCount 失败数量
     * @return int 更新的行数
     * @author Claude
     * @since 2025-11-13
     */
    int updateStatistics(@Param("messageID") String messageID,
                        @Param("sentCount") Integer sentCount,
                        @Param("successCount") Integer successCount,
                        @Param("failedCount") Integer failedCount);

    /**
     * 更新已读数量
     *
     * @param messageID 消息ID
     * @return int 更新的行数
     * @author Claude
     * @since 2025-11-13
     */
    int incrementReadCount(@Param("messageID") String messageID);
}
