package jnpf.personnels.utils;

import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.common.profile.HttpProfile;
import com.tencentcloudapi.ocr.v20181119.OcrClient;
import com.tencentcloudapi.ocr.v20181119.models.BankCardOCRRequest;
import com.tencentcloudapi.ocr.v20181119.models.BankCardOCRResponse;
import com.tencentcloudapi.ocr.v20181119.models.IDCardOCRRequest;
import com.tencentcloudapi.ocr.v20181119.models.IDCardOCRResponse;
import jnpf.model.personnels.dto.staff.registerform.BankConvertDto;
import jnpf.model.personnels.dto.staff.registerform.IdCardConverterDto;
import jnpf.personnels.config.TengxunLicenseConfig;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.Date;

@Component
@Slf4j
public class PersonnelCardOcr {
    @Resource
    private TengxunLicenseConfig licenseConfig;

    /**
     * 身份证识别
     *
     * @param imgUrl
     * @return
     */
    public IdCardConverterDto idCardOcr(String imgUrl) {
        try {
            // 实例化一个认证对象，入参需要传入腾讯云账户 SecretId 和 SecretKey，此处还需注意密钥对的保密
            // 代码泄露可能会导致 SecretId 和 SecretKey 泄露，并威胁账号下所有资源的安全性。以下代码示例仅供参考，建议采用更安全的方式来使用密钥，请参见：https://cloud.tencent.com/document/product/1278/85305
            // 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取
            Credential cred = new Credential(licenseConfig.getSecretId(), licenseConfig.getSecretKey());
            // 实例化一个http选项，可选的，没有特殊需求可以跳过
            HttpProfile httpProfile = new HttpProfile();
            httpProfile.setEndpoint(licenseConfig.getDomain());
            // 实例化一个client选项，可选的，没有特殊需求可以跳过
            ClientProfile clientProfile = new ClientProfile();
            clientProfile.setHttpProfile(httpProfile);
            // 实例化要请求产品的client对象,clientProfile是可选的
            OcrClient client = new OcrClient(cred, "ap-guangzhou", clientProfile);
            // 实例化一个请求对象,每个接口都会对应一个request对象
            IDCardOCRRequest req = new IDCardOCRRequest();
            req.setImageUrl(imgUrl);

            // 返回的resp是一个IDCardOCRResponse的实例，与请求对象对应
            IDCardOCRResponse resp = client.IDCardOCR(req);
            // 输出json格式的字符串回包
            log.error("idcard={}", IDCardOCRResponse.toJsonString(resp));
            IdCardConverterDto dto = new IdCardConverterDto();
            dto.setName(resp.getName());
            dto.setIdNum(resp.getIdNum());
            dto.setBirth(resp.getBirth());
            dto.setNation(resp.getNation());
            dto.setSex(resp.getSex());
            dto.setAddress(resp.getAddress());
            if (StringUtils.isNotEmpty(dto.getBirth())) {
                //计算年龄
                DateTime parse = DateUtil.parse(dto.getBirth(), "yyyy/MM/dd");
                long year = DateUtil.betweenYear(parse, new Date(), false);
                dto.setAge(year);
            }
            return dto;

        } catch (Exception e) {
            log.error("身份证识别失败", e);
            throw new RuntimeException("身份证识别失败");
        }
    }

    /**
     * 银行卡识别
     *
     * @param imgUrl
     * @return
     */

    public BankConvertDto bankOcr(String imgUrl) {
        try {
            // 实例化一个认证对象，入参需要传入腾讯云账户 SecretId 和 SecretKey，此处还需注意密钥对的保密
            // 代码泄露可能会导致 SecretId 和 SecretKey 泄露，并威胁账号下所有资源的安全性。以下代码示例仅供参考，建议采用更安全的方式来使用密钥，请参见：https://cloud.tencent.com/document/product/1278/85305
            // 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取
            Credential cred = new Credential(licenseConfig.getSecretId(), licenseConfig.getSecretKey());
            // 实例化一个http选项，可选的，没有特殊需求可以跳过
            HttpProfile httpProfile = new HttpProfile();
            httpProfile.setEndpoint(licenseConfig.getDomain());
            // 实例化一个client选项，可选的，没有特殊需求可以跳过
            ClientProfile clientProfile = new ClientProfile();
            clientProfile.setHttpProfile(httpProfile);
            // 实例化要请求产品的client对象,clientProfile是可选的
            OcrClient client = new OcrClient(cred, "ap-guangzhou", clientProfile);
            // 实例化一个请求对象,每个接口都会对应一个request对象
            BankCardOCRRequest req = new BankCardOCRRequest();
            req.setImageUrl(imgUrl);

            // 返回的resp是一个BankCardOCRResponse的实例，与请求对象对应
            BankCardOCRResponse resp = client.BankCardOCR(req);
            // 输出json格式的字符串回包
            log.error(BankCardOCRResponse.toJsonString(resp));
            BankConvertDto dto = new BankConvertDto();
            dto.setCardNo(resp.getCardNo());
            dto.setBankInfo(resp.getBankInfo());
            dto.setCardName(resp.getCardName());
            dto.setCardType(resp.getCardType());
            return dto;
        } catch (Exception e) {
            log.error("银行卡识别失败,", e);
            throw new RuntimeException("银行卡识别失败");
        }
    }
}
