package com.izouma.nineth.utils;

import com.alibaba.fastjson.JSONObject;
import com.izouma.nineth.exception.BusinessException;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpResponse;
import org.apache.http.util.EntityUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.*;

@Slf4j
@Data
@Component
public class IdentityUtil {

    /**
     * 阿里的appCode
     * appCode
     */
    @Value("${AppCode:}")
    public String appCode;


    /**
     * 身份证 银卡 名字  手机号四要素验证
     *
     * @param accountNo  银卡
     * @param phone      手机号
     * @param idCardCode 身份证
     * @param name       名字
     */
    public void verifyInformation(String accountNo, String phone, String idCardCode, String name) {
        log.info("绑卡参数:{},{},{},{},{}", accountNo, phone, idCardCode, name, appCode);
        String host = "https://zball.market.alicloudapi.com";
        String path = "/v2/bcheck";
        String method = "POST";
        Map<String, String> headers = new HashMap<String, String>();
        //最后在header中的格式(中间是英文空格)为Authorization:APPCODE 83359fd73fe94948385f570e3c139105
        headers.put("Authorization", "APPCODE " + appCode);
        //根据API的要求，定义相对应的Content-Type
        headers.put("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
        Map<String, String> querys = new HashMap<String, String>();
        Map<String, String> bodys = new HashMap<String, String>();
        bodys.put("accountNo", accountNo);
        bodys.put("bankPreMobile", phone);
        bodys.put("idCardCode", idCardCode);
        bodys.put("name", name);
        try {
            /**
             * 重要提示如下:
             * HttpUtils请从
             * https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/src/main/java/com/aliyun/api/gateway/demo/util/HttpUtils.java
             * 下载
             *
             * 相应的依赖请参照
             * https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/pom.xml
             */
            HttpResponse response = HttpUtils.doPost(host, path, method, headers, querys, bodys);
            /*
            respCode:应答码 “T”表示有效的，”F”表示无效的，“N”表示无法认证的，”P”表示网络连接超时
            detailCode:细分应答码 0，认证成功，1，信息有误 2，卡状态异常 3，发卡行不支持此交易，请联系发卡行 4,银联不支持该银行 5,无效卡 6，受限制的卡，7，姓名格式有误 8，身份证号码格式有误，9，手机号码格式有误 10，银行卡格式有误，11，密码错误次数超限，12，验证要素格式有误 ，100，其他原因不通过
            detailCode:(0，对应respCode:T) (1, 2,5,6，7,8,9,10,11,12,100,对应respCode:F)(3, 4,对应respCode:N)
            bankName:银行名称，type:卡类型,cardname:卡名称，tel：银行电话，Icon：银行logo
             */
            String resultStr = EntityUtils.toString(response.getEntity());
            log.info("绑定银行卡四要素验证结果：" + resultStr);
            JSONObject jsonObject = JSONObject.parseObject(resultStr);
            JSONObject result = jsonObject.getJSONObject("result");
            int detailCode = result.getInteger("detailCode");
            if (detailCode != 0) {
                String respMsg = result.getString("respMsg");
                String errorInfo = "请检查绑定的身份证号与名字是否正确、或者手机号是否正确";
                if(!"验证要素格式有误".equals(respMsg)){
                    errorInfo = respMsg;
                }
                throw new BusinessException(errorInfo);
            }
        } catch(BusinessException e) {
            throw e;
        }catch (Exception e) {
            throw new RuntimeException("绑定银行卡四要素验证报错:" + e.getMessage(), e);
        }

    }
}
