package com.yifu.cloud.plus.v1.check.utils;

import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.yifu.cloud.plus.v1.check.constant.ChecksConstants;
import com.yifu.cloud.plus.v1.check.entity.TCheckBankNo;
import com.yifu.cloud.plus.v1.check.entity.TCheckIdCard;
import com.yifu.cloud.plus.v1.check.entity.TCheckMobile;
import com.yifu.cloud.plus.v1.yifu.common.core.constant.CommonConstants;
import com.yifu.cloud.plus.v1.yifu.common.core.util.Common;
import com.yifu.cloud.plus.v1.yifu.common.core.util.R;
import org.springframework.beans.factory.annotation.Value;

import java.util.HashMap;
import java.util.Map;

/**
 * @author hgw2
 * @description 测试身份证
 * @date 2022/5/7
 */
public class ChecksUtil {

     @Value("${canCheck:false}")
     private static boolean canCheck;

     private static final String APP_ID_ID_CARD = "oi0mucL4";

     private static final String APP_KEY_ID_CARD = "s4lW5JRA";

     private static final String API_URL_ID_CARD = "https://api.253.com/open/idcard/id-card-auth";

     private static JsonParser jsonParser = new JsonParser();

     public static void checkIdCard(TCheckIdCard checkIdCard) {

          if (canCheck) {
               // 1.调用身份信息校验api
               checkIdCardMethod(checkIdCard);
          } else {
               checkIdCard.setIsTrue(0);
               checkIdCard.setReason(ChecksConstants.NACOS_CHECK_CONFIG_ERROR);
          }
     }
	/**
	 * @Author fxj
	 * @Description 手机号码状态检测
	 * @Date 17:50 2022/6/20
	 * @param  mobiles  检测手机号，多个手机号码用英文半角逗号隔开，仅支持国内号码
	 **/
	public static R<Map<String,TCheckMobile>> checkMobile(String mobiles) {
		Map<String,TCheckMobile>  checkMobiles = new HashMap<>();
		if (canCheck) {
			// 1.调用身份信息校验api
			return checkMobileMethod(mobiles,checkMobiles);
		} else {
			return R.failed(ChecksConstants.NACOS_CHECK_CONFIG_ERROR);
		}
	}
	/**
	 * @Author fxj
	 * @Description 银行卡四要素标准版 校验
	 * @Date 17:50 2022/6/20
	 * @param  name	姓名	是	[string]
	 * @param  idNum	身份证号码，限单个	是	[string]
	 * @param  cardNo	银行卡号，限单个	是	[string]
	 * @param  mobile	银行预留手机号，仅支持国内11位号码
	 **/
	public static R<TCheckBankNo> checkBankNo(String name, String idNum, String cardNo, String mobile) {
		TCheckBankNo  checkBankNo = new TCheckBankNo();
		if (canCheck) {
			// 1.调用身份信息校验api
			return checkBankNoMethod(name,idNum,cardNo,mobile,checkBankNo);
		} else {
			return R.failed(ChecksConstants.NACOS_CHECK_CONFIG_ERROR);
		}
	}

	private static R<TCheckBankNo> checkBankNoMethod(String name,
																  String idNum,
																  String cardNo,
																  String mobile,
																  TCheckBankNo checkBankNo) {
		final JsonObject jsonObject = ChecksUtil.invokeBankNo(name,idNum,cardNo,mobile);
		// 2.处理返回结果
		if (jsonObject != null) {
			//响应code码。200000：成功，其他失败
			String code = jsonObject.get(ChecksConstants.CODE).getAsString();
			if ("200000".equals(code) && jsonObject.get("data") != null) {
				// 调用身份信息校验成功
				// 解析结果数据，进行业务处理
				// 校验状态码  200000：成功，其他失败
				JsonObject resJson = jsonObject.get("data").getAsJsonObject();
				String message = jsonObject.get("message").getAsString();
				if (Common.isNotNull(resJson)){
					TCheckBankNo bankNo = new TCheckBankNo();
					bankNo.setBankNo(resJson.getAsJsonObject().get("bankNo").getAsString());
					bankNo.setBankName(resJson.getAsJsonObject().get("bankName").getAsString());
					bankNo.setCardCategory(resJson.getAsJsonObject().get("cardCategory").getAsString());
					bankNo.setCardType(resJson.getAsJsonObject().get("cardType").getAsString());
					bankNo.setResult(resJson.getAsJsonObject().get("result").getAsString());
					bankNo.setMessage(message);
					bankNo.setRemark(resJson.getAsJsonObject().get("remark").getAsString());
					bankNo.setType(CommonConstants.ONE_STRING);
				}
			} else {
				// 记录错误日志，正式项目中请换成log打印
				return R.failed("银行卡号校验失败,code:" + code + ",msg:" + jsonObject.get("message").getAsString());
			}
		} else {
			return R.failed("接口无返回数据");
		}
		return R.ok(checkBankNo);
	}



