package com.heyu.api.tencent.handle;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.heyu.api.data.constants.ApiConstants;
import com.heyu.api.data.dao.api.ApiIdCardDao;
import com.heyu.api.data.entity.api.ApiIdCardEntity;
import com.heyu.api.data.service.api.ApiRechargeMoneyService;
import com.heyu.api.data.utils.StringUtils;
import com.heyu.api.tencent.TencentBaseHandle;
import com.heyu.api.tencent.request.TTIdCardOCRVerificationRequest;
import com.heyu.api.tencent.resp.ThirdIdCardResp;
import com.heyu.api.utils.ThirdUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/***
 *
 *
 * https://market.cloud.tencent.com/products/17684
 *
 *
 *身份证识别及信息核验
 *
 *
 * 【身份证实名认证-身份证二要素实名认证】传入姓名、身份证号，校验是否一致，同时解析，省份、城市、性别。身份证实名认证接口主要应用在物流、金融
 * 、游戏防沉溺等政策要求注册用户身份证实名认证的场景中，产品别名也叫【身份证实名认证、身份证实名认证接口、身份证实名认证api】
 *
 *
 */
@Component
@Slf4j
public class ThirdTIdCardVerificationHandle extends TencentBaseHandle<TTIdCardOCRVerificationRequest, ThirdIdCardResp> {


    @Autowired
    private ApiIdCardDao apiIdCardDao;

    @Autowired
    private ApiRechargeMoneyService apiRechargeMoneyService;

    @Override
    public String check(TTIdCardOCRVerificationRequest ttIdCardOCRVerificationRequest) {
        if (StringUtils.isNotBlank(ttIdCardOCRVerificationRequest.getIdCard())
                && StringUtils.isBlank(ttIdCardOCRVerificationRequest.getName())) {
            return "姓名不能为空";
        }


        if (StringUtils.isBlank(ttIdCardOCRVerificationRequest.getIdCard())
                && StringUtils.isNotBlank(ttIdCardOCRVerificationRequest.getName())) {
            return "身份证号不能为空";
        }

        if (StringUtils.isBlank(ttIdCardOCRVerificationRequest.getIdCard())
                && StringUtils.isBlank(ttIdCardOCRVerificationRequest.getName())
                && StringUtils.isBlank(ttIdCardOCRVerificationRequest.getImageBase64())
                && StringUtils.isBlank(ttIdCardOCRVerificationRequest.getImageUrl())
        ) {
            return "姓名身份证号以及图片不能同时为空";
        }
        return null;
    }


    /***
     * 注意：
     * 1.解析：先判断error_code为0仅代表端口通讯成功再看业务逻辑码isok值当isok为true为匹配 false为不匹配。
     * 2.出现'库无'时 "error_code":206501，有以下几种原因
     *
     *
     * (1)现役军人、武警官兵、特殊部门人员及特殊级别官员；
     * (2)退役不到2年的军人和士兵（根据军衔、兵种不同，时间会有所不同，一般为2年）；
     * (3)户口迁出，且没有在新的迁入地迁入 eg：刚上大学或刚毕业的大学生；
     * (4)户口迁入新迁入地，当地公安系统未将迁移信息上报到公安部（上报时间地域不同而有所差异）；
     * (5)更改姓名，当地公安系统未将更改信息上报到公安部（上报时间因地域不同而有所差异）；
     * (6)移民；
     * (7)未更换二代身份证；
     * (8)死亡。
     * (9)身份证号确实不存在
     */
    @Override
    public ThirdIdCardResp run(TTIdCardOCRVerificationRequest ap) throws Exception {
        ThirdIdCardResp resp = null;
        if (StringUtils.isNotBlank(ap.getIdCard()) && StringUtils.isNotBlank(ap.getName())) {
            ApiIdCardEntity apiIdCardEntity = apiIdCardDao.selectApiIdCardByIdCardNameChannelEnableStatus(ap.getIdCard(), ap.getName(), ApiConstants.third, 1);
            if (apiIdCardEntity != null) {
                resp = JSONObject.parseObject(apiIdCardEntity.getApiResult(), ThirdIdCardResp.class);
                apiIdCardDao.updateApiIdCardUseCountById(1L, apiIdCardEntity.getId());
                return resp;
            }
        }
        resp = ThirdUtils.getIdCard(ap.getIdCard(), ap.getName());

        ApiIdCardEntity apiIdCardEntity = new ApiIdCardEntity();
        apiIdCardEntity.setIdCard(ap.getIdCard());
        apiIdCardEntity.setRealName(ap.getName());
        apiIdCardEntity.setChannel(ApiConstants.third);

        apiIdCardEntity.setApiResult(JSON.toJSONString(resp));

        apiIdCardEntity.setEnableStatus(1);
        apiIdCardEntity.setUseCount(1L);
        apiIdCardDao.insertApiIdCard(apiIdCardEntity);

        apiRechargeMoneyService.addUseCountAndSendWarnMsg(ApiConstants.IDCARD_VERIFICATION_THIRD, 1);





        return resp;
    }
}
