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.TbSysMessageUser;
import org.xyzh.common.dto.message.MessageUserVO;

import java.util.List;

/**
 * 用户消息Mapper接口
 *
 * @description 用户接收消息表的数据访问接口
 * @filename MessageUserMapper.java
 * @author Claude
 * @copyright xyzh
 * @since 2025-11-13
 */
@Mapper
public interface MessageUserMapper extends BaseMapper<TbSysMessageUser> {

    /**
     * 根据消息ID查询用户消息列表
     *
     * @param messageID 消息ID
     * @return List<MessageUserVO> 用户消息列表
     * @author Claude
     * @since 2025-11-13
     */
    List<MessageUserVO> selectByMessageID(@Param("messageID") String messageID);

    /**
     * 批量插入用户消息
     *
     * @param userMessages 用户消息列表
     * @return int 插入的行数
     * @author Claude
     * @since 2025-11-13
     */
    int batchInsert(@Param("userMessages") List<TbSysMessageUser> userMessages);

    /**
     * 分页查询当前用户的消息列表
     *
     * @param userID 用户ID
     * @param filter 过滤条件
     * @return List<MessageUserVO> 消息列表
     * @author Claude
     * @since 2025-11-13
     */
    List<MessageUserVO> selectMyMessages(@Param("userID") String userID,
                                        @Param("filter") TbSysMessageUser filter);

    /**
     * 查询当前用户的消息详情
     *
     * @param userID 用户ID
     * @param messageID 消息ID
     * @return MessageUserVO 消息详情
     * @author Claude
     * @since 2025-11-13
     */
    MessageUserVO selectMyMessageDetail(@Param("userID") String userID,
                                       @Param("messageID") String messageID);

    /**
     * 标记消息为已读
     *
     * @param userID 用户ID
     * @param messageID 消息ID
     * @return int 更新的行数
     * @author Claude
     * @since 2025-11-13
     */
    int markAsRead(@Param("userID") String userID,
                  @Param("messageID") String messageID);

    /**
     * 批量标记消息为已读
     *
     * @param userID 用户ID
     * @param messageIDs 消息ID列表
     * @return int 更新的行数
     * @author Claude
     * @since 2025-11-13
     */
    int batchMarkAsRead(@Param("userID") String userID,
                       @Param("messageIDs") List<String> messageIDs);

    /**
     * 查询未读消息数量
     *
     * @param userID 用户ID
     * @return Integer 未读消息数量
     * @author Claude
     * @since 2025-11-13
     */
    Integer countUnread(@Param("userID") String userID);

    /**
     * 动态计算未读消息数量（基于 target 配置）
     *
     * @param userID 用户ID
     * @return Integer 未读消息数量
     * @author Claude
     * @since 2025-11-13
     */
    Integer countUnreadWithDynamicTargets(@Param("userID") String userID);

    /**
     * 更新用户消息的发送状态
     *
     * @param id 用户消息ID
     * @param sendStatus 发送状态
     * @param failReason 失败原因（可选）
     * @return int 更新的行数
     * @author Claude
     * @since 2025-11-13
     */
    int updateSendStatus(@Param("id") String id,
                        @Param("sendStatus") String sendStatus,
                        @Param("failReason") String failReason);

    /**
     * 查询待发送的用户消息列表
     *
     * @param filter 过滤条件
     * @return List<TbSysMessageUser> 用户消息列表
     * @author Claude
     * @since 2025-11-13
     */
    List<TbSysMessageUser> selectPendingUserMessages(@Param("filter") TbSysMessageUser filter);

    /**
     * 动态查询当前用户可见的消息列表（基于 target 配置计算）
     *
     * @param userID 用户ID
     * @param filter 过滤条件
     * @return List<MessageUserVO> 消息列表
     * @author Claude
     * @since 2025-11-13
     */
    List<MessageUserVO> selectMyMessagesWithDynamicTargets(@Param("userID") String userID,
                                                           @Param("filter") MessageUserVO filter);

    /**
     * 查询或创建用户消息记录（upsert）
     *
     * @param userID 用户ID
     * @param messageID 消息ID
     * @return MessageUserVO 用户消息记录
     * @author Claude
     * @since 2025-11-13
     */
    MessageUserVO selectOrCreateUserMessage(@Param("userID") String userID,
                                           @Param("messageID") String messageID);

    /**
     * 插入用户消息记录（如果不存在）
     *
     * @param userMessage 用户消息
     * @return int 插入的行数
     * @author Claude
     * @since 2025-11-13
     */
    int insertIfNotExists(@Param("userMessage") TbSysMessageUser userMessage);
}