	/**
	 * @Author fxj
	 * @Description 手机号码状态检测
	 * @Date 17:50 2022/6/20
	 * @param  mobiles  检测手机号，多个手机号码用英文半角逗号隔开，仅支持国内号码
	 **/
	private static R<Map<String,TCheckMobile>> checkMobileMethod(String mobiles, Map<String,TCheckMobile>  checkMobileMap) {
		final JsonObject jsonObject = ChecksUtil.invokeMobile(mobiles);
		// 2.处理返回结果
		if (jsonObject != null) {
			//响应code码。200000：成功，其他失败
			String code = jsonObject.get(ChecksConstants.CODE).getAsString();
			if ("200000".equals(code) && jsonObject.get("data") != null) {
				// 调用身份信息校验成功
				// 解析结果数据，进行业务处理
				// 校验状态码  200000：成功，其他失败
				JsonObject resJson = jsonObject.get("data").getAsJsonObject();
				String message = jsonObject.get("message").getAsString();
				JsonArray mobileArray = resJson.getAsJsonArray();
				if (Common.isNotNull(mobileArray) && mobileArray.size() > CommonConstants.ZERO_INT){
					TCheckMobile mobile = null;
					for (int i = 0;i < mobileArray.size(); i++){
						mobile = new TCheckMobile();
						mobile.setMobile(mobileArray.get(i).getAsJsonObject().get("mobile").getAsString());
						mobile.setArea(mobileArray.get(i).getAsJsonObject().get("area").getAsString());
						mobile.setNumbertype(mobileArray.get(i).getAsJsonObject().get("numberType").getAsString());
						mobile.setChargesstatus(mobileArray.get(i).getAsJsonObject().get("chargesStatus").getAsString());
						mobile.setStatus(mobileArray.get(i).getAsJsonObject().get("status").getAsString());
						mobile.setMessage(message);
						mobile.setType(CommonConstants.ONE_STRING);
						checkMobileMap.put(mobile.getMobile(),mobile);
					}
				}
			} else {
				// 记录错误日志，正式项目中请换成log打印
				return R.failed("手机号校验失败,code:" + code + ",msg:" + jsonObject.get("message").getAsString());
			}
		} else {
			return R.failed("接口无返回数据");
		}
		return R.ok(checkMobileMap);
	}

	// 核心调用
     private static void checkIdCardMethod(TCheckIdCard checkIdCard) {
          final JsonObject jsonObject = ChecksUtil.invokeIdCard(checkIdCard.getName(), checkIdCard.getIdCard());
          // 2.处理返回结果
          if (jsonObject != null) {
               //响应code码。200000：成功，其他失败
               String code = jsonObject.get(ChecksConstants.CODE).getAsString();
               if ("200000".equals(code) && jsonObject.get("data") != null) {
                    // 调用身份信息校验成功
                    // 解析结果数据，进行业务处理
                    // 校验状态码  200000：成功，其他失败
                    String resultStr = jsonObject.get("data").getAsJsonObject().get("result").getAsString();
                    if ("01".equals(resultStr)) {
                         checkIdCard.setIsTrue(1);
                         checkIdCard.setReason("正确");
                    } else {
                         checkIdCard.setIsTrue(0);
                         String remark = jsonObject.get("data").getAsJsonObject().get("remark").getAsString();
                         checkIdCard.setReason("调用身份信息校验失败,resultStr:" + resultStr + ",msg:" + remark);
                    }
               } else {
                    // 记录错误日志，正式项目中请换成log打印
                    checkIdCard.setIsTrue(0);
                    checkIdCard.setReason("调用身份信息校验失败,code:" + code + ",msg:" + jsonObject.get("message").getAsString());
               }
          } else {
               checkIdCard.setIsTrue(0);
               checkIdCard.setReason("接口无返回数据");
          }
     }

     private static JsonObject invokeIdCard(String name, String idNum) {
          Map<String, String> params = new HashMap<>();
          params.put("appId", APP_ID_ID_CARD);
          params.put("appKey", APP_KEY_ID_CARD);
          params.put("name", name);
          params.put("idNum", idNum);
          String result = HttpUtils.post(API_URL_ID_CARD, params);
          // 解析json,并返回结果
          return jsonParser.parse(result).getAsJsonObject();
     }

	 /**
	  * @Author fxj
	  * @Description 手机号码状态检测
	  * @Date 17:50 2022/6/20
	  * @param  mobiles  检测手机号，多个手机号码用英文半角逗号隔开，仅支持国内号码
	 **/
	private static JsonObject invokeMobile(String mobiles) {
		Map<String, String> params = new HashMap<>();
		params.put("appId", APP_ID_ID_CARD);
		params.put("appKey", APP_KEY_ID_CARD);
		params.put("mobiles", mobiles);
		String result = HttpUtils.post(API_URL_ID_CARD, params);
		// 解析json,并返回结果
		return jsonParser.parse(result).getAsJsonObject();
	}

	private static JsonObject invokeBankNo(String name, String idNum, String cardNo, String mobile) {
		Map<String, String> params = new HashMap<>();
		params.put("appId", APP_ID_ID_CARD);
		params.put("appKey", APP_KEY_ID_CARD);
		params.put("name", name);
		params.put("idNum", idNum);
		params.put("cardNo", cardNo);
		params.put("mobile", mobile);
		String result = HttpUtils.post(API_URL_ID_CARD, params);
		// 解析json,并返回结果
		return jsonParser.parse(result).getAsJsonObject();
	}
}
