package com.reyun.saas.mob.util;

import cn.hutool.crypto.digest.DigestUtil;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSONObject;
import com.reyun.saas.mob.user.dao.ConfigParamMapper;
import com.reyun.saas.mob.user.domain.ConfigParam;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import tk.mybatis.mapper.entity.Example;

import javax.annotation.Resource;
import java.util.*;

@Slf4j
@Component
public class SendCloudComponent {

    @Resource
    private ConfigParamMapper configParamMapper;

    /**
     * 邮件内容类型
     */
    @Value("${sendCloud.mail.content_type}")
    private String contentType;

    /**
     * 发送人邮箱
     */
    @Value("${sendCloud.mail.fromMail}")
    private String fromMail;

    /**
     * 发送邮件api
     */
    @Value("${sendCloud.mail.url}")
    private String url;

    /**
     * api用户
     */
    @Value("${sendCloud.mail.apiUser}")
    private String apiUser;

    /**
     * api的key
     */
    @Value("${sendCloud.mail.apiKey}")
    private String apiKey;

    /**
     * 是否是线上环境
     */
    @Value("${sendCloud.isPro}")
    private Boolean isPro;


    /**
     * 发送短信api
     */
    @Value("${sendCloud.sms.url}")
    private String smsUrl;

    /**
     * 发送短信用户
     */
    @Value("${sendCloud.sms.smsUser}")
    private String smsUser;

    /**
     * 发送短信秘钥
     */
    @Value("${sendCloud.sms.smsKey}")
    private String smsKey;

    /**
     * 发送短信预警模板
     */
    @Value("${sendCloud.sms.warningModel}")
    private String warningModel;

    private String fromName = "MobDNA";

    public String getWarningModel() {
        return warningModel;
    }

    public void setWarningModel(String warningModel) {
        this.warningModel = warningModel;
    }

