package com.lingyue.document.service;

import com.lingyue.document.entity.DocumentElement;
import com.lingyue.document.repository.DocumentElementRepository;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 文档元素服务
 * 管理文档的结构化内容（段落、图片、表格）
 * 
 * @author lingyue
 * @since 2026-01-21
 */
@Slf4j
@Service
@RequiredArgsConstructor
public class DocumentElementService {
    
    private final DocumentElementRepository elementRepository;
    
    /**
     * 获取文档的所有结构化元素（按顺序）
     */
    public List<DocumentElement> getElementsByDocumentId(String documentId) {
        return elementRepository.findByDocumentId(documentId);
    }
    
    /**
     * 获取文档中的所有图片
     */
    public List<DocumentElement> getImagesByDocumentId(String documentId) {
        return elementRepository.findImagesByDocumentId(documentId);
    }
    
    /**
     * 获取文档中的所有表格
     */
    public List<DocumentElement> getTablesByDocumentId(String documentId) {
        return elementRepository.findTablesByDocumentId(documentId);
    }
    
    /**
     * 保存文档的结构化元素
     * 
     * @param documentId 文档ID
     * @param elements   元素列表（来自解析服务）
     */
    @Transactional
    public void saveElements(String documentId, List<Map<String, Object>> elements) {
        log.info("保存文档结构化元素: documentId={}, count={}", documentId, elements.size());
        
        // 先删除旧数据
        elementRepository.deleteByDocumentId(documentId);
        
        // 批量插入新数据
        for (Map<String, Object> element : elements) {
            DocumentElement entity = convertToEntity(documentId, element);
            elementRepository.insert(entity);
        }
        
        log.info("文档结构化元素保存完成: documentId={}", documentId);
    }
    
    /**
     * 将解析结果转换为实体
     */
    private DocumentElement convertToEntity(String documentId, Map<String, Object> element) {
        DocumentElement entity = new DocumentElement();
        entity.setId(java.util.UUID.randomUUID().toString().replace("-", ""));
        entity.setDocumentId(documentId);
        entity.setElementIndex((Integer) element.get("index"));
        entity.setElementType((String) element.get("type"));
        entity.setContent((String) element.get("content"));
        
        // 样式
        @SuppressWarnings("unchecked")
        Map<String, Object> style = (Map<String, Object>) element.get("style");
        entity.setStyle(style);
        
        // 图片相关
        entity.setImageUrl((String) element.get("imageUrl"));
        entity.setImagePath((String) element.get("imagePath"));
        entity.setImageAlt((String) element.get("imageAlt"));
        entity.setImageWidth((Integer) element.get("imageWidth"));
        entity.setImageHeight((Integer) element.get("imageHeight"));
        entity.setImageFormat((String) element.get("imageFormat"));
        
        // 表格相关
        entity.setTableIndex((Integer) element.get("tableIndex"));
        entity.setTableRowCount((Integer) element.get("tableRowCount"));
        entity.setTableColCount((Integer) element.get("tableColCount"));
        entity.setTableText((String) element.get("tableText"));
        
        // 表格数据
        @SuppressWarnings("unchecked")
        List<List<Map<String, Object>>> tableRows = (List<List<Map<String, Object>>>) element.get("tableRows");
        if (tableRows != null) {
            entity.setTableData(tableRows);
        }
        
        return entity;
    }
    
    /**
     * 删除文档的所有元素
     */
    @Transactional
    public void deleteByDocumentId(String documentId) {
        elementRepository.deleteByDocumentId(documentId);
    }
    
    /**
     * 获取文档元素统计
     */
    public Map<String, Object> getElementStats(String documentId) {
        Map<String, Object> stats = new HashMap<>();
        
        int total = elementRepository.countByDocumentId(documentId);
        stats.put("total", total);
        
        List<Map<String, Object>> typeStats = elementRepository.countByDocumentIdGroupByType(documentId);
        Map<String, Integer> byType = new HashMap<>();
        for (Map<String, Object> typeStat : typeStats) {
            String type = (String) typeStat.get("element_type");
            Long count = (Long) typeStat.get("count");
            byType.put(type, count.intValue());
        }
        stats.put("byType", byType);
        
        return stats;
    }
}
