package com.heyu.api.controller.ocr;


import com.heyu.api.alibaba.request.common.text.HighPrecisionOcrRequest;
import com.heyu.api.baidu.handle.common.BDocAnalysisOfficeHandle;
import com.heyu.api.baidu.request.common.BDocAnalysisOfficeRequest;
import com.heyu.api.baidu.response.common.BDocAnalysisOfficeResp;
import com.heyu.api.data.annotation.EbAuthentication;
import com.heyu.api.data.constants.ApiConstants;
import com.heyu.api.data.utils.ApiR;
import com.heyu.api.data.utils.R;
import com.heyu.api.data.utils.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 高精度文字识别控制器
 * <p>
 * 基于百度文档分析 Office API，提供高精度的文字识别能力。
 * 相比通用 OCR，本接口在复杂场景下识别精度更高，支持返回文字行级别的概率信息。
 * </p>
 * <p>
 * 核心特性：
 * <ul>
 *   <li>高精度识别：适合复杂背景、低质量图片</li>
 *   <li>多格式支持：图片（Base64/URL）、PDF、OFD</li>
 *   <li>置信度返回：lineProbability=true 时返回每行文字的识别概率</li>
 *   <li>文档分析：支持 Office 文档的文字提取</li>
 * </ul>
 * </p>
 * <p>
 * 适用场景：
 * <ul>
 *   <li>复杂票据：手写、印章、表格混合的票据</li>
 *   <li>低质量图片：模糊、倾斜、光照不均的图片</li>
 *   <li>多语言文档：中英文混合的文档识别</li>
 *   <li>合同/证件：需要高精度的正式文件</li>
 * </ul>
 * </p>
 * <p>
 * 接口路径：/high/precision/orc/recognize
 * </p>
 *
 * @author heyu
 * @since 1.0.0
 */
@Slf4j
@RestController
@RequestMapping("/high/precision/orc/")
public class HighPrecisionOcrController {


    @Autowired
    private BDocAnalysisOfficeHandle bDocAnalysisOfficeHandle;


    /**
     * 高精度文字识别接口
     * <p>
     * 使用百度文档分析 Office API 进行高精度 OCR 识别，相比通用 OCR 提供更高的识别准确率。
     * 自动启用 lineProbability 返回每行文字的置信度，便于后续质量评估和过滤。
     * </p>
     * <p>
     * 本地测试：http://localhost:8888/high/precision/orc/recognize
     * </p>
     * <p>
     * 示例图片：https://heyuoss.oss-cn-shanghai.aliyuncs.com/prd/testxxx.jpg
     * </p>
     *
     * @param generalBasicOcrRequest OCR 识别请求参数，包含以下字段（任选其一）：
     *                               - imageBase64：图片 Base64 编码
     *                               - imageUrl：图片 URL
     *                               - pdfFile：PDF 文件 Base64 编码
     *                               - ofdFile：OFD 文件 Base64 编码
     *                               - pdfFileNum/ofdFileNum：指定页码（可选）
     * @return 高精度 OCR 识别结果，包含文字内容、坐标、置信度等信息
     */
    //  http://localhost:8888/high/precision/orc/recognize?imageBase64=3232
    // https://heyuoss.oss-cn-shanghai.aliyuncs.com/prd/testxxx.jpg
    @EbAuthentication(tencent = ApiConstants.TENCENT_AUTH)
    @RequestMapping("/recognize")
    public R recognize(@RequestBody HighPrecisionOcrRequest generalBasicOcrRequest) throws Exception {

        if(StringUtils.isNotBlank(generalBasicOcrRequest.getImageBase64())){
            String imageBase64 = StringUtils.encodeURIComponent(generalBasicOcrRequest.getImageBase64());
            generalBasicOcrRequest.setImageBase64(imageBase64);
        }


        if(StringUtils.isNotBlank(generalBasicOcrRequest.getPdfFile())){
            String pdfFile = StringUtils.encodeURIComponent(generalBasicOcrRequest.getPdfFile());
            generalBasicOcrRequest.setPdfFile(pdfFile);
        }

        if(StringUtils.isNotBlank(generalBasicOcrRequest.getOfdFile())){
            String ofdFile = StringUtils.encodeURIComponent(generalBasicOcrRequest.getOfdFile());
            generalBasicOcrRequest.setOfdFile(ofdFile);
        }


        BDocAnalysisOfficeRequest bGeneralBasicRequest = new BDocAnalysisOfficeRequest();
        bGeneralBasicRequest.setImageBase64(generalBasicOcrRequest.getImageBase64());
        bGeneralBasicRequest.setImageUrl(generalBasicOcrRequest.getImageUrl());
        bGeneralBasicRequest.setPdfFile(generalBasicOcrRequest.getPdfFile());
        bGeneralBasicRequest.setPdfFileNum(generalBasicOcrRequest.getPdfFileNum());
        bGeneralBasicRequest.setOfd_file(generalBasicOcrRequest.getOfdFile());
        bGeneralBasicRequest.setOfd_file_num(generalBasicOcrRequest.getOfdFileNum());
        bGeneralBasicRequest.setLineProbability("true");

        ApiR<BDocAnalysisOfficeResp> aR = bDocAnalysisOfficeHandle.handle(bGeneralBasicRequest);
        if(aR.isSuccess()){
            return R.ok().setData(aR.getData());
        }
        return R.error(aR.getErrorMsg());
    }


}
