package com.heyu.api.controller.certificate;


import com.heyu.api.baidu.handle.certificate.BAccountOpeningHandle;
import com.heyu.api.baidu.request.certificate.BAccountOpeningRequest;
import com.heyu.api.data.annotation.CacheResult;
import com.heyu.api.data.annotation.NotIntercept;
import com.heyu.api.data.utils.ApiR;
import com.heyu.api.data.utils.MapUtils;
import com.heyu.api.data.utils.R;
import com.heyu.api.resp.certificate.AccountOpeningResp;
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;

import java.util.Map;


/**
 * https://console.bce.baidu.com/support/?_=1740219852952&timestamp=1740322721909#/api?product=AI&project=%E6%96%87%E5%AD%97%E8%AF%86%E5%88%AB&parent=%E5%8D%A1%E8%AF%81OCR&api=rest%2F2.0%2Focr%2Fv1%2Faccount_opening&method=post
 * <p>
 * <p>
 * 开户许可证识别
 */


@Slf4j
@RestController
@RequestMapping("/account")
@NotIntercept
public class AccountOpeningController {


    /**
     * 百度云开户许可证识别处理器，负责调用百度 OCR 接口并返回原始识别结果
     */
    @Autowired
    private BAccountOpeningHandle bAccountOpeningHandle;


    /**
     * 开户许可证识别接口
     * <p>
     * 接收上传的开户许可证图片，调用百度云 OCR 服务进行识别，
     * 并将识别结果中的关键字段（账号、公司名称、核准号、法人、编号、开户银行）
     * 解析后封装到 {@link AccountOpeningResp} 中返回给前端。
     * <p>
     * 使用 {@link CacheResult} 注解对相同入参的请求结果进行缓存，避免重复调用百度云接口浪费配额。
     *
     * @param request 开户许可证识别请求参数，包含待识别的图片信息
     * @return 识别成功时返回包含 {@link AccountOpeningResp} 的成功响应；识别失败时返回错误响应
     */
    @RequestMapping("/opening")
    @CacheResult
    public R recognize(BAccountOpeningRequest request) {
        // 构建用于承载识别结果的响应对象
        AccountOpeningResp accountOpeningResp = new AccountOpeningResp();
        // 调用百度云 OCR 开户许可证识别接口，获取原始识别结果
        ApiR<Map> bR = bAccountOpeningHandle.handle(request);
        if (bR.isSuccess()) {
            // 百度云返回的 JSON 结构示例：words_result.{字段名}.word.[0]
            Map<String, Object> data = bR.getData();
            // 账号
            accountOpeningResp.setAccount(MapUtils.getByExpr(data, "words_result.账号.word.[0]"));
            // 公司名称
            accountOpeningResp.setCompanyName(MapUtils.getByExpr(data, "words_result.公司名称.word.[0]"));
            // 核准号
            accountOpeningResp.setCheckNumber(MapUtils.getByExpr(data, "words_result.核准号.word.[0]"));
            // 法人
            accountOpeningResp.setLegalPerson(MapUtils.getByExpr(data, "words_result.法人.word.[0]"));
            // 编号
            accountOpeningResp.setSerialNumber(MapUtils.getByExpr(data, "words_result.编号.word.[0]"));
            // 开户银行
            accountOpeningResp.setOpenAccountBank(MapUtils.getByExpr(data, "words_result.开户银行.word.[0]"));
            return R.ok().setData(accountOpeningResp);
        }
        // 识别失败，返回统一错误响应
        return R.error();
    }
}
