package shop.alien.store.util.ali.ocr;

import com.aliyun.ocr_api20210707.Client;
import com.aliyun.tea.TeaException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import shop.alien.entity.store.OcrImageUpload;
import shop.alien.store.service.OcrImageUploadService;

/**
 * OCR策略抽象基类
 * 提供公共的客户端创建和异常处理逻辑
 *
 * @author lyx
 * @date 2025/11/18
 */
@Slf4j
public abstract class AbstractOcrStrategy implements OcrStrategy {
    
    @Value("${ali.ocr.accessKeyId:}")
    protected String accessKeyId;
    
    @Value("${ali.ocr.accessKeySecret:}")
    protected String accessKeySecret;
    
    @Value("${ali.ocr.endpoint:ocr-api.cn-hangzhou.aliyuncs.com}")
    protected String endpoint;

    @Autowired
    protected OcrImageUploadService ocrImageUploadService;

    /**
     * 创建OCR客户端
     * 
     * @return OCR客户端
     * @throws Exception 创建客户端异常
     */
    protected Client createOcrClient() throws Exception {
        // 工程代码建议使用更安全的无 AK 方式，凭据配置方式请参见：https://help.aliyun.com/document_detail/378657.html。
        com.aliyun.credentials.Client credential = new com.aliyun.credentials.Client();
        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
                .setCredential(credential);
        
        // 如果配置了AccessKey，则使用配置的值，否则使用默认值（仅用于测试）
        if (org.apache.commons.lang3.StringUtils.isNotBlank(accessKeyId)) {
            config.setAccessKeyId(accessKeyId);
        } else {
            // 默认值，仅用于测试，生产环境应该从配置文件读取
            config.setAccessKeyId("LTAI5tFDRZ31MXse5TEQyPwQ");
        }
        
        if (org.apache.commons.lang3.StringUtils.isNotBlank(accessKeySecret)) {
            config.setAccessKeySecret(accessKeySecret);
        } else {
            // 默认值，仅用于测试，生产环境应该从配置文件读取
            config.setAccessKeySecret("n0UHNuzIZMA7CnAt1uzb43FCbpbQDg");
        }
        
        // Endpoint 请参考 https://api.aliyun.com/product/ocr-api
        config.endpoint = endpoint;
        
        return new Client(config);
    }
    
    /**
     * 处理OCR识别异常
     * 
     * @param error 异常对象
     * @param errorMessage 错误消息
     * @throws Exception 重新抛出的异常
     */
    protected void handleOcrException(TeaException error, String errorMessage) throws Exception {
        log.error("OCR识别失败: {}", errorMessage, error);
        // 错误 message
        log.error("错误信息: {}", error.getMessage());
        // 诊断地址
        if (error.getData() != null && error.getData().get("Recommend") != null) {
            log.error("诊断地址: {}", error.getData().get("Recommend"));
        }
        com.aliyun.teautil.Common.assertAsString(error.message);
        throw new Exception("OCR识别失败: " + errorMessage, error);
    }
    
    /**
     * 处理通用异常
     * 
     * @param error 异常对象
     * @param errorMessage 错误消息
     * @throws Exception 重新抛出的异常
     */
    protected void handleOcrException(Exception error, String errorMessage) throws Exception {
        if (error instanceof TeaException) {
            handleOcrException((TeaException) error, errorMessage);
        } else {
            TeaException teaException = new TeaException(error.getMessage(), error);
            handleOcrException(teaException, errorMessage);
        }
    }

    public void saveOcrImage(OcrImageUpload ocrImageUpload) {
        // 保存OCR识别结果到数据库
        boolean save = ocrImageUploadService.save(ocrImageUpload);
        if (!save) {
            log.error("保存OCR识别结果失败: {}", ocrImageUpload);
        }
    }
}

