package com.fdkankan.email;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Component;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;

import javax.mail.internet.MimeMessage;
import java.io.File;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Map;

@Component
public class MailService {

    // 邮箱
    @Value("${spring.mail.username}")
    private String username;

    @Autowired
    private JavaMailSender javaMailSender;

    @Autowired
    private TemplateEngine templateEngine;

    /**
     * 简单邮件
     * * @param to 接收人
     * * @param subject 主题
     * * @param content 内容
     * * @return
     */
    public String sendSimpleEmail(String to, String subject, String content) {
        try {
            SimpleMailMessage message = new SimpleMailMessage();
            message.setFrom(username);
            message.setTo(to);
            // 接收地址
            message.setSubject(subject);
            // 标题
            message.setText(content);
            // 内容
            javaMailSender.send(message);
            return "发送成功";
        } catch (Exception e) {
            e.printStackTrace();
            return e.getMessage();
        }
    }

    /**
     * html 邮件
     * * @param to 接收人
     * * @param subject 主题
     * * @param html 内容
     */
    public String sendHtmlMail(String to, String subject, String html) {
        try {
            MimeMessage mimeMessage = javaMailSender.createMimeMessage();
            // 设置utf-8编码，否则邮件会有乱码
            MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true, "UTF-8");
            messageHelper.setFrom(username);
            messageHelper.setTo(to);
            messageHelper.setSubject(subject);
            messageHelper.setText(html, true);
            javaMailSender.send(mimeMessage);
            return "发送成功";
        } catch (Exception e) {
            e.printStackTrace();
            return e.getMessage();
        }
    }

    /**
     * 带附件 邮件
     * * @param to 接收人
     * * @param subject 主题
     * * @param content 内容
     * * @param isHtml 是否是html 邮件 false：普通邮件，true：html邮件
     * * @param fileName 文件名称
     * * @param filePath 文件路径
     * * @return
     */
    public String sendFileMail(String to, String subject, String content, boolean isHtml, String fileName, String filePath) {
        try {
            MimeMessage mimeMessage = javaMailSender.createMimeMessage();
            // 设置utf-8编码，否则邮件会有乱码
            MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true, "UTF-8");
            messageHelper.setFrom(username);
            messageHelper.setTo(to);
            messageHelper.setSubject(subject);
            messageHelper.setText(content, isHtml);
            // 设置附件
            FileSystemResource file = new FileSystemResource(new File(filePath));
            if (StringUtils.isBlank(fileName)) { // 文件名为空时，取文件本身名称
                fileName = file.getFilename();
            }
            messageHelper.addAttachment(fileName, file);
            javaMailSender.send(mimeMessage);
            return "发送成功";
        } catch (Exception e) {
            e.printStackTrace();
            return e.getMessage();
        }
    }

    /**
     * 多附件 邮件
     * * @param to 接收人
     * * @param subject 主题
     * * @param content 内容
     * * @param isHtml 是否是html 邮件 false：普通邮件，true：html邮件
     * * @param list 附件集合 filepath：附件路径，fileName：附件名
     * * @return
     */
    public String sendFilesMail(String to, String subject, String content, boolean isHtml, List<Map<String, String>> list) {
        try {
            MimeMessage mimeMessage = javaMailSender.createMimeMessage();
            // 设置utf-8编码，否则邮件会有乱码
            MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true, "UTF-8");
            messageHelper.setFrom(username);
            messageHelper.setTo(to);
            messageHelper.setSubject(subject);
            messageHelper.setText(content, isHtml);
            // 设置附件
            for (Map<String, String> map : list) {
                FileSystemResource file = new FileSystemResource(new File(map.get("filepath")));
                String fileName = map.get("fileName");
                if (StringUtils.isBlank(fileName)) {
                    // 文件名为空时，取文件本身名称
                     fileName = file.getFilename();
                }
                messageHelper.addAttachment(fileName, file);
            }
            javaMailSender.send(mimeMessage);
            return "发送成功";
        } catch (
                Exception e) {
            e.printStackTrace();
            return e.getMessage();
        }
    }

    /**
     * 模板 邮件
     * * @param to 接收人
     * * @param subject 主题
     * * @param tplStr 模板路径 默认路径为 resources/templates 这里传该路径下 之后的路径 mail/模板名称 例 email/templateMail 这里不用加后缀
     * * @param map 绑定到模板的参数
     * * @return
     */
    public String sendTemplateMail(String to, String subject, String tplStr, Map<String, Object> map) {
        try {
            MimeMessage mimeMessage = javaMailSender.createMimeMessage();
            // 设置utf-8编码，否则邮件会有乱码
            MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true, StandardCharsets.UTF_8.toString());
            messageHelper.setFrom(username);
            messageHelper.setTo(to);
            messageHelper.setSubject(subject);
            // 设置模板参数
            Context context = new Context();
            context.setVariables(map);
            // 将参数 绑定到模板中
            String tempContent = templateEngine.process(tplStr, context);
            messageHelper.setText(tempContent, Boolean.TRUE);
            javaMailSender.send(mimeMessage);
            return "发送成功";
        } catch (Exception e) {
            e.printStackTrace();
            return e.getMessage();
        }
    }

    /**
     * 带附件 模板 邮件
     * * @param to 接收人
     * * @param subject 主题
     * * @param tplStr 模板路径 默认路径为 resources/templates 这里传该路径下 之后的路径 mail/模板名称 例 email/templateMail 这里不用加后缀
     * * @param map 绑定到模板的参数
     * * @param fileName 附件名
     * * @param filePath 附件路径
     * * @return
     */
    public String sendTemplateFileMail(String to, String subject, String tplStr, Map<String, Object> map, String fileName, String filePath) {
        try {
            MimeMessage mimeMessage = javaMailSender.createMimeMessage();
            // 设置utf-8或GBK编码，否则邮件会有乱码
            MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true, "UTF-8");
            messageHelper.setFrom(username);
            messageHelper.setTo(to);
            messageHelper.setSubject(subject);
            // 设置模板参数
            Context context = new Context();
            context.setVariables(map);
            // 将参数 绑定到模板中
            String tempContent = templateEngine.process(tplStr, context);
            messageHelper.setText(tempContent, true);
            // 设置附件
            FileSystemResource file = new FileSystemResource(new File(filePath));
            if (StringUtils.isBlank(fileName)) { // 文件名为空时，取文件本身名称
                fileName = file.getFilename();
            }
            messageHelper.addAttachment(fileName, file);
            javaMailSender.send(mimeMessage);
            return "发送成功";
        } catch (Exception e) {
            e.printStackTrace();
            return e.getMessage();
        }
    }

    /**
     * 多附件 模板 邮件
     * * @param to 接收人
     * * @param subject 主题
     * * @param tplStr 模板路径 默认路径为 resources/templates 这里传该路径下 之后的路径 mail/模板名称 例 email/templateMail 这里不用加后缀
     * * @param map 绑定到模板的参数
     * * @param list 附件集合 filepath：附件路径，fileName：附件名
     * * @return
     */
    public String sendTemplateFilesMail(String to, String subject, String tplStr, Map<String, Object> map, List<Map<String, String>> list) {
        try {
            MimeMessage mimeMessage = javaMailSender.createMimeMessage();
            // 设置utf-8编码，否则邮件会有乱码
            MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true, "UTF-8");
            messageHelper.setFrom(username);
            messageHelper.setTo(to);
            messageHelper.setSubject(subject);
            // 设置模板参数
            Context context = new Context();
            context.setVariables(map);
            // 将参数 绑定到模板中
            String tempContent = templateEngine.process(tplStr, context);
            messageHelper.setText(tempContent, true);
            // 设置附件
            for (Map<String, String> fileMap : list) {
                FileSystemResource file = new FileSystemResource(new File(fileMap.get("filepath")));
                String fileName = fileMap.get("fileName");
                if (StringUtils.isBlank(fileName)) { // 文件名为空时，取文件本身名称
                    fileName = file.getFilename();
                }
                messageHelper.addAttachment(fileName, file);
            }
            javaMailSender.send(mimeMessage);
            return "发送成功";
        } catch (Exception e) {
            e.printStackTrace();
            return e.getMessage();
        }
    }
}