package com.heyu.api.controller.certificate;


import com.heyu.api.baidu.handle.certificate.BBirthCertificateHandle;
import com.heyu.api.baidu.request.certificate.BBirthCertificateRequest;
import com.heyu.api.baidu.response.certificate.BBirthCertificateResp;
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.R;
import com.heyu.api.request.certificate.BirthCertificateReq;
import com.heyu.api.resp.certificate.BirthCertificateResp;
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://console.bce.baidu.com/support/?_=1740219852952&timestamp=1740309618781#/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%2Fbirth_certificate&method=post
 * <p>
 * <p>
 * 出生医学证明识别
 *
 *接口描述
 * 支持对出生医学证明的23个关键字段进行结构化识别，包括新生儿姓名、性别、出生时间、父亲姓名、母亲姓名、出生证编号等。
 *
 */
@Slf4j
@RestController
@RequestMapping("/birth")
@NotIntercept
public class BirthCertificateController extends BaseController {


    /**
     * 百度云出生医学证明识别处理器，封装了对百度 OCR 接口的调用细节
     */
    @Autowired
    private BBirthCertificateHandle birthCertificateHandle;

    /**
     * 出生医学证明识别接口
     * <p>
     * 接收前端传入的出生医学证明图片（支持 Base64 与图片 URL 两种方式），
     * 通过百度云 OCR 服务对证件上的 23 个关键字段进行结构化识别，
     * 并将原始百度响应映射为业务统一的 {@link BirthCertificateResp} 返回给前端。
     * <p>
     * 使用 {@link CacheResult} 注解对相同入参的请求结果进行缓存，避免重复调用百度云接口浪费配额。
     *
     * @param request 出生医学证明识别请求参数，包含图片的 Base64 或 URL
     * @return 识别成功时返回包含 {@link BirthCertificateResp} 的成功响应；失败时返回带错误信息的错误响应
     */
    @RequestMapping("/certificate")
    @CacheResult
    public R recognize(BirthCertificateReq request) {
        // 构建用于承载识别结果的业务响应对象
        BirthCertificateResp resp = new BirthCertificateResp();

        // 将业务请求参数转换为百度云 OCR 接口所需的请求对象
        BBirthCertificateRequest birthCertificateRequest = new BBirthCertificateRequest();
        birthCertificateRequest.setImageBase64(request.getImageBase64());
        birthCertificateRequest.setImageUrl(request.getImageUrl());

        // 调用百度云 OCR 出生医学证明识别接口
        ApiR<BBirthCertificateResp> bR = birthCertificateHandle.handle(birthCertificateRequest);
        if(bR.isSuccess()){
            // 取出百度云返回的识别结果，并将其中的字段逐项映射到业务响应对象中
            BBirthCertificateResp bBirthCertificateResp =   bR.getData();
            BBirthCertificateResp.WordsResultDTO wordsResultDTO = bBirthCertificateResp.getWordsResult();
            // 出生省份
            resp.setBirthProvince(wordsResultDTO.getBirthProvince().getWords());
            // 出生体重
            resp.setBirthWeight(wordsResultDTO.getBirthWeight().getWords());
            // 母亲国籍
            resp.setMotherNationality(wordsResultDTO.getMotherNationality().getWords());
            // 父亲住址
            resp.setFatherAddress(wordsResultDTO.getFatherAddress().getWords());
            // 母亲民族
            resp.setMotherEthnic(wordsResultDTO.getMotherEthnic().getWords());
            // 母亲住址
            resp.setMotherAddress(wordsResultDTO.getMotherAddress().getWords());
            // 出生证编号
            resp.setCode(wordsResultDTO.getCode().getWords());
            // 新生儿性别
            resp.setBabySex(wordsResultDTO.getBabySex().getWords());
            // 出生城市
            resp.setBirthCity(wordsResultDTO.getBirthCity().getWords());
            // 新生儿出生日期
            resp.setBabyBirthday(wordsResultDTO.getBabyBirthday().getWords());
            // 新生儿姓名
            resp.setBabyName(wordsResultDTO.getBabyName().getWords());
            // 父亲年龄
            resp.setFatherAge(wordsResultDTO.getFatherAge().getWords());
            // 父亲民族
            resp.setFatherEthnic(wordsResultDTO.getFatherEthnic().getWords());
            // 母亲姓名
            resp.setMotherName(wordsResultDTO.getMotherName().getWords());
            // 母亲身份证号
            resp.setMotherIdNumber(wordsResultDTO.getMotherID().getWords());
            // 出生身长
            resp.setBirthLength(wordsResultDTO.getBirthLength().getWords());
            // 孕周
            resp.setGestationalAge(wordsResultDTO.getGestationalAge().getWords());
            // 出生城市（与上方重复赋值，保持原有逻辑不变）
            resp.setBirthCity(wordsResultDTO.getBirthCity().getWords());
            // 母亲年龄
            resp.setMotherAge(wordsResultDTO.getMotherAge().getWords());
            // 接生医院
            resp.setHospital(wordsResultDTO.getHospital().getWords());
            // 父亲国籍
            resp.setFatherNationality(wordsResultDTO.getFatherNationality().getWords());
            // 父亲身份证号
            resp.setFatherIdNumber(wordsResultDTO.getFatherID().getWords());
            // 父亲姓名
            resp.setFatherName(wordsResultDTO.getFatherName().getWords());
            return R.ok().setData(resp);
        }
        // 识别失败，返回携带百度云错误信息的错误响应
        return R.error(bR.getErrorMsg());

    }


}
