package com.ruoyi.sms.utils;

import cn.hutool.crypto.SecureUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.util.List;

@Component
public class FuseCloudSmsUtil {



    @Value("${sms.username}")
    private String username;

    @Value("${sms.password}")
    private String password;

    private static final String signReportUrl = "https://api.mix2.zthysms.com/sms/v1/sign";//短信签名报备url
    private static final String searchSignReport = "https://api.mix2.zthysms.com/sms/v1/sign/query";//查询短信签名报备url
    private static final String templateReport = "https://api.mix2.zthysms.com/sms/v2/template";//短信模板报备url
    private static final String templateReportList = "https://api.mix2.zthysms.com/sms/v2/template/list";//短信模板报备List
    private static final String delTemplateReport = "https://api.mix2.zthysms.com/sms/v2/template/delete";//短信模板报备List
    private static final String sendSmsTp = "https://api.mix2.zthysms.com/v2/sendSmsTp";//模板签名短信
    private static final String sendSms = "https://api.mix2.zthysms.com/v2/sendSms";//自定义短信模板


    /**
     * 短信签名报备
     *
     * @param stringList 签名必须带中文中括号【】
     * @return String
     */
    public  String signReport(List<String> stringList) throws IOException {
        JSONObject params = createParams();
        params.put("sign", stringList);
        String s = HttpUtils.sendPost(signReportUrl, params, "UTF-8");
        return s;
    }


    /**
     * 查询短信签名报备
     *
     * @param sign 签名必须带中文中括号【】
     * @return String
     */
    public  String searchSignReport(String sign) throws IOException {
        JSONObject params = createParams();
        params.put("sign", sign);
        String s = HttpUtils.sendPost(searchSignReport, params, "UTF-8");
        return s;
    }


    /**
     * 模板报备
     *
     * @param temName    模板名称 ( 最大20字符)
     * @param temType    模板类型  1 -  验证码    2 - 行业通知  3 - 营销推广
     * @param temContent 模板内容 （最大450字符）,支持变量参数。 举例：尊敬的{name}，您购买的是{goods}。
     * @param paramJson  验证码    valid_code	4-6位纯数字
     *                   手机号	mobile_number	1-15位纯数字
     *                   其他号码	other_number	1-32位字母+数字组合,支持中划线-
     *                   金额	amount	支持数字或数字的中文 （壹贰叁肆伍陆柒捌玖拾佰仟万亿 圆元整角分厘毫）
     *                   日期	date	符合时间的表达方式 也支持中文：2019年9月3日16时24分35秒
     *                   中文	chinese	1-32中文，支持中文圆括号（）
     *                   其他	others。
     * @return String
     * @throws IOException
     */
    public  String templateReport(String temName, Integer temType, String temContent, String paramJson) throws IOException {
        JSONObject params = createParams();
        params.put("temName", temName);
        params.put("temType", temType);
        params.put("temContent", temContent);
        if (null != paramJson && "" != paramJson) {
            JSONObject param = new JSONObject();
            param.put("code", paramJson);
            params.put("paramJson", param);
        }
        System.out.println(params);
        String s = HttpUtils.sendPost(templateReport, params, "UTF-8");
        return s;
    }

    /**
     * 模板报备
     *
     * @param status 审核状态 （1.待审核 2.审核通过 3.审核不通过）
     * @param page   当前页,默认从1开始
     * @param size   每页数量，默认10，最大100
     * @return String
     * @throws IOException
     */
    public  String templateReportList(Integer status, Integer page, Integer size) throws IOException {
        JSONObject params = createParams();
        params.put("status", status);
        params.put("page", page);
        params.put("size", size);
        String s = HttpUtils.sendPost(templateReportList, params, "UTF-8");
        return s;
    }

    /**
     * 删除模板报备
     *
     * @param temId 短信模板
     * @return String
     * @throws IOException
     */
    public  String delTemplateReport(Long temId) throws IOException {
        JSONObject params = createParams();
        params.put("temId", temId);
        String s = HttpUtils.sendPost(delTemplateReport, params, "UTF-8");
        return s;
    }

    /**
     * 发送模板短信 || 验证码
     *
     * @param signature 短信签名
     * @param temId     短信模板
     * @param mobile    手机号
     * @param code      验证码
     * @return String
     * @throws IOException
     */
    public  String sendTemSms(String signature, Long temId, String mobile, String code) throws IOException {
        JSONObject params = createParams();
        params.put("signature", signature);
        params.put("tpId", String.valueOf(temId));
        //封装
        JSONArray records = new JSONArray();
        JSONObject record = new JSONObject();
        record.put("mobile", mobile);
        JSONObject param = new JSONObject();
        param.put("code", code);
        record.put("tpContent", param);
        records.add(record);
        params.put("records", records);

        System.out.println(params);
        String s = HttpUtils.sendPost(sendSmsTp, params, "UTF-8");
        return s;
    }

    /**
     * 发送自定义短信
     *
     * @param mobile  手机号
     * @param content 短信内容，最多支持1000个字符，例：【签名A】短信内容。
     * @return String
     * @throws IOException
     */
    public  String sendSms(String mobile, String content) throws IOException {
        JSONObject params = createParams();
        params.put("content", content);
        params.put("mobile", mobile);
        String s = HttpUtils.sendPost(sendSms, params, "UTF-8");
        System.out.println(s);
        return s;
    }

    private static void main(String[] args) throws IOException {

        Long tKey = System.currentTimeMillis() / 1000;
        JSONObject params = new JSONObject();
        params.put("username", "tjtmyuanyuanhui");
        params.put("password", Md5Password("yyh13820969833", tKey));
        params.put("tKey", String.valueOf(tKey));

        params.put("content", "【风水咨询】 您的验证码是 123456 如非本人操作，请忽略本短信!");
        params.put("mobile", "15855540307");
        String s = HttpUtils.sendPost(sendSms, params, "UTF-8");
        System.out.println(s);
    }


    /**
     * 密码md5加密 密码采用32位小写MD5二次加密，例：md5 ( md5( password ) + tKey ))
     *
     * @return String`
     */
    private static String Md5Password(String password, Long tKey) {
        return SecureUtil.md5(SecureUtil.md5(password) + tKey);
    }

    /**
     * 创建参数
     *
     * @return Long
     */
    private  JSONObject createParams() {
        Long tKey = System.currentTimeMillis() / 1000;
        JSONObject params = new JSONObject();
        params.put("username", username);
        params.put("password", Md5Password(password, tKey));
        params.put("tKey", String.valueOf(tKey));

        return params;
    }


}
