package cn.iocoder.yudao.module.system.service.mail;

import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
import cn.iocoder.yudao.module.system.mq.message.mail.MailSendMessage;

import java.io.File;
import java.util.Collection;
import java.util.Map;

/**
 * 邮件发送 Service 接口
 *
 * @author wangjingyi
 * @since 2022-03-21
 */
public interface MailSendService {

    /**
     * 发送单条邮件给管理后台的用户
     *
     * @param userId 用户编码
     * @param toMails 收件邮箱
     * @param ccMails 抄送邮箱
     * @param bccMails 密送邮箱
     * @param templateCode 邮件模版编码
     * @param templateParams 邮件模版参数
     * @param attachments 附件
     * @return 发送日志编号
     */
    default Long sendSingleMailToAdmin(Long userId,
                                       Collection<String> toMails, Collection<String> ccMails, Collection<String> bccMails,
                                       String templateCode, Map<String, Object> templateParams,
                                       File... attachments) {
        return sendSingleMail(toMails, ccMails, bccMails, userId, UserTypeEnum.ADMIN.getValue(),
                templateCode, templateParams, attachments);
    }

    /**
     * 发送单条邮件给用户 APP 的用户
     *
     * @param userId 用户编码
     * @param toMails 收件邮箱
     * @param ccMails 抄送邮箱
     * @param bccMails 密送邮箱
     * @param templateCode 邮件模版编码
     * @param templateParams 邮件模版参数
     * @param attachments 附件
     * @return 发送日志编号
     */
    default Long sendSingleMailToMember(Long userId,
                                        Collection<String> toMails, Collection<String> ccMails, Collection<String> bccMails,
                                        String templateCode, Map<String, Object> templateParams,
                                        File... attachments) {
        return sendSingleMail(toMails, ccMails, bccMails, userId, UserTypeEnum.MEMBER.getValue(),
                templateCode, templateParams, attachments);
    }

    /**
     * 发送单条邮件
     *
     * @param toMails 收件邮箱
     * @param ccMails 抄送邮箱
     * @param bccMails 密送邮箱
     * @param userId 用户编号
     * @param userType 用户类型
     * @param templateCode 邮件模版编码
     * @param templateParams 邮件模版参数
     * @param attachments 附件
     * @return 发送日志编号
     */
    Long sendSingleMail(Collection<String> toMails, Collection<String> ccMails, Collection<String> bccMails,
                        Long userId, Integer userType,
                        String templateCode, Map<String, Object> templateParams,
                        File... attachments);

    /**
     * 执行真正的邮件发送
     * 注意，该方法仅仅提供给 MQ Consumer 使用
     *
     * @param message 邮件
     */
    void doSendMail(MailSendMessage message);

}
