package org.xyzh.api.message.service;

import org.xyzh.api.message.dto.TbMessageDTO;
import org.xyzh.api.message.vo.MessageVO;
import org.xyzh.common.core.domain.ResultDomain;
import org.xyzh.common.core.page.PageParam;


/**
 * @description    消息服务接口
 * @filename    MessageService.java
 * @author    yslg
 * @copyright yslg
 * @since 2025-11-05
 */
public interface MessageService {

    // ================ 发送邮件 ==================
    ResultDomain<String> sendSimpleEmail(String to, String subject, String content);

    ResultDomain<String> sendHtmlEmail(String to, String subject, String content);

    ResultDomain<String> sendEmailVerificationCode(String to, String code);

    // ================ 发送短信 ==================
    
    //================= 用户查看消息列表 =================
    ResultDomain<String> sendPhoneVerificationCode(String phone, String code);



    /**
     * @description    获取我的消息列表
     * @param    userId    用户ID
     * @return    ResultDomain<TbMessageDTO>    消息列表
     * @author    yslg
     * @since 2025-11-05
     */
    ResultDomain<TbMessageDTO> getMyMessageList(TbMessageDTO filter);

    /**
     * @description    获取我的消息分页列表
     * @param    TbMessageDTO    filter    消息过滤条件
     * @param    PageParam    pageParam    分页参数
     * @return    ResultDomain<TbMessageDTO>    消息分页列表
     * @author    yslg
     * @since 2025-11-05
     */
    ResultDomain<TbMessageDTO> getMyMessagePage(TbMessageDTO filter, PageParam pageParam);

    /**
     * @description    获取我的消息详情
     * @param    messageId    消息ID
     * @return    ResultDomain<TbMessageDTO>    消息详情
     * @author    yslg
     * @since 2025-11-05
     */
    ResultDomain<TbMessageDTO> getMyMessageDetail(String messageId);

    // ================= 用户处理消息 =================
    /**
     * @description    用户处理消息
     * @param    messageId    消息ID
     * @param    status    消息状态
     * @return    ResultDomain<TbMessageDTO>    消息处理结果
     * @author    yslg
     * @since 2025-11-05
     */
    ResultDomain<TbMessageDTO> handleMessage(String messageId, String status);

    // ================= 管理员查看消息列表 =================
    /**
     * @description    获取消息列表
     * @param    TbMessageDTO    filter    消息过滤条件
     * @return    ResultDomain<TbMessageDTO>    消息列表
     * @author    yslg
     * @since 2025-11-05
     */
    ResultDomain<TbMessageDTO> getMessageList(TbMessageDTO filter);

    /**
     * @description    获取消息分页列表
     * @param    TbMessageDTO    filter    消息过滤条件
     * @param    PageParam    pageParam    分页参数
     * @return    ResultDomain<TbMessageDTO>    消息分页列表
     * @author    yslg
     * @since 2025-11-05
     */
    ResultDomain<TbMessageDTO> getMessagePage(TbMessageDTO filter, PageParam pageParam);


    /**
     * @description    获取消息详情
     * @param    messageId    消息ID
     * @return    ResultDomain<TbMessageDTO>    消息详情
     * @author    yslg
     * @since 2025-11-05
     */
    ResultDomain<MessageVO> getMessageDetail(String messageId);

    // ================= 管理员处理消息 =================

    /**
     * @description    创建消息
     * @param    MessageVO    messageVO    消息VO
     * @return    ResultDomain<TbMessageDTO>    创建结果
     * @author    yslg
     * @since 2025-11-05
     */
    ResultDomain<TbMessageDTO> createMessage(MessageVO messageVO);

    /**
     * @description    更新消息
     * @param    MessageVO    messageVO    消息VO
     * @return    ResultDomain<TbMessageDTO>    更新结果
     * @author    yslg
     * @since 2025-11-05
     */
    ResultDomain<TbMessageDTO> updateMessage(MessageVO messageVO);

    /**
     * @description    删除消息
     * @param    messageId    消息ID
     * @return    ResultDomain<TbMessageDTO>    删除结果
     * @author    yslg
     * @since 2025-11-05
     */
    ResultDomain<Boolean> deleteMessage(String messageId);

    /**
     * @description    发送消息
     * @param    MessageVO    messageVO    消息VO
     * @return    ResultDomain<MessageVO>    发送结果
     * @author    yslg
     * @since 2025-11-05
     */
    ResultDomain<MessageVO> sendMessage(MessageVO messageVO);

    /**
     * @description    撤回消息
     * @param    messageId    消息ID
     * @return    ResultDomain<TbMessageDTO>    撤回结果
     * @author    yslg
     * @since 2025-11-05
     */
    ResultDomain<TbMessageDTO> withdrawMessage(String messageId);
}
