package com.example.demo;

import com.google.common.collect.Lists;
import freemarker.cache.FileTemplateLoader;
import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.DefaultObjectWrapperBuilder;
import freemarker.template.Template;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import java.io.*;
import java.math.BigDecimal;
import java.util.*;

public class FreemarkerDemo {

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public static class AccountBalance{
        public String fundName;
        public String fundCode;
        public String saleOrgan;
        public BigDecimal balance;
        public BigDecimal netValue;
        public BigDecimal availableAsset;
        public String bonusType;
    }

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public static class TradeDetail{
        public String applyDate;
        public String fundName;
        public String businessType;
        public BigDecimal confirmShare;
        public BigDecimal confirmMoney;
        public BigDecimal dailyNetValue;
        public BigDecimal fee;
        public BigDecimal performance;
    }

    private static void generateTemplate() throws Exception {
                Configuration cof = new Configuration(Configuration.VERSION_2_3_0);
        cof.setObjectWrapper(new DefaultObjectWrapperBuilder(Configuration.VERSION_2_3_0).build());
        try {
            cof.setDefaultEncoding("UTF-8");
            cof.setTemplateLoader(new FileTemplateLoader(new File("C:\\Users\\zhoushun\\Desktop\\workspace\\demo\\src\\main\\resources\\templates")));
            Template temp = cof.getTemplate("test.ftl");
            StringWriter writer = new StringWriter();
            //FileWriter writer = new FileWriter("C:\\Users\\zhoushun\\Desktop\\workspace\\demo\\src\\main\\resources\\templates\\test.html");
            Map<String,Object> model = new HashMap<>();
            //填充目标对象
            model.put("year","2023");
            model.put("season","四");

            model.put("account99","99X000000001");
            model.put("account98","98X000000001");
            model.put("account0W","OWX000000001");
            model.put("organ","东方证券");
            model.put("customer","测试客户姓名");
            model.put("beginDate","2023-10-01");
            model.put("endDate","2023-12-31");

            model.put("accountBalanceList", Lists.newArrayList(
                    new AccountBalance("东方红沪港深","XXXXXX","招商银行",new BigDecimal("10.04"),new BigDecimal("1.0000"),new BigDecimal("10.04"),"红利再投资"),
                    new AccountBalance("东方红货币E","XXXXXX","招商银行",new BigDecimal("1.88"),new BigDecimal("3.6069"),new BigDecimal("174.51"),"现金红利"),
                    new AccountBalance("东方红沪港深","XXXXXX","招商银行",new BigDecimal("174.51"),new BigDecimal("1.0000"),new BigDecimal("10.04"),"红利再投资"),
                    new AccountBalance("东方红启恒三年持有B","XXXXXX","招商银行",new BigDecimal("3.65"),new BigDecimal("1.0000"),new BigDecimal("1024.69"),"现金红利"),
                    new AccountBalance("东方红京东大数据","XXXXXX","招商银行",new BigDecimal("776.28"),new BigDecimal("1.0000"),new BigDecimal("10.04"),"红利再投资")));

            model.put("totalBalance",new BigDecimal("1340.20"));
            model.put("totalAvailableAsset",new BigDecimal("2518.51"));

            model.put("tradeDetailList", Lists.newArrayList(
                    new TradeDetail("2023-08-28","东方红智富宝(货币D)","申购",new BigDecimal("174.23"),new BigDecimal("1.0000"),new BigDecimal("0.00"),new BigDecimal("0.00"),new BigDecimal("0.00")),
                    new TradeDetail("2023-09-07","东方红智富宝(货币D)","赎回",new BigDecimal("174.23"),new BigDecimal("3.6069"),new BigDecimal("174.51"),new BigDecimal("1.288"),new BigDecimal("0.00")),
                    new TradeDetail("2023-08-28","东方红睿丰","申购",new BigDecimal("174.51"),new BigDecimal("1.0000"),new BigDecimal("10.04"),new BigDecimal("0.00"),new BigDecimal("0.00")),
                    new TradeDetail("2023-08-28","东方红睿丰","修改分红方式",new BigDecimal("0.00"),new BigDecimal("1.0000"),new BigDecimal("1024.69"),new BigDecimal("1.321"),new BigDecimal("0.00")),
                    new TradeDetail("2023-09-07","东方红睿丰","修改分红方式",new BigDecimal("776.28"),new BigDecimal("1.0000"),new BigDecimal("10.04"),new BigDecimal("0.00"),new BigDecimal("0.00"))));


            temp.process(model, writer);

            //System.out.println(writer.toString());


            Properties properties = new Properties();
            Session session = Session.getDefaultInstance(properties,null);
            MimeMessage message = new MimeMessage(session);
            //message.setFrom(new InternetAddress("zhoushun@dfham.com"));
            message.addRecipient(Message.RecipientType.TO,new InternetAddress("zhoushun@dfham.com"));
            message.setSubject("邮件标题:测试EML文件生成");
            //message.setText(writer.toString());

            //multipart message
            Multipart multipart = new MimeMultipart();
            // 设置邮件的文本内容
            BodyPart textPart  = new MimeBodyPart();

            textPart.setContent(writer.toString(),"text/html;charset=utf-8");

            multipart.addBodyPart(textPart);
            message.setContent(multipart);

            FileOutputStream fos = new FileOutputStream("C:\\Users\\zhoushun\\Desktop\\workspace\\demo\\src\\main\\resources\\templates\\test.eml");
            message.writeTo(fos);
            fos.flush();
            fos.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) throws Exception {

        generateTemplate();
        sendMail();

    }

    private static void sendMail(){
        Properties properties = System.getProperties();
        properties.put("mail.smtp.auth", "false");
        properties.put("mail.smtp.starttls.enable", "true");
        properties.put("mail.smtp.host", "10.118.130.19");
        properties.put("mail.smtp.port", 8135);
        Session session = Session.getInstance(properties);
        try {
            //MimeMessage message = new MimeMessage(session,new FileInputStream("C:\\Users\\zhoushun\\Desktop\\workspace\\demo\\src\\main\\resources\\templates\\月度对账单样例.eml"));
            MimeMessage message = new MimeMessage(session,new FileInputStream("C:\\Users\\zhoushun\\Desktop\\workspace\\demo\\src\\main\\resources\\templates\\test.eml"));
            //message.setFrom(new InternetAddress("TET@hotmail.com"));
            //message.addRecipient(Message.RecipientType.TO,
            //        new InternetAddress("zhoushun@dfham.com"));
            //message.setSubject("This is the Subject Line!");
            //message.set("This is actual message");
//
//            //multipart message
//            Multipart multipart = new MimeMultipart();
//            // 设置邮件的文本内容
//            BodyPart contentPart = new MimeBodyPart();
//            multipart.addBodyPart(contentPart);
//            // 添加附件
//            BodyPart messageBodyPart = new MimeBodyPart();
//            contentPart.setText("测试测试测试测试测试测试测试测试");
//            DataSource source = new FileDataSource("C:\\Users\\zhoushun\\Downloads\\月度对账单样例.eml");
//            // 添加附件的内容
//            messageBodyPart.setDataHandler(new DataHandler(source));

            //                sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();
            //			    messageBodyPart.setFileName("=?GBK?B?"+ enc.encode("测试".getBytes()) + "?=");
            //			    multipart.addBodyPart(messageBodyPart);


           // message.setContent(multipart);
           // message.saveChanges();


            Transport.send(message);
            System.out.println("Sent message successfully....");
        } catch (Exception mex) {
            mex.printStackTrace();
        }
    }
}