package com.dcsoft.system.face.service.impl;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.dcsoft.system.face.domain.FaceStudent;
import com.dcsoft.system.face.service.HumanService;
import com.dcsoft.system.face.service.MsgService;
import com.dcsoft.system.utils.HttpUtil;
import com.dcsoft.system.utils.PictureUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import springfox.documentation.spring.web.json.Json;

import java.math.BigInteger;
import java.security.MessageDigest;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * 用户管理 服务层处理
 *
 * @author xueyi
 */
@Service
public class MsgServiceImpl implements MsgService {



    //@Value("${msg.url}")
    public String msg;
    //** 资源映射路径 前缀 *//*
    //@Value("${msg.appId}")
    public String appId;

    //@Value("${msg.isable}")
    public Boolean isable;

    //@Value("${msg.appSecrte}")
    public String appSecrte;

    @Override
    public String sendDing(Map<String,Object> map) {
        String response="";
        if(isable){
            String url=msg+"/api/v1/msg/send_ding";
            JSONObject paramMap=new JSONObject(new LinkedHashMap());
            paramMap.put("appId",appId);
            String type="text";
            paramMap.put("type",type);
            String accounts=map.get("accounts")+"";
            paramMap.put("accounts",accounts);
            SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String content="您上传的照片于"+sdf.format(new Date());
            if("1".equals(map.get("erification"))){
                content+="核验通过!";
            }else{
                content+="核验不通过，请进入采集端重新上传";
            }
            paramMap.put("content",content);
            Long time=new Date().getTime();
            paramMap.put("time",time);
            String contents= JSON.toJSONString(content);
            String sign= EncodeByMD5(appId+type+map.get("userIds")+accounts+map.get("templateId")+contents+time+appSecrte);
            paramMap.put("sign",sign);
            response=HttpUtil.postDataJson(url, paramMap);
        }
        return response;
    }

    /**
     * 对字符串进行32位MD5加密
     * @param str
     * @return
     */
    public static String EncodeByMD5(String str) {
        try {
            // 生成一个MD5加密计算摘要
            MessageDigest md = MessageDigest.getInstance("MD5");
            // 计算md5函数
            md.update(str.getBytes("UTF-8"));
            // digest()最后确定返回md5 hash值，返回值为8为字符串。因为md5 hash值是16位的hex值，实际上就是8位的字符
            // BigInteger函数则将8位的字符串转换成16位hex值，用字符串来表示；得到字符串形式的hash值
            String md5=new BigInteger(1, md.digest()).toString(16);
            //BigInteger会把0省略掉，需补全至32位
            return fillMD5(md5);
        } catch (Exception e) {
            throw new RuntimeException("MD5加密错误:"+e.getMessage(),e);
        }
    }

    private static String fillMD5(String md5) {
        //如果不够32位则回调自身补零，最后返回32位长度的签名
        return md5.length() == 32 ? md5 : fillMD5("0" + md5);
    }


}