    /**
     * 功能描述:复合邮件发送
     *
     * @param ccList           可空-抄送地址.
     * @param bccList          可空-密送地址.
     * @param content          必填-邮件的内容. 邮件格式为 text/html
     * @param subject          必填-标题
     * @param userEmailAddress 必填-收件人地址.
     * @author hanzepeng
     * @date 2021-09-26 从trackingio复制的
     */
    public boolean sendMailReuse(List<String> userEmailAddress, String subject, String content, List<String> ccList, List<String> bccList) throws Exception {
        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httPost = new HttpPost(url);
        String toEmail;
        String bcc = null;
        String cc = null;

        List<String> testUsersEamil = fillNotProEmail();
        if (testUsersEamil != null) {
            //测试环境  使用默认收件人
            toEmail = StringUtils.collectionToDelimitedString(testUsersEamil, ";");
        } else {
            //线上环境
            toEmail = userEmailAddress == null ? null : StringUtils.collectionToDelimitedString(userEmailAddress, ";");
            bcc = bccList == null ? null : StringUtils.collectionToDelimitedString(bccList, ";");
            cc = ccList == null ? null : StringUtils.collectionToDelimitedString(ccList, ";");
        }
        List params = new ArrayList();
        // 您需要登录SendCloud创建API_USER，使用API_USER和API_KEY才可以进行邮件的发送。
        params.add(new BasicNameValuePair("apiUser", apiUser));
        params.add(new BasicNameValuePair("apiKey", apiKey));
        params.add(new BasicNameValuePair("from", fromMail));
        params.add(new BasicNameValuePair("fromName", fromName));
        params.add(new BasicNameValuePair("to", toEmail));
        params.add(new BasicNameValuePair("subject", subject));
        params.add(new BasicNameValuePair("html", content));
        if (cc != null && !"".equals(cc)) {
            params.add(new BasicNameValuePair("cc", cc));
        }
        if (bcc != null && !"".equals(bcc)) {
            params.add(new BasicNameValuePair("bcc", bcc));
        }
        boolean success = false;

        httPost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));
        // 请求
        HttpResponse response = httpclient.execute(httPost);
        // 处理响应
        if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { // 正常返回
            // 读取xml文档
            String result = EntityUtils.toString(response.getEntity());
            JSONObject jsonObject = JSONObject.parseObject(result);
            String result1 = jsonObject.getString("result");
            success = Boolean.valueOf(result1);
            if (!success) {
                log.error(result);
                throw new Exception(result);
            }
        } else {
            log.error("邮件发送状态异常：" + toEmail);
            throw new Exception("邮件发送状态异常：" + toEmail);
        }
        httPost.releaseConnection();

        return success;
    }

    /**
     * 功能描述:多两个参数，from发件人邮箱；发件人名字
     *
     * @author hanzepeng
     * @date 2021-09-26
     */
    public boolean sendMailReuse(List<String> userEmailAddress, String subject, String content, List<String> ccList, List<String> bccList, String from, String name) throws Exception {
        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httPost = new HttpPost(url);

        String toEmail;
        String bcc = null;
        String cc = null;

        List<String> testUsersEamil = fillNotProEmail();
        if (testUsersEamil != null) {
            //测试环境  使用默认收件人
            toEmail = StringUtils.collectionToDelimitedString(testUsersEamil, ";");
        } else {
            //线上环境
            toEmail = userEmailAddress == null ? null : StringUtils.collectionToDelimitedString(userEmailAddress, ";");
            bcc = bccList == null ? null : StringUtils.collectionToDelimitedString(bccList, ";");
            cc = ccList == null ? null : StringUtils.collectionToDelimitedString(ccList, ";");
        }

        from = StringUtils.isEmpty(from) ? fromMail : from;
        name = StringUtils.isEmpty(name) ? fromName : name;

        List params = new ArrayList();
        // 您需要登录SendCloud创建API_USER，使用API_USER和API_KEY才可以进行邮件的发送。
        params.add(new BasicNameValuePair("apiUser", apiUser));
        params.add(new BasicNameValuePair("apiKey", apiKey));
        params.add(new BasicNameValuePair("from", from));
        params.add(new BasicNameValuePair("fromName", name));
        params.add(new BasicNameValuePair("to", toEmail));
        params.add(new BasicNameValuePair("subject", subject));
        params.add(new BasicNameValuePair("html", content));
        if (cc != null && !"".equals(cc)) {
            params.add(new BasicNameValuePair("cc", cc));
        }
        if (bcc != null && !"".equals(bcc)) {
            params.add(new BasicNameValuePair("bcc", bcc));
        }
        boolean success = false;
        httPost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));
        // 请求
        HttpResponse response = httpclient.execute(httPost);
        // 处理响应
        if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { // 正常返回
            // 读取xml文档
            String result = EntityUtils.toString(response.getEntity());
            JSONObject jsonObject = JSONObject.parseObject(result);
            String result1 = jsonObject.getString("result");
            success = Boolean.valueOf(result1);
            if (!success) {
                log.error(result);
                throw new Exception(result);
            }
        } else {
            log.error("邮件发送状态异常：" + toEmail);
            throw new Exception("邮件发送状态异常：" + toEmail);
        }
        httPost.releaseConnection();
        return success;
    }


    private List<String> fillNotProEmail() {

        // 测试环境设置为默认的收件人

        if (isPro) {
            return null;
        }

        Example example = new Example(ConfigParam.class);
        example.and().andEqualTo("keyParam", "not_pro_user_email");
        ConfigParam configParam = configParamMapper.selectOneByExample(example);

        String testEmails = configParam.getValueParam();

        if (StringUtils.isEmpty(testEmails)) {
            testEmails = "hanzepeng@reyun.com";
        }

        List<String> emails = new ArrayList<>();

        if (!StringUtils.isEmpty(testEmails)) {
            emails.addAll(Arrays.asList(testEmails.split(",")));
        }

        // 非线上环境收件人
        return emails;

    }


    /**
     * 功能描述:发送手机短信（模板）
     * @author liyin
     * @date 2019/11/1
     */
    public boolean sendSMS(String phone,String templateId,String vars){
        String signature = DigestUtil.md5Hex(smsKey+"&phone="+phone+"&smsUser="+smsUser+"&templateId="+templateId+"&vars="+vars+"&"+smsKey);
        Map<String, Object> map = new HashMap<>();
        map.put("smsUser",smsUser);
        map.put("templateId",templateId);
        map.put("phone",phone);
        map.put("vars",vars);
        map.put("signature",signature);
        String response = HttpUtil.post("http://www.sendcloud.net/smsapi/send", map);
        JSONObject jsonResponse = JSONObject.parseObject(response);
        String statusCode = jsonResponse.get("statusCode").toString();
        if(statusCode.equals("200")){
            return true;
        }else{
            return false;
        }
    }

}
