package com.ruoyi.xq.tencent;

import com.alibaba.fastjson.JSON;
import com.ruoyi.xq.util.JsonUtils;
import com.tencentcloudapi.common.AbstractModel;
import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.common.profile.HttpProfile;
import com.tencentcloudapi.faceid.v20180301.FaceidClient;
import com.tencentcloudapi.faceid.v20180301.models.*;
import lombok.extern.slf4j.Slf4j;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Objects;

@Slf4j
public class TencentAuthClient {

    private final static String SECRET_ID = "AKIDviL2b1KWHGNdR6gLwLbfaHpBSVQ8i8Pe";
    private final static String SECRET_KEY = "DapskQxS7gBXlsqgP0a0KXXK8oy45INf";


    public static boolean faceDetectIsPass(GetDetectInfoEnhancedResponse resp) {
        if (!Objects.isNull(resp)) {
            DetectInfoText text = resp.getText();
            return !Objects.isNull(text) && text.getErrCode().intValue() == 0;
        }
        return false;
    }


    /**
     * 实名核身鉴权
     *
     * @return
     */
    public static GetDetectInfoEnhancedResponse getDetectInfo(String bizToken) throws TencentCloudSDKException {
        GetDetectInfoEnhancedResponse resp = null;
        Credential cred = new Credential(SECRET_ID, SECRET_KEY);
        HttpProfile httpProfile = new HttpProfile();
        httpProfile.setEndpoint("faceid.tencentcloudapi.com");
        httpProfile.setConnTimeout(10); // 请求连接超时时间，单位为秒(默认60秒)
        httpProfile.setWriteTimeout(10);  // 设置写入超时时间，单位为秒(默认0秒)
        httpProfile.setReadTimeout(10);
        ClientProfile clientProfile = new ClientProfile();
        clientProfile.setHttpProfile(httpProfile);
        FaceidClient client = new FaceidClient(cred, "", clientProfile);
        GetDetectInfoEnhancedRequest req = new GetDetectInfoEnhancedRequest();
        req.setBizToken(bizToken);
        req.setInfoType("0");
        req.setRuleId("1");
        return client.GetDetectInfoEnhanced(req);
    }

    public static CreateAuthResp createToken(String extra,String redirectUrl) throws TencentCloudSDKException {
        // 实例化一个认证对象，入参需要传入腾讯云账户 SecretId 和 SecretKey，此处还需注意密钥对的保密
        // 代码泄露可能会导致 SecretId 和 SecretKey 泄露，并威胁账号下所有资源的安全性。以下代码示例仅供参考，建议采用更安全的方式来使用密钥，请参见：https://cloud.tencent.com/document/product/1278/85305
        // 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取
        Credential cred = new Credential(SECRET_ID, SECRET_KEY);
        // 实例化一个http选项，可选的，没有特殊需求可以跳过
        HttpProfile httpProfile = new HttpProfile();
        httpProfile.setEndpoint("faceid.tencentcloudapi.com");
        httpProfile.setConnTimeout(10); // 请求连接超时时间，单位为秒(默认60秒)
        httpProfile.setWriteTimeout(10);  // 设置写入超时时间，单位为秒(默认0秒)
        httpProfile.setReadTimeout(10);
        // 实例化一个client选项，可选的，没有特殊需求可以跳过
        ClientProfile clientProfile = new ClientProfile();
        clientProfile.setHttpProfile(httpProfile);
        // 实例化要请求产品的client对象,clientProfile是可选的
        FaceidClient client = new FaceidClient(cred, "", clientProfile);
        // 实例化一个请求对象,每个接口都会对应一个request对象
        DetectAuthRequest req = new DetectAuthRequest();
        req.setRuleId("1");
        // 透传参数
        req.setExtra(extra);
        // 跳转的URL
        req.setRedirectUrl(redirectUrl);
        // 返回的resp是一个DetectAuthResponse的实例，与请求对象对应
        DetectAuthResponse resp = client.DetectAuth(req);
        // 输出json格式的字符串回包
        System.out.println(AbstractModel.toJsonString(resp));
        return JsonUtils.parseObject(AbstractModel.toJsonString(resp), CreateAuthResp.class);
    }


    public static void main(String[] args) throws TencentCloudSDKException {
//        createToken(null,null);
        GetDetectInfoEnhancedResponse detectInfo = getDetectInfo("C454630F-0E21-4ABB-8575-3A4DA14B0BCF");
        System.out.println(JSON.toJSONString(detectInfo));
        base64ToVideo(detectInfo.getIdCardData().getOcrFront(), "D:\\test\\front.jpg");
        base64ToVideo(detectInfo.getIdCardData().getOcrBack(), "D:\\test\\back.jpg");
        base64ToVideo(detectInfo.getBestFrame().getBestFrame(), "D:\\test\\best.jpg");
        base64ToVideo(detectInfo.getVideoData().getLivenessVideo(), "D:\\test\\123.mp4");
    }


    public static void base64ToVideo(String base64, String targetPath) {
        try {
            //base解密
            byte[] videoByte = new sun.misc.BASE64Decoder().decodeBuffer(base64);
            File videoFile = new File(targetPath);
            //输入视频文件
            FileOutputStream fos = new FileOutputStream(videoFile);
            fos.write(videoByte, 0, videoByte.length);
            fos.flush();
            fos.close();
        } catch (IOException e) {
            log.error("base64转换为视频异常",e);
        }
    }
}
