//package com.qnfhq.modules.authentication.controller;
//
//import cn.hutool.core.collection.CollUtil;
//import cn.hutool.core.convert.Convert;
//import cn.hutool.core.util.StrUtil;
//import cn.hutool.json.JSONUtil;
//import com.aliyun.cloudauth_intl20220809.models.InitializeResponse;
//import com.aliyun.cloudauth_intl20220809.models.InitializeResponseBody;
//import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
//import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
//import com.qnfhq.common.ApiBaseController;
//import com.qnfhq.common.service.FileService;
//import com.qnfhq.common.utils.MessageUtils;
//import com.qnfhq.common.utils.Result;
//import com.qnfhq.modules.user.entity.AppUserDetailEntity;
//import com.qnfhq.modules.user.enums.UserCodeTypeEnum;
//import com.qnfhq.common.utils.cache.RedisCache;
//import com.qnfhq.modules.authentication.entity.AikycRequest;
//import com.qnfhq.modules.authentication.entity.UserAuthentication;
//import com.qnfhq.modules.authentication.service.UserAuthenticationService;
//import com.qnfhq.modules.authentication.util.AliyunEkycUtil;
//import com.qnfhq.modules.user.entity.AppUserEntity;
//import com.qnfhq.modules.user.service.AppUserDetailService;
//import com.qnfhq.modules.user.service.AppUserService;
//import io.swagger.v3.oas.annotations.Operation;
//import io.swagger.v3.oas.annotations.tags.Tag;
//import jakarta.annotation.Resource;
//import org.apache.commons.codec.binary.Base64;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.transaction.annotation.Transactional;
//import org.springframework.web.bind.annotation.PostMapping;
//import org.springframework.web.bind.annotation.RequestBody;
//import org.springframework.web.bind.annotation.RequestMapping;
//import org.springframework.web.bind.annotation.RestController;
//import org.springframework.web.multipart.MultipartFile;
//
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
//import java.util.concurrent.TimeUnit;
//
//
///**
// * <p>
// * 认证请求响应记录表 前端控制器
// * </p>
// *
// * @author huang
// * @since 2025-07-18
// */
//@Tag(name = "认证请求响应记录表模块")
//@RestController
//@RequestMapping("/api/appuser")
//public class UserAuthenticationController extends ApiBaseController {
//    @Resource
//    private AliyunEkycUtil aliyunEkycUtil;
//    @Resource
//    UserAuthenticationService userAuthenticationService;
//    @Resource
//    private AppUserDetailService appUserDetailService;
//    @Resource
//    AppUserService appUserService;
//
//    @Autowired
//    private FileService fileService;
//
//    @Resource
//    private RedisCache redisCache;
//
//    @Operation(summary = "实名认证初始化")
//    @PostMapping("/initialize")
//    public Result initialize(@RequestBody Map<String, Object> params) {
//        //参数错误
//        if (params.get("docType") == null || params.get("authorize") == null || params.get("metaInfo") == null) {
//            return new Result().error(MessageUtils.message("login.param.null"));
//        }
//        Long userId = getStpUserId();
//        try {
//            AikycRequest aikycRequest = new AikycRequest();
//            aikycRequest.setDocType(params.get("docType").toString());
//            aikycRequest.setAuthorize(params.get("authorize").toString());
//            aikycRequest.setMetaInfo(params.get("metaInfo").toString());
//            aikycRequest.setMerchantUserId(String.valueOf(getStpUserId()));
//            aikycRequest.setReturnUrl(params.containsKey("url") ? params.get("url").toString() : "");
//            InitializeResponse initialize = aliyunEkycUtil.initialize(aikycRequest);
//            if (initialize.getStatusCode() == 200) {
//                InitializeResponseBody.InitializeResponseBodyResult authResult = initialize.getBody().getResult();
//                String transactionId = authResult.getTransactionId();
//                Map<String, Object> result = new HashMap<>();
//                result.put("transactionId", transactionId);
//                result.put("transactionUrl", authResult.getTransactionUrl());
//
//                String keyCache = StrUtil.format("api-userauther-callback:{}", userId);
//                redisCache.setCacheObject(keyCache, "1", 60 * 20, TimeUnit.MINUTES);
//
//                return success(result);
//            }
//            return error(initialize.getBody().message);
//        } catch (Exception e) {
//            return error(e.getMessage());
//        }
//    }
//
//    @Operation(summary = "验证实名认证")
//    @PostMapping("/checkID")
//    @Transactional(rollbackFor = Exception.class)
//    public Result checkID(@RequestBody Map<String, Object> params) throws Exception {
//        if (params.get("transactionId") == null) {
//            return error(MessageUtils.message("login.param.null"));
//        }
//        String transactionId = params.get("transactionId").toString();
//        Long userId = getStpUserId();
//
//        String keyCache = StrUtil.format("api-userauther-check:{}", userId);
//        if (StrUtil.isNotBlank(redisCache.getCacheObject(keyCache))) {
//            return error(MessageUtils.message("login.repeat.operation"));
//        }
////        userAuthenticationService;
//                appUserService.selectById()
//        redisCache.setCacheObject(keyCache, "1", 30, TimeUnit.MINUTES);
//        UserAuthentication one = userAuthenticationService.getOne(
//                new LambdaQueryWrapper<UserAuthentication>()
//                        .eq(UserAuthentication::getTransactionId, transactionId));
//        if (one != null) {
//            redisCache.deleteObject(keyCache);
//            return error(MessageUtils.message("user.kyc.completed"));
//        }
//
//        //是否重新实名认证
//        boolean reKyc = false;
//
//        AppUserEntity userInfo = appUserService.selectById(userId);
//        String checkEmailKey = String.format("%s%s", UserCodeTypeEnum.CHANGE_KYC.name(), userInfo.getEmail());
//        int checkEmail = 0;
//        if (StrUtil.isNotBlank(redisCache.getCacheObject(checkEmailKey))) {
//            checkEmail = Convert.toInt(redisCache.getCacheObject(checkEmailKey));
//        }
//        String checkPhoneKey = String.format("%s%s", UserCodeTypeEnum.CHANGE_KYC.name(), userInfo.getPhone());
//        int checkPhone = 0;
//        if (StrUtil.isNotBlank(redisCache.getCacheObject(checkPhoneKey))) {
//            checkPhone = Convert.toInt(redisCache.getCacheObject(checkPhoneKey));
//        }
//        if (checkEmail == 1 && checkPhone == 1) {
//            reKyc = true;
//        }
//
//        AppUserDetailEntity detail = appUserDetailService.se(
//                new LambdaQueryWrapper<TAppUserDetail>()
//                        .eq(TAppUserDetail::getUserId, userId));
//        //实名认证校验，重新实名认证不校验
//        if (!reKyc) {
//            //如果账户已认证且已经有了身份证和头部照片,则认定为已认证
//            if (detail != null &&
//                    "1".equals(detail.getAuditStatusPrimary()) &&
//                    StringUtils.isNotBlank(detail.getFrontUrl()) &&
//                    StringUtils.isNotBlank(detail.getHandelUrl())) {
//
//                redisCache.deleteObject(keyCache);
//                return error(MessageUtils.message("user.kyc.already_completed"));
//
//            }
//        }
//        try {
//            CheckResultResponse checkResultResponse = aliyunEkycUtil.checkResult(transactionId);
//            UserAuthentication userAuthentication = new UserAuthentication();
//            userAuthentication.setHttpStatusCode(checkResultResponse.getStatusCode());
//            if (200 == checkResultResponse.getStatusCode()) {
//                CheckResultResponseBody body = checkResultResponse.getBody();
//
//
//                String extFaceInfoString = checkResultResponse.getBody().getResult().getExtFaceInfo();
//                String extIdInfoString = checkResultResponse.getBody().getResult().getExtIdInfo();
//                ExtFaceInfo extFaceInfo = JSONUtil.toBean(extFaceInfoString, ExtFaceInfo.class);
//                ExtIdInfo extIdInfo = JSONUtil.toBean(extIdInfoString, ExtIdInfo.class);
//                String cardName = extIdInfo.getOcrIdInfo().getName();
//                String idNumber = extIdInfo.getOcrIdInfo().getIdNumber();
//                List<TAppUserDetail> details = appUserDetailService.list(new LambdaQueryWrapper<TAppUserDetail>()
//                        .select(TAppUserDetail::getUserId)
//                        .eq(TAppUserDetail::getIdCard, idNumber)
//                );
//                if (CollUtil.isNotEmpty(details)) {
//
//                    return error(MessageUtils.message("user.already.bind.account"));
//                }
//                userAuthentication.setRequestId(body.getRequestId());
//                userAuthentication.setCode(body.getCode());
//                userAuthentication.setMessage(body.getMessage());
//                userAuthentication.setResultPassed(body.getResult().getPassed());
//                userAuthentication.setResultSubCode(body.getResult().getSubCode());
//                userAuthentication.setUserId(userId);
//                userAuthentication.setTransactionId(transactionId);
//
//
//                userAuthentication.setExtFaceInfo(JSONUtil.toJsonPrettyStr(extFaceInfo));
//                userAuthentication.setExtIdInfo(JSONUtil.toJsonPrettyStr(extIdInfo));
//
//
//                userAuthenticationService.save(userAuthentication);
//
//                Object idImage = JSONUtil.parseObj(body.getResult().getExtIdInfo()).get("idImage");
//                Object faceImg = JSONUtil.parseObj(body.getResult().getExtFaceInfo()).get("faceImg");
//
//                byte[] idImageBytes = Base64.decodeBase64(String.valueOf(idImage));
//                byte[] faceImgBytes = Base64.decodeBase64(String.valueOf(faceImg));
//
//                String idImageFileName = IdUtils.simpleUUID() + ".png";
//                MultipartFile multipartFile = new ByteArrayMultipartFile(idImageBytes, idImageFileName, "image");
//                String frontUrlOssUrl = fileService.uploadFileOSS(multipartFile, idImageFileName);
//
//                String faceImgFileName = IdUtils.simpleUUID() + ".png";
//                MultipartFile faceImgMultipartFile = new ByteArrayMultipartFile(faceImgBytes, faceImgFileName, "image");
//                String faceImgOssUrl = fileService.uploadFileOSS(faceImgMultipartFile, faceImgFileName);
//
//                //如果是重新实名认证，旧的实名认证信息存档
//                if (reKyc) {
//                    if (appUserDetailService.backupTAppUserDetailByUserId(detail) == 0) {
//                        throw new Exception(MessageUtils.message("re.kyc.backup.fail"));
//                    }
//                }
//
//                //更新实名认证
//                if (body.result.getPassed().equals("Y")) {
//                    LambdaUpdateWrapper<TAppUserDetail> updateWrapper = new LambdaUpdateWrapper<>();
//                    updateWrapper.eq(TAppUserDetail::getUserId, userId)
//                            .set(TAppUserDetail::getAuditStatusPrimary, 1)
//                            .set(TAppUserDetail::getAuditStatusAdvanced, 1)
//                            .set(TAppUserDetail::getFrontUrl, frontUrlOssUrl)
//                            .set(TAppUserDetail::getHandelUrl, faceImgOssUrl)
//                            .set(TAppUserDetail::getRealName, cardName)
//                            .set(TAppUserDetail::getIdCard, idNumber);
//                    //重新实名认证次数+1
//                    if (reKyc) {
//                        updateWrapper.setSql("re_kyc=re_kyc+1");
//                    }
//                    appUserDetailService.update(updateWrapper);
//                    redisCache.deleteObject(keyCache);
//                    redisCache.deleteObject(checkEmailKey);
//                    redisCache.deleteObject(checkPhoneKey);
//                    return success(MessageUtils.message("user.kyc.success"));
//                } else {
//                    LambdaUpdateWrapper<TAppUserDetail> updateWrapper = new LambdaUpdateWrapper<>();
//                    updateWrapper.eq(TAppUserDetail::getUserId, userId)
//                            .set(TAppUserDetail::getAuditStatusPrimary, -1)
//                            .set(TAppUserDetail::getFrontUrl, frontUrlOssUrl)
//                            .set(TAppUserDetail::getHandelUrl, faceImgOssUrl)
//                            .set(TAppUserDetail::getRealName, body.result.getSubCode());
//                    appUserDetailService.update(updateWrapper);
//                    redisCache.deleteObject(keyCache);
//                    return error(userAuthentication.getMessage());
//                }
//            }
//            redisCache.deleteObject(keyCache);
//            return error(checkResultResponse.getBody().message);
//        } catch (Exception e) {
//            redisCache.deleteObject(keyCache);
//            throw new Exception(e.getMessage());
//        }
//    }
//
//
//}