package cn.iocoder.yudao.module.ocr.framework.ocr.core.client.impl;

import cn.hutool.core.date.DateUtil;
import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil;
import cn.iocoder.yudao.module.ocr.enums.ErrorCodeConstants;
import cn.iocoder.yudao.module.ocr.framework.ocr.core.client.AbstractOcrClient;
import cn.iocoder.yudao.module.ocr.framework.ocr.core.result.VehicleLicenseResult;
import com.baidu.aip.ocr.AipOcr;
import lombok.extern.slf4j.Slf4j;
import org.json.JSONObject;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

/**
 * 百度 OCR 客户端实现
 */
@Slf4j
public class BaiduOcrClient extends AbstractOcrClient<BaiduOcrClientConfig> {

    private AipOcr client;

    public BaiduOcrClient(BaiduOcrClientConfig config) {
        super(config);
    }

    @Override
    protected void doInit() {
        this.client = new AipOcr(config.getAppId(), config.getApiKey(), config.getSecretKey());
        // 设置超时时间
        this.client.setConnectionTimeoutInMillis(5000);
        this.client.setSocketTimeoutInMillis(30000);
    }

    @Override
    public VehicleLicenseResult recognizeVehicleLicense(byte[] imageData) {
        // 校验图片
        validateImageData(imageData);

        try {
            // 调用百度 OCR API
            JSONObject response = client.vehicleLicense(imageData, null);

            // 检查错误
            if (response.has("error_code")) {
                log.error("[recognizeVehicleLicense][百度 OCR 识别失败，错误码：{}，错误信息：{}]",
                        response.getInt("error_code"), response.getString("error_msg"));
                throw ServiceExceptionUtil.exception(ErrorCodeConstants.OCR_RECOGNIZE_FAILED);
            }

            // 解析结果
            return parseVehicleLicenseResult(response);
        } catch (Exception e) {
            log.error("[recognizeVehicleLicense][百度 OCR 识别异常]", e);
            throw ServiceExceptionUtil.exception(ErrorCodeConstants.OCR_RECOGNIZE_FAILED);
        }
    }

    /**
     * 解析行驶证识别结果
     */
    private VehicleLicenseResult parseVehicleLicenseResult(JSONObject response) {
        VehicleLicenseResult result = new VehicleLicenseResult();

        JSONObject wordsResult = response.getJSONObject("words_result");
        if (wordsResult == null) {
            return result;
        }

        // 车辆识别代号
        if (wordsResult.has("车辆识别代号")) {
            result.setVin(wordsResult.getJSONObject("车辆识别代号").getString("words"));
        }

        // 号牌号码
        if (wordsResult.has("号牌号码")) {
            result.setPlateNo(wordsResult.getJSONObject("号牌号码").getString("words"));
        }

        // 品牌型号
        if (wordsResult.has("品牌型号")) {
            result.setBrand(wordsResult.getJSONObject("品牌型号").getString("words"));
        }

        // 车辆类型
        if (wordsResult.has("车辆类型")) {
            result.setVehicleType(wordsResult.getJSONObject("车辆类型").getString("words"));
        }

        // 所有人
        if (wordsResult.has("所有人")) {
            result.setOwner(wordsResult.getJSONObject("所有人").getString("words"));
        }

        // 使用性质
        if (wordsResult.has("使用性质")) {
            result.setUseCharacter(wordsResult.getJSONObject("使用性质").getString("words"));
        }

        // 发动机号码
        if (wordsResult.has("发动机号码")) {
            result.setEngineNo(wordsResult.getJSONObject("发动机号码").getString("words"));
        }

        // 注册日期
        if (wordsResult.has("注册日期")) {
            String registerDate = wordsResult.getJSONObject("注册日期").getString("words");
            result.setRegisterDate(parseDate(registerDate));
        }

        // 发证日期
        if (wordsResult.has("发证日期")) {
            String issueDate = wordsResult.getJSONObject("发证日期").getString("words");
            result.setIssueDate(parseDate(issueDate));
        }

        // 检验记录
        if (wordsResult.has("检验记录")) {
            result.setInspectionRecord(wordsResult.getJSONObject("检验记录").getString("words"));
        }

        // 强制报废期止
        if (wordsResult.has("强制报废期止")) {
            String scrapDate = wordsResult.getJSONObject("强制报废期止").getString("words");
            result.setScrapDate(parseDate(scrapDate));
        }

        // 整备质量
        if (wordsResult.has("整备质量")) {
            result.setCurbWeight(wordsResult.getJSONObject("整备质量").getString("words"));
        }

        // 总质量
        if (wordsResult.has("总质量")) {
            result.setTotalMass(wordsResult.getJSONObject("总质量").getString("words"));
        }

        // 核定载人数
        if (wordsResult.has("核定载人数")) {
            result.setApprovedPassengerCapacity(wordsResult.getJSONObject("核定载人数").getString("words"));
        }

        return result;
    }

    /**
     * 解析日期字符串
     */
    private LocalDate parseDate(String dateStr) {
        if (dateStr == null || dateStr.trim().isEmpty()) {
            return null;
        }
        try {
            // 百度 OCR 返回格式：2020-01-01 或 20200101
            dateStr = dateStr.replaceAll("[年月]", "-").replaceAll("日", "");
            if (dateStr.length() == 8 && !dateStr.contains("-")) {
                // 20200101 格式
                return LocalDate.parse(dateStr, DateTimeFormatter.ofPattern("yyyyMMdd"));
            } else {
                // 2020-01-01 格式
                return LocalDate.parse(dateStr, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
            }
        } catch (Exception e) {
            log.warn("[parseDate][日期解析失败：{}]", dateStr, e);
            return null;
        }
    }

}
