package com.lingyue.parse.service;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

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

/**
 * OCR结果解析器
 * 根据OCR服务返回的JSON结构解析文本内容
 * 
 * @author lingyue
 * @since 2026-01-14
 */
@Slf4j
@Component
public class OcrResultParser {
    
    private final ObjectMapper objectMapper = new ObjectMapper();
    
    /**
     * 解析OCR结果，提取文本内容
     * 
     * 支持的JSON格式：
     * 1. {"text": "识别的文本内容"}
     * 2. {"result": [{"text": "文本1"}, {"text": "文本2"}]}
     * 3. [{"text": "文本1", "confidence": 0.95}, {"text": "文本2", "confidence": 0.90}]
     * 4. {"data": {"text": "文本内容"}}
     * 
     * @param ocrResult OCR原始结果（JSON字符串）
     * @return 提取的文本内容
     */
    public String parseText(String ocrResult) {
        if (ocrResult == null || ocrResult.trim().isEmpty()) {
            return "";
        }
        
        try {
            JsonNode rootNode = objectMapper.readTree(ocrResult);
            return extractTextFromJson(rootNode);
        } catch (Exception e) {
            log.debug("OCR结果不是有效的JSON，返回原始结果", e);
            // 如果不是JSON格式，直接返回原始结果
            return ocrResult;
        }
    }
    
    /**
     * 从JSON节点中提取文本
     */
    private String extractTextFromJson(JsonNode node) {
        if (node == null || node.isNull()) {
            return "";
        }
        
        // 如果是数组，遍历提取
        if (node.isArray()) {
            List<String> texts = new ArrayList<>();
            for (JsonNode item : node) {
                String text = extractTextFromJson(item);
                if (text != null && !text.trim().isEmpty()) {
                    texts.add(text);
                }
            }
            return String.join("\n", texts);
        }
        
        // 如果是对象，查找text字段
        if (node.isObject()) {
            // 直接查找text字段
            if (node.has("text")) {
                JsonNode textNode = node.get("text");
                if (textNode.isTextual()) {
                    return textNode.asText();
                }
            }
            
            // 查找result字段（可能是数组）
            if (node.has("result")) {
                JsonNode resultNode = node.get("result");
                return extractTextFromJson(resultNode);
            }
            
            // 查找data字段
            if (node.has("data")) {
                JsonNode dataNode = node.get("data");
                return extractTextFromJson(dataNode);
            }
            
            // 查找content字段
            if (node.has("content")) {
                JsonNode contentNode = node.get("content");
                if (contentNode.isTextual()) {
                    return contentNode.asText();
                }
            }
            
            // 如果都没有，尝试提取所有文本字段
            List<String> texts = new ArrayList<>();
            node.fields().forEachRemaining(entry -> {
                JsonNode value = entry.getValue();
                if (value.isTextual()) {
                    String text = value.asText();
                    if (text != null && !text.trim().isEmpty()) {
                        texts.add(text);
                    }
                } else if (value.isArray() || value.isObject()) {
                    String text = extractTextFromJson(value);
                    if (text != null && !text.trim().isEmpty()) {
                        texts.add(text);
                    }
                }
            });
            
            if (!texts.isEmpty()) {
                return String.join("\n", texts);
            }
        }
        
        // 如果是文本节点，直接返回
        if (node.isTextual()) {
            return node.asText();
        }
        
        return "";
    }
}
