package com.heyu.api.controller.medical;

import com.heyu.api.baidu.handle.medical.BHealthReportHandle;
import com.heyu.api.baidu.request.medical.BHealthReportRequest;
import com.heyu.api.baidu.response.medical.BHealthReportResp;
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.resp.medical.HealthReportResp;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;




/**
 * 医疗诊断报告单识别控制器
 * <p>
 * 基于百度 OCR API，对全国各地各医院的医疗诊断报告单进行结构化识别。
 * 支持提取报告中的关键医疗信息，便于医疗数据数字化和归档管理。
 * </p>
 * <p>
 * 识别字段包括（14 个关键字段）：
 * <ul>
 *   <li>基本信息：医院名称、姓名、性别、年龄、科室</li>
 *   <li>报告信息：报告名称、报告日期</li>
 *   <li>检查信息：检查部位、检查方法</li>
 *   <li>诊断信息：临床诊断、检查所见、检查提示、建议</li>
 *   <li>其他信息：肉眼可见</li>
 * </ul>
 * </p>
 * <p>
 * 注意事项：
 * <ul>
 *   <li>支持全国各地各医院的诊断报告单</li>
 *   <li>需保证报告单清晰、完整、无遮挡</li>
 *   <li>支持图片 URL 或 Base64 编码输入</li>
 *   <li>启用结果缓存以提升响应速度</li>
 * </ul>
 * </p>
 * <p>
 * 适用场景：
 * <ul>
 *   <li>医疗信息化：诊断报告数字化归档</li>
 *   <li>远程医疗：患者报告信息快速录入</li>
 *   <li>健康管理：个人健康档案建立</li>
 *   <li>保险理赔：医疗证明材料信息提取</li>
 * </ul>
 * </p>
 * <p>
 * 接口路径：/health/report
 * </p>
 *
 * @author heyu
 * @since 1.0.0
 */
@Slf4j
@RestController
@RequestMapping("/health")
@NotIntercept
public class HealthReportController extends BaseController {


    @Autowired
    private BHealthReportHandle bHealthReportHandle;


    /**
     * 医疗诊断报告单识别接口
     * <p>
     * 接收医疗诊断报告单图片（URL 或 Base64），调用百度 OCR API 进行结构化识别。
     * 支持全国各地各医院的诊断报告单，提取 14 个关键字段信息。
     * </p>
     *
     * @param req 医疗报告识别请求参数，包含以下字段（任选其一）：
     *            - imageBase64：图片 Base64 编码
     *            - imageUrl：图片 URL
     * @return 医疗报告识别结果列表，每个元素包含字段名称（wordName）和对应值（word）
     */
    @RequestMapping("/report")
    @CacheResult
    public R report(BHealthReportRequest req) {
        List<HealthReportResp> respList = new ArrayList<>();
        ApiR<BHealthReportResp> bR = bHealthReportHandle.handle(req);
        if (bR.isSuccess()) {
            BHealthReportResp bMedicalReportDetectionResp = bR.getData();
            if (CollectionUtils.isNotEmpty(bMedicalReportDetectionResp.getWordsResult())) {
                for (BHealthReportResp.WordsResultDTO wordsResultDTO : bMedicalReportDetectionResp.getWordsResult()) {
                    HealthReportResp healthReportResp = new HealthReportResp();

                    healthReportResp.setWord(wordsResultDTO.getWord());
                    healthReportResp.setWordName(wordsResultDTO.getWordName());
                    respList.add(healthReportResp);
                }
            }
            return R.ok().setData(respList);
        }
        return R.error(bR.getErrorMsg());

    }


}
