package com.heyu.api.controller.ocr;


import com.heyu.api.alibaba.request.common.text.GeneralBasicOcrRequest;
import com.heyu.api.baidu.handle.common.BGeneralBasicHandle;
import com.heyu.api.baidu.request.common.BGeneralBasicRequest;
import com.heyu.api.baidu.response.common.BGeneralBasicResp;
import com.heyu.api.controller.BaseController;
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>
 * 基于百度 OCR API，提供多场景文字识别能力，支持图片、PDF、OFD 等多种格式输入。
 * 返回百度原始响应，包含 words_result、words_result_num、log_id 等完整字段。
 * </p>
 * <p>
 * 支持的输入格式：
 * <ul>
 *   <li>图片：Base64 编码或 URL</li>
 *   <li>PDF 文件：Base64 编码，可指定页码</li>
 *   <li>OFD 文件：Base64 编码，可指定页码</li>
 * </ul>
 * </p>
 * <p>
 * 适用场景：
 * <ul>
 *   <li>证件识别：身份证、驾驶证、行驶证等</li>
 *   <li>票据识别：发票、收据、银行单据等</li>
 *   <li>文档数字化：印刷体文档、书籍、合同等</li>
 *   <li>卡片识别：名片、银行卡等</li>
 * </ul>
 * </p>
 * <p>
 * 接口路径：/general/text/orc/recognize
 * </p>
 *
 * @author heyu
 * @since 1.0.0
 */
@Slf4j
@RestController
@RequestMapping("/general/text/orc/")
public class GeneralBasicOcrController extends BaseController {


    @Autowired
    private BGeneralBasicHandle bGeneralBasicHandle;


    /**
     * 通用文字识别接口（备用路径）
     * <p>
     * 内部转发到 recognize 方法处理
     * </p>
     *
     * @param generalBasicOcrRequest OCR 识别请求参数
     * @return OCR 识别结果
     */
    @EbAuthentication(tencent = ApiConstants.TENCENT_AUTH)
    @RequestMapping("/recognize1")
    public R recognize1(@RequestBody GeneralBasicOcrRequest generalBasicOcrRequest) throws Exception {
        return recognize(generalBasicOcrRequest);
    }

    /**
     * 通用文字识别接口（主路径）
     * <p>
     * 支持图片（Base64/URL）、PDF、OFD 格式的文字识别。
     * 对 Base64 参数进行 URL 编码处理，确保传输安全。
     * </p>
     * <p>
     * 本地测试：http://localhost:8888/general/text/orc/recognize
     * </p>
     *
     * @param generalBasicOcrRequest OCR 识别请求参数，包含以下字段（任选其一）：
     *                               - imageBase64：图片 Base64 编码
     *                               - imageUrl：图片 URL
     *                               - pdfFile：PDF 文件 Base64 编码
     *                               - ofdFile：OFD 文件 Base64 编码
     * @return OCR 识别结果，包含文字内容、置信度、坐标等信息
     */
    // http://localhost:8888/general/text/orc/recognize?imageBase64=3232
    @EbAuthentication(tencent = ApiConstants.TENCENT_AUTH)
    @RequestMapping("/recognize")
    public R recognize(@RequestBody GeneralBasicOcrRequest 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);
        }


        BGeneralBasicRequest bGeneralBasicRequest = new BGeneralBasicRequest();
        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());

        ApiR<BGeneralBasicResp> aR = bGeneralBasicHandle.handle(bGeneralBasicRequest);

        if (aR.isSuccess()) {
            return R.ok().setData(aR.getData());
        }
        return R.error(aR.getErrorMsg());


    }


}
