package com.heyu.api.controller.bankcard;


import com.heyu.api.alibaba.handle.common.text.ABank2MetaVerifyHandle;
import com.heyu.api.alibaba.handle.common.text.ABank3MetaVerifyHandle;
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.annotation.NotIntercept;
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.data.utils.StringUtils;
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;

/***
 * 银行卡 2/3/4 要素聚合校验控制器
 *
 * 根据请求参数完整度自动路由到不同的校验通道：
 *   - 4 要素：银行卡号 + 姓名 + 身份证号 + 手机号
 *   - 3 要素：银行卡号 + 姓名 + 身份证号
 *   - 2 要素：银行卡号 + 姓名
 *
 * 阿里云市场对接文档：
 * https://market.aliyun.com/apimarket/detail/cmapi00066584#sku=yuncode60584000011
 * https://marketnext.console.aliyun.com/bizlist
 */
@Slf4j
@RestController
@RequestMapping("/bank/card/234")
@NotIntercept
public class BankCard234MetaController extends BaseController {

    // 银行卡 2 要素校验处理器（银行卡号 + 姓名）
    @Autowired
    private ABank2MetaVerifyHandle bank2MetaVerifyHandle;

    // 银行卡 3 要素校验处理器（银行卡号 + 姓名 + 身份证号）
    @Autowired
    private ABank3MetaVerifyHandle bank3MetaVerifyHandle;

    // 银行卡 4 要素校验处理器（银行卡号 + 姓名 + 身份证号 + 手机号）
    @Autowired
    private ABank4MetaVerifyHandle bank4MetaVerifyHandle;


    // 校验通过返回的提示语
    public static final String SUCCESS_MSG = "信息匹配";
    // 校验不通过返回的提示语
    public static final String FAILED_MSG = "信息不匹配";


    // 测试地址示例：
    // http://localhost:8888/bank/card/234/verify?bankCard=6214855713516769&realName=瞿贻晓&idCardNumber=430529199209255030&mobile=18458195149
    // https://api.1024api.com/api-interface/bank/card/234/verify?bankCardNumber=6214855713516769&realName=瞿贻晓

    /**
     * 银行卡要素校验入口，按入参完整度自动选用 2/3/4 要素接口。
     *
     * @param bankCard4MetaRequest 银行卡校验请求参数（卡号、姓名、身份证号、手机号）
     * @return 统一响应 R，data 为 {@link BankCard2MetaResp}
     */
    @RequestMapping("/verify")
    @EbAuthentication(tencent = ApiConstants.TENCENT_AUTH)
    public R verify(ABank4MetaVerifyRequest bankCard4MetaRequest) {
        return doVerifyBankCard4(bankCard4MetaRequest);
    }


    /**
     * 实际执行银行卡要素校验的方法。
     * 根据非空字段数量决定调用 4 / 3 / 2 要素中的哪个处理器，并将上游响应统一转成 {@link BankCard2MetaResp}。
     *
     * @param bankCard4MetaRequest 银行卡校验请求参数
     * @return 统一响应 R
     */
    public R doVerifyBankCard4(ABank4MetaVerifyRequest bankCard4MetaRequest) {
        BankCard2MetaResp bankCard2MetaResp = new BankCard2MetaResp();
        // 上游校验结果：1 一致，0 不一致，2 查无（卡状态异常或已注销）
        ApiR<TBankMetaVerifyResponse> aR = null;

        // 4 要素齐全：调用 4 要素校验
        if (StringUtils.isNotEmpty(bankCard4MetaRequest.getBankCard())
                && StringUtils.isNotEmpty(bankCard4MetaRequest.getRealName())
                && StringUtils.isNotEmpty(bankCard4MetaRequest.getIdCardNumber())
                && StringUtils.isNotEmpty(bankCard4MetaRequest.getMobile())
        ) {
            aR = bank4MetaVerifyHandle.handle(bankCard4MetaRequest);
        } else if (StringUtils.isNotEmpty(bankCard4MetaRequest.getBankCard())
                && StringUtils.isNotEmpty(bankCard4MetaRequest.getRealName())
                && StringUtils.isNotEmpty(bankCard4MetaRequest.getIdCardNumber())
        ) {
            // 缺手机号但其它三项齐全：降级到 3 要素校验
            aR = bank3MetaVerifyHandle.handle(bankCard4MetaRequest);

        } else if (StringUtils.isNotEmpty(bankCard4MetaRequest.getBankCard())
                && StringUtils.isNotEmpty(bankCard4MetaRequest.getRealName())
        ) {
            // 只有卡号 + 姓名：走 2 要素校验
            aR = bank2MetaVerifyHandle.handle(bankCard4MetaRequest);
        } else {
            // 连卡号 + 姓名都凑不齐，直接拒绝
            return R.error("至少 银行卡号 + 姓名 不能为空");
        }


        // 上游调用成功，解析业务结果
        if (aR.isSuccess()) {
            TBankMetaVerifyResponse bankMetaVerifyResponse = aR.getData();
            if (bankMetaVerifyResponse != null) {
                // 上游业务码 400：业务失败，原样回传错误信息
                if (bankMetaVerifyResponse.getCode() == 400) {
                    bankCard2MetaResp.setCheckResult(ApiConstants.FAILED);
                    bankCard2MetaResp.setDesc(bankMetaVerifyResponse.getMsg());
                    return R.ok().setData(bankCard2MetaResp);
                }

                // 上游业务码 200 且 data 非空：按 result 翻译校验结果
                if (bankMetaVerifyResponse.getCode() == 200 && bankMetaVerifyResponse.getData() != null) {
                    int result = bankMetaVerifyResponse.getData().getResult();
                    if (result == 0) {
                        // result=0 表示一致
                        bankCard2MetaResp.setCheckResult(ApiConstants.SUCCESS);
                        bankCard2MetaResp.setDesc(SUCCESS_MSG);
                    } else if (result == 1) {
                        // result=1 表示不一致
                        bankCard2MetaResp.setCheckResult(ApiConstants.FAILED);
                        bankCard2MetaResp.setDesc(FAILED_MSG);
                    } else {
                        // 其它（如 2：查无），原样透传上游 msg
                        bankCard2MetaResp.setCheckResult(result + "");
                        bankCard2MetaResp.setDesc(bankMetaVerifyResponse.getData().getMsg());
                    }
                }
                return R.ok().setData(bankCard2MetaResp);
            }
        }

        // 上游调用失败：标记失败并回传错误信息
        bankCard2MetaResp.setCheckResult(ApiConstants.FAILED);
        bankCard2MetaResp.setDesc(aR.getErrorMsg());

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

    }


}
