package com.heyu.api.controller.bankcard;


import com.heyu.api.alibaba.handle.common.text.ABank4MetaVerifyHandle;
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://market.aliyun.com/apimarket/detail/cmapi00066584#sku=yuncode60584000011
 *
 * 核验要素：
 * - 二要素：银行卡号 + 姓名
 * - 三要素：银行卡号 + 姓名 + 身份证号
 * - 四要素：银行卡号 + 姓名 + 身份证号 + 手机号
 *
 * 安全性：
 * 四要素核验相比二、三要素提供更高级别的身份验证，适用于金融支付、实名认证等高安全场景
 *
 * @author 系统生成
 * @version 1.0
 */
/**
 * 银行卡四要素核验控制器
 * <p>
 * 继承BaseController，提供银行卡四要素核验的HTTP接口
 * 主要用于验证用户输入的银行卡号、姓名、身份证号和手机号是否完全匹配
 * </p>
 */
@Slf4j
@RestController
@RequestMapping("/bank/card/4")
public class BankCard4MetaController extends BaseController {

    /**
     * 阿里云银行卡四要素核验处理器
     */
    @Autowired
    private ABank4MetaVerifyHandle bank4MetaVerifyHandle;

    /**
     * 四要素核验成功提示信息
     */
    public static final String SUCCESS_MSG = "银⾏卡号+姓名+身份证号+手机号信息匹配";

    /**
     * 四要素核验失败提示信息
     */
    public static final String FAILED_MSG = "银⾏卡号+姓名+身份证号码+手机号信息不匹配";

    /**
     * 银行卡四要素核验接口
     * <p>
     * 测试地址：
     * - 本地：http://localhost:8888/bank/card/4/verify?bankCard=6214855713516769&realName=瞿贻晓&idCardNumber=430529199209255030&mobile=18458195149
     * - 生产：https://api.1024api.com/api-interface/bank/card/4/verify?bankCard=6214855713516761&realName=瞿贻晓&idCardNumber=430529199209255030&mobile=18458195149
     * </p>
     *
     * @param bankCard4MetaRequest 银行卡四要素核验请求对象，包含：
     *                             - bankCard: 银行卡号
     *                             - realName: 真实姓名
     *                             - idCardNumber: 身份证号
     *                             - mobile: 手机号
     * @return R 返回核验结果，包含核验状态和描述信息
     */
    @RequestMapping("/verify")
    @EbAuthentication(tencent = ApiConstants.TENCENT_AUTH)
    public R verify(ABank4MetaVerifyRequest bankCard4MetaRequest) {
        return doVerifyBankCard4(bankCard4MetaRequest);
    }


    /**
     * 执行银行卡四要素核验业务逻辑
     * <p>
     * 核验结果码说明：
     * - 0：银行卡号+姓名+身份证号+手机号信息一致（核验通过）
     * - 1：银行卡号+姓名+身份证号+手机号信息不一致（核验失败）
     * - 2：查无此卡（卡状态异常或已注销）
     * </p>
     * <p>
     * 四要素核验相比二、三要素核验提供更高级别的安全保障，
     * 适用于金融支付、大额转账、实名认证等对安全性要求较高的场景
     * </p>
     *
     * @param bankCard4MetaRequest 银行卡四要素核验请求对象
     * @return R 返回核验结果，包含核验状态码和描述信息
     */
    public R doVerifyBankCard4(ABank4MetaVerifyRequest bankCard4MetaRequest) {
        BankCard2MetaResp bankCard2MetaResp = new BankCard2MetaResp();

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

        // 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);

    }


}
