package com.heyu.api.controller.certificate;


import com.heyu.api.baidu.handle.certificate.BDivorceCertificateHandle;
import com.heyu.api.baidu.request.certificate.BDivorceCertificateRequest;
import com.heyu.api.controller.BaseController;
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.DivorceCertificateResp;
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=1742570382939#/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%2Fdivorce_certificate&method=post
 *
 *
 *
 *
 * 接口描述
 * 支持对离婚证进行结构化识别，包括姓名_男、身份证件号_男、出生日期_男、国籍_男、性别_男、姓名_女、身份证件号_女、出生日期_女、国籍_女、性别_女、离婚证字号、持证人、备注、登记日期，全部 14 个字段。
 *
 *
 *
 *
 *
 */
@Slf4j
@RestController
@RequestMapping("/divorceCertificate")
@NotIntercept
public class DivorceCertificateController extends BaseController {


    // 注入百度云离婚证 OCR 识别处理器，负责调用百度云接口完成 OCR 识别
    @Autowired
    private BDivorceCertificateHandle bDivorceCertificateHandle;


    /**
     * 离婚证识别接口
     * 通过百度云 OCR 对离婚证图片进行结构化识别，返回 14 个字段：
     * 男方与女方的姓名、身份证件号、出生日期、国籍、性别，以及离婚证字号、持证人、备注、登记日期。
     * @CacheResult 注解用于对识别结果进行缓存，避免重复识别相同图片，节省调用成本。
     */
    @RequestMapping("/recognize")
    @CacheResult
    public R recognize(BDivorceCertificateRequest request) {
        // 构建响应对象，用于承载识别后的结构化数据
        DivorceCertificateResp resp = new DivorceCertificateResp();

        // 调用百度云离婚证识别接口，获取原始 OCR 返回数据
        ApiR<Map> bR = bDivorceCertificateHandle.handle(request);
        if (bR.isSuccess()) {
            // 取出百度云返回的 words_result 数据，按字段路径解析填充到响应对象中
            Map<String, Object> data = bR.getData();
            // 男方姓名及识别置信度
            resp.setManRealName(MapUtils.getByExpr(data, "words_result.姓名_男.word"));
            resp.setManRealNameConfidence(MapUtils.getByExpr(data, "words_result.姓名_男.probability"));

            // 男方身份证件号及识别置信度
            resp.setManIdCard(MapUtils.getByExpr(data, "words_result.身份证件号_男.word"));
            resp.setManIdCardConfidence(MapUtils.getByExpr(data, "words_result.身份证件号_男.probability"));

            // 男方出生日期及识别置信度
            resp.setManBirthday(MapUtils.getByExpr(data, "words_result.出生日期_男.word"));
            resp.setManBirthdayConfidence(MapUtils.getByExpr(data, "words_result.出生日期_男.probability"));

            // 男方国籍及识别置信度
            resp.setManNationality(MapUtils.getByExpr(data, "words_result.国籍_男.word"));
            resp.setManNationalityConfidence(MapUtils.getByExpr(data, "words_result.国籍_男.probability"));

            // 男方性别及识别置信度
            resp.setManGender(MapUtils.getByExpr(data, "words_result.性别_男.word"));
            resp.setManGenderConfidence(MapUtils.getByExpr(data, "words_result.性别_男.probability"));

            // 女方姓名及识别置信度
            resp.setWomanRealName(MapUtils.getByExpr(data, "words_result.姓名_女.word"));
            resp.setWomanRealNameConfidence(MapUtils.getByExpr(data, "words_result.姓名_女.probability"));

            // 女方身份证件号及识别置信度
            resp.setWomanIdCard(MapUtils.getByExpr(data, "words_result.身份证件号_女.word"));
            resp.setWomanIdCardConfidence(MapUtils.getByExpr(data, "words_result.身份证件号_女.probability"));

            // 女方出生日期及识别置信度
            resp.setWomanBirthday(MapUtils.getByExpr(data, "words_result.出生日期_女.word"));
            resp.setWomanBirthdayConfidence(MapUtils.getByExpr(data, "words_result.出生日期_女.probability"));

            // 女方国籍及识别置信度
            resp.setWomanNationality(MapUtils.getByExpr(data, "words_result.国籍_女.word"));
            resp.setWomanNationalityConfidence(MapUtils.getByExpr(data, "words_result.国籍_女.probability"));

            // 女方性别及识别置信度
            resp.setWomanGender(MapUtils.getByExpr(data, "words_result.性别_女.word"));
            resp.setWomanGenderConfidence(MapUtils.getByExpr(data, "words_result.性别_女.probability"));

            // 登记日期及识别置信度
            resp.setRegisterDate(MapUtils.getByExpr(data, "words_result.登记日期.word"));
            resp.setRegisterDateConfidence(MapUtils.getByExpr(data, "words_result.登记日期.probability"));

            // 离婚证字号及识别置信度
            resp.setDivorceNumber(MapUtils.getByExpr(data, "words_result.离婚证字号.word"));
            resp.setDivorceNumberConfidence(MapUtils.getByExpr(data, "words_result.离婚证字号.probability"));

            // 持证人及识别置信度
            resp.setHolderCertified(MapUtils.getByExpr(data, "words_result.持证人.word"));
            resp.setHolderCertifiedConfidence(MapUtils.getByExpr(data, "words_result.持证人.probability"));

            // 备注及识别置信度
            resp.setRemark(MapUtils.getByExpr(data, "words_result.备注.word"));
            resp.setRemarkConfidence(MapUtils.getByExpr(data, "words_result.备注.probability"));

            // 识别成功，返回封装后的结构化数据
            return R.ok().setData(resp);
        }

        // 识别失败，返回百度云接口的错误信息
        return R.error(bR.getErrorMsg());
    }

}
