package com.heyu.api.controller.bankcard;


import com.heyu.api.alibaba.handle.common.text.ABank2MetaVerifyHandle;
import com.heyu.api.alibaba.request.common.text.ABank4MetaVerifyRequest;
import com.heyu.api.alibaba.resp.TBankMetaVerifyResponse;
import com.heyu.api.controller.BaseController;
import com.heyu.api.data.annotation.EbAuthentication;
import com.heyu.api.data.constants.ApiConstants;
import com.heyu.api.data.utils.ApiR;
import com.heyu.api.data.utils.R;
import com.heyu.api.resp.certificate.BankCard2MetaResp;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/***
 * 银行卡二要素核验控制器
 *
 * 功能说明：
 * 提供银行卡号+姓名二要素核验接口，验证用户输入的银行卡信息是否真实匹配
 *
 * 接口文档：
 * - 阿里云：https://next.api.aliyun.com/api/Cloudauth/2019-03-07/BankMetaVerify?tab=DOC&lang=JAVA
 * - 腾讯云：https://console.cloud.tencent.com/api/explorer?Product=faceid&Version=2018-03-01&Action=BankCard2EVerification
 *
 * 购买链接：
 * - 腾讯云：https://buy.cloud.tencent.com/iai_faceid
 * - 阿里云：https://www.aliyun.com/product/id-verification
 *
 * 核验要素：
 * - 二要素：银行卡号 + 姓名
 * - 三要素：银行卡号 + 姓名 + 身份证号
 * - 四要素：银行卡号 + 姓名 + 身份证号 + 手机号
 *
 * @author 系统生成
 * @version 1.0
 */
/**
 * 银行卡二要素核验控制器
 * <p>
 * 继承BaseController，提供银行卡二要素核验的HTTP接口
 * 主要用于验证用户输入的银行卡号和姓名是否匹配
 * </p>
 */
@Slf4j
@RestController
@RequestMapping("/bank/card/2")
public class BankCard2MetaController extends BaseController {

    /**
     * 阿里云银行卡二要素核验处理器
     */
    @Autowired
    private ABank2MetaVerifyHandle aBankMetaVerifyHandle;

    /**
     * 核验成功提示信息
     */
    public static final String SUCCESS_MSG = "银⾏卡号+姓名信息匹配";

    /**
     * 核验失败提示信息
     */
    public static final String FAILED_MSG = "银⾏卡号+姓名信息不匹配";



    /**
     * 银行卡二要素核验接口
     * <p>
     * 测试地址：
     * - 本地：http://localhost:8888/bank/card/2/verify?bankCard=6214855713516769&realName=瞿贻晓
     * - 内网：http://172.16.5.230:7848/bank/card/2/verify?bankCard=6214855713516769&realName=瞿贻晓
     * - 生产：https://api.1024api.com/api-interface/bank/card/2/verify?bankCard=6214855713516769&realName=瞿贻晓
     * </p>
     *
     * @param bankCard2MetaRequest 银行卡核验请求对象，包含银行卡号和真实姓名
     * @return R 返回核验结果，包含核验状态和描述信息
     */
    @EbAuthentication(tencent = ApiConstants.TENCENT_AUTH)
    @RequestMapping("/verify")
    public R verify(ABank4MetaVerifyRequest bankCard2MetaRequest) {
        return doVerifyBankCard2(bankCard2MetaRequest);
    }

    /**
     * 执行银行卡二要素核验业务逻辑
     * <p>
     * 核验结果码说明：
     * - 0：银行卡号+姓名信息一致（核验通过）
     * - 1：银行卡号+姓名信息不一致（核验失败）
     * - 2：查无此卡（卡状态异常或已注销）
     * </p>
     *
     * @param bankCard2MetaRequest 银行卡核验请求对象
     * @return R 返回核验结果，包含核验状态码和描述信息
     */
    public R doVerifyBankCard2(ABank4MetaVerifyRequest bankCard2MetaRequest) {
        BankCard2MetaResp bankCard2MetaResp = new BankCard2MetaResp();

        // 调用阿里云API进行银行卡二要素核验
        ApiR<TBankMetaVerifyResponse> aR = aBankMetaVerifyHandle.handle(bankCard2MetaRequest);

        // API调用成功
        if (aR.isSuccess()) {
            TBankMetaVerifyResponse bankMetaVerifyResponse = aR.getData();
            if (bankMetaVerifyResponse != null) {
                // 业务错误处理（如参数错误、服务异常等）
                if (bankMetaVerifyResponse.getCode() == 400) {
                    bankCard2MetaResp.setCheckResult(ApiConstants.FAILED);
                    bankCard2MetaResp.setDesc(bankMetaVerifyResponse.getMsg());
                    return R.ok().setData(bankCard2MetaResp);
                }

                // 业务成功处理，解析核验结果
                if (bankMetaVerifyResponse.getCode() == 200 && bankMetaVerifyResponse.getData() != null) {
                    int result = bankMetaVerifyResponse.getData().getResult();

                    // 核验通过：银行卡号和姓名信息一致
                    if (result == 0) {
                        bankCard2MetaResp.setCheckResult(ApiConstants.SUCCESS);
                        bankCard2MetaResp.setDesc(SUCCESS_MSG);
                    }
                    // 核验失败：银行卡号和姓名信息不一致
                    else if (result == 1) {
                        bankCard2MetaResp.setCheckResult(ApiConstants.FAILED);
                        bankCard2MetaResp.setDesc(FAILED_MSG);
                    }
                    // 其他情况：查无此卡或其他异常状态
                    else {
                        bankCard2MetaResp.setCheckResult(result + "");
                        bankCard2MetaResp.setDesc(bankMetaVerifyResponse.getData().getMsg());
                    }
                }
                return R.ok().setData(bankCard2MetaResp);
            }
        }

        // API调用失败，返回错误信息
        bankCard2MetaResp.setCheckResult(ApiConstants.FAILED);
        bankCard2MetaResp.setDesc(aR.getErrorMsg());

        return R.ok().setData(bankCard2MetaResp);
    }



}
