package com.heyu.api.controller.certificate;


import com.heyu.api.baidu.handle.certificate.BBouseholdRegisterHandle;
import com.heyu.api.baidu.request.certificate.BBouseholdRegisterRequest;
import com.heyu.api.baidu.response.certificate.BBouseholdRegisterResp;
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.BouseholdRegisterReq;
import com.heyu.api.resp.certificate.BouseholdRegisterResp;
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=1740309163756#/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%2Fhousehold_register&method=post
 * <p>
 * <p>
 * 户口本识别
 * <p>
 * 接口描述
 * 支持对户口本内常住人口登记卡的全部 22 个字段，包括户号、姓名、与户主关系、性别、出生地、民族、出生日期、身份证号、本市县其他住址、曾用名、籍贯、宗教信仰、身高、血型、文化程度、婚姻状况、兵役状况、服务处所、职业、何时由何地迁往本市、何时由何地迁往本址、登记日期。
 * <p>
 * 支持对户口本内户主页的5个字段进行结构化识别，包括户别、户主姓名、户号、住址、户主页时间。
 */
@Slf4j
@RestController
@RequestMapping("/bousehold")
@NotIntercept
public class BouseholdRegisterController {


    /**
     * 百度云户口本识别处理器，封装了对百度 OCR 户口本接口的调用细节
     */
    @Autowired
    private BBouseholdRegisterHandle bBouseholdRegisterHandle;


    /**
     * 户口本识别接口
     * <p>
     * 接收前端传入的户口本图片（支持 Base64 与图片 URL 两种方式）以及户口本面标识，
     * 调用百度云 OCR 服务对户口本进行结构化识别：
     * <ul>
     *     <li>常住人口登记卡：22 个字段（户号、姓名、与户主关系、性别、出生地、民族、出生日期、身份证号等）</li>
     *     <li>户主页：5 个字段（户别、户主姓名、户号、住址、户主页时间）</li>
     * </ul>
     * 并将识别结果映射为业务统一的 {@link BouseholdRegisterResp} 返回给前端。
     * <p>
     * 使用 {@link CacheResult} 注解对相同入参的请求结果进行缓存，避免重复调用百度云接口浪费配额。
     *
     * @param request 户口本识别请求参数，包含图片的 Base64 或 URL，以及户口本面标识
     * @return 识别成功时返回包含 {@link BouseholdRegisterResp} 的成功响应；失败时返回带错误信息的错误响应
     */
    @RequestMapping("/recognize")
    @CacheResult
    public R recognize(BouseholdRegisterReq request) {

        // 构建用于承载识别结果的业务响应对象
        BouseholdRegisterResp resp = new BouseholdRegisterResp();
        // 将业务请求参数转换为百度云 OCR 接口所需的请求对象
        BBouseholdRegisterRequest bBouseholdRegisterRequest = new BBouseholdRegisterRequest();
        // 户口本面：常住人口登记卡 / 户主页
        bBouseholdRegisterRequest.setHouseholdRegisterSide(request.getHouseholdRegisterSide());
        bBouseholdRegisterRequest.setImageBase64(request.getImageBase64());
        bBouseholdRegisterRequest.setImageUrl(request.getImageUrl());

        // 调用百度云 OCR 户口本识别接口
        ApiR<BBouseholdRegisterResp> bR = bBouseholdRegisterHandle.handle(bBouseholdRegisterRequest);
        if (bR.isSuccess()) {

            // 取出百度云返回的识别结果
            BBouseholdRegisterResp bBouseholdRegisterResp = bR.getData();

            // 字段识别结果集合，将其中的字段逐项映射到业务响应对象中
            BBouseholdRegisterResp.WordsResultDTO wordsResultDTO = bBouseholdRegisterResp.getWordsResult();

            // 民族
            resp.setNation(wordsResultDTO.getNation().getWords());
            // 性别
            resp.setSex(wordsResultDTO.getSex().getWords());
            // 出生日期
            resp.setBirthday(wordsResultDTO.getBirthday().getWords());
            // 登记日期
            resp.setDate(wordsResultDTO.getDate().getWords());
            // 出生地
            resp.setBirthAddress(wordsResultDTO.getBirthAddress().getWords());
            // 姓名
            resp.setName(wordsResultDTO.getName().getWords());
            // 曾用名
            resp.setFormerName(wordsResultDTO.getFormerName().getWords());
            // 户号
            resp.setHouseholdNum(wordsResultDTO.getHouseholdNum().getWords());
            // 何时由何地迁往本市
            resp.setWWToCity(wordsResultDTO.getWWToCity().getWords());
            // 何时由何地迁往本址
            resp.setWWHere(wordsResultDTO.getWWHere().getWords());
            // 身份证号
            resp.setCardNo(wordsResultDTO.getCardNo().getWords());
            // 文化程度
            resp.setEducation(wordsResultDTO.getEducation().getWords());
            // 与户主关系
            resp.setRelationship(wordsResultDTO.getRelationship().getWords());
            // 身高
            resp.setHeight(wordsResultDTO.getHeight().getWords());
            // 职业
            resp.setCareer(wordsResultDTO.getCareer().getWords());
            // 服务处所
            resp.setWorkAddress(wordsResultDTO.getWorkAddress().getWords());
            // 籍贯
            resp.setHometown(wordsResultDTO.getHometown().getWords());
            // 本市县其他住址
            resp.setOtherAddress(wordsResultDTO.getOtherAddress().getWords());
            // 本市县其他住址（与上方重复赋值，保持原有逻辑不变）
            resp.setOtherAddress(wordsResultDTO.getOtherAddress().getWords());
            // 宗教信仰
            resp.setBelief(wordsResultDTO.getBelief().getWords());
            // 血型
            resp.setBloodType(wordsResultDTO.getBloodType().getWords());
            // 婚姻状况
            resp.setMaritalStatus(wordsResultDTO.getMaritalStatus().getWords());
            // 兵役状况
            resp.setVeteranStatus(wordsResultDTO.getVeteranStatus().getWords());

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

        }

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