package org.xyzh.api.message;

import org.xyzh.common.core.domain.ResultDomain;
import org.xyzh.common.core.page.PageParam;
import org.xyzh.common.dto.message.*;

import java.util.List;
import java.util.Map;

/**
 * 消息服务接口
 *
 * @description 消息通知模块的服务接口定义
 * @filename MessageService.java
 * @author Claude
 * @copyright xyzh
 * @since 2025-11-13
 */
public interface MessageService {

    // ================== 消息管理 ==================

    /**
     * 创建消息
     *
     * @param message 消息对象
     * @return ResultDomain<TbSysMessage> 创建结果
     * @author Claude
     * @since 2025-11-13
     */
    ResultDomain<TbSysMessage> createMessage(TbSysMessage message);

    /**
     * 更新消息（仅允许更新草稿状态的消息）
     *
     * @param message 消息对象
     * @return ResultDomain<TbSysMessage> 更新结果
     * @author Claude
     * @since 2025-11-13
     */
    ResultDomain<TbSysMessage> updateMessage(TbSysMessage message);

    /**
     * 删除消息（逻辑删除）
     *
     * @param messageID 消息ID
     * @return ResultDomain<TbSysMessage> 删除结果
     * @author Claude
     * @since 2025-11-13
     */
    ResultDomain<TbSysMessage> deleteMessage(String messageID);

    /**
     * 根据ID查询消息详情
     *
     * @param messageID 消息ID
     * @return ResultDomain<MessageVO> 消息详情
     * @author Claude
     * @since 2025-11-13
     */
    ResultDomain<MessageVO> getMessageById(String messageID);

    /**
     * 分页查询消息列表（管理端）
     *
     * @param filter 过滤条件
     * @param pageParam 分页参数
     * @return ResultDomain<MessageVO> 消息列表
     * @author Claude
     * @since 2025-11-13
     */
    ResultDomain<MessageVO> getMessagePage(TbSysMessage filter, PageParam pageParam);

    // ================== 消息发送 ==================

    /**
     * 发送消息（立即发送或定时发送）
     *
     * @param messageID 消息ID
     * @return ResultDomain<TbSysMessage> 发送结果
     * @author Claude
     * @since 2025-11-13
     */
    ResultDomain<TbSysMessage> sendMessage(String messageID);

    /**
     * 立即发送（将定时消息改为立即发送）
     *
     * @param messageID 消息ID
     * @return ResultDomain<TbSysMessage> 发送结果
     * @author Claude
     * @since 2025-11-13
     */
    ResultDomain<TbSysMessage> sendNow(String messageID);

    /**
     * 取消定时消息
     *
     * @param messageID 消息ID
     * @return ResultDomain<TbSysMessage> 取消结果
     * @author Claude
     * @since 2025-11-13
     */
    ResultDomain<TbSysMessage> cancelMessage(String messageID);

    /**
     * 修改定时发送时间
     *
     * @param messageID 消息ID
     * @param scheduledTime 新的发送时间
     * @return ResultDomain<TbSysMessage> 修改结果
     * @author Claude
     * @since 2025-11-13
     */
    ResultDomain<TbSysMessage> rescheduleMessage(String messageID, java.util.Date scheduledTime);

    /**
     * 重试失败消息
     *
     * @param messageID 消息ID
     * @return ResultDomain<TbSysMessage> 重试结果
     * @author Claude
     * @since 2025-11-13
     */
    ResultDomain<TbSysMessage> retryMessage(String messageID);

    // ================== 用户消息 ==================

    /**
     * 分页查询我的消息列表（用户端）
     *
     * @param filter 过滤条件
     * @param pageParam 分页参数
     * @return ResultDomain<MessageUserVO> 我的消息列表
     * @author Claude
     * @since 2025-11-13
     */
    ResultDomain<MessageUserVO> getMyMessagesPage(MessageUserVO filter, PageParam pageParam);

    /**
     * 查询我的消息详情（用户端）
     *
     * @param messageID 消息ID
     * @return ResultDomain<MessageUserVO> 消息详情
     * @author Claude
     * @since 2025-11-13
     */
    ResultDomain<MessageUserVO> getMyMessageDetail(String messageID);

    /**
     * 标记消息为已读
     *
     * @param messageID 消息ID
     * @return ResultDomain<TbSysMessageUser> 标记结果
     * @author Claude
     * @since 2025-11-13
     */
    ResultDomain<TbSysMessageUser> markAsRead(String messageID);

    /**
     * 批量标记消息为已读
     *
     * @param messageIDs 消息ID列表
     * @return ResultDomain<Integer> 标记成功的数量
     * @author Claude
     * @since 2025-11-13
     */
    ResultDomain<Integer> batchMarkAsRead(List<String> messageIDs);

    /**
     * 获取未读消息数量
     *
     * @return ResultDomain<Integer> 未读消息数量
     * @author Claude
     * @since 2025-11-13
     */
    ResultDomain<Integer> getUnreadCount();

    // ================== 辅助接口 ==================

    /**
     * 获取可选的部门树（当前部门及子部门）
     *
     * @return ResultDomain<Map> 部门树数据
     * @author Claude
     * @since 2025-11-13
     */
    ResultDomain<Map<String, Object>> getTargetDepts();

    /**
     * 获取可选的角色列表（当前部门及子部门的角色）
     *
     * @return ResultDomain<Map> 角色列表数据
     * @author Claude
     * @since 2025-11-13
     */
    ResultDomain<Map<String, Object>> getTargetRoles();

    /**
     * 获取可选的用户列表（当前部门及子部门的用户）
     *
     * @return ResultDomain<Map> 用户列表数据
     * @author Claude
     * @since 2025-11-13
     */
    ResultDomain<Map<String, Object>> getTargetUsers();
}
