package com.jwipc.sys.logic;

import cn.hutool.core.lang.Pair;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.Collection;
import java.util.Map;

/**
 * <p> </p>
 *
 * @author BOGON
 * @version 1.0
 * @since JDK 1.8
 */
public interface EmailSendLogicLogic {
    /**
     * 异步发送邮件
     *
     * @param content  邮件内容
     * @param receiver 接收人多个
     * @param title    邮件主题
     * @param sender   发送人
     */
    void asynchSend(Collection<String> receiver, String title, String content, Long sender,Collection<Long> fileIds);

    /**
     * 异步发送单个邮件
     *
     * @param content  邮件内容
     * @param receiver 接收人单个
     * @param title    邮件主题
     * @param sender   发送人
     */
    void asynchSend(String receiver, String title, String content, Long sender,Collection<Long> fileIds);

    /**
     * 异步发送单个邮件
     *
     * @param templateCode 模板编号
     * @param params       模板参数
     * @param receiver     接收人单个
     * @param title        邮件主题
     * @param sender       发送人
     */
    void asynchSend(String receiver, String title, String templateCode, Map<String, Object> params, Long sender,Collection<Long> fileIds);

    /**
     * 异步发送多个邮件
     *
     * @param templateCode 模板编号
     * @param params       模板参数
     * @param receiver     接收人多个
     * @param title        邮件主题
     * @param sender       发送人
     */
    void asynchSend(Collection<String> receiver, String title, String templateCode, Map<String, Object> params, Long sender,Collection<Long> fileIds);

    /**
     * 同步发送邮件-多个
     *
     * @param content  邮件内容
     * @param receiver 接收人多个
     * @param title    邮件主题
     * @param sender   发送人
     * @return 是否成功，和失败的信息, Map<String,String> 是 key:email,value:错误信息
     */
    Pair<Boolean, Map<String, String>> syncSend(Collection<String> receiver, String title, String content, Long sender,Collection<Long> fileIds);

    /**
     * 同步发送邮件-单个
     *
     * @param receiver     接收人
     * @param title        邮件主题
     * @param templateCode 模板编号
     * @param params       模板参数
     * @param sender       发送人
     * @return 是否成功， 和错误信息
     */
    Pair<Boolean, String> syncSend(String receiver, String title, String templateCode,
                                   Map<String, Object> params, Long sender,Collection<Long> fileIds);

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    Pair<Boolean, String> send(String title, String content, Collection<Long> fileIds, Long sender, String to);
}