package com.lingyue.document.service;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.lingyue.document.entity.Document;
import com.lingyue.document.repository.DocumentRepository;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;

/**
 * 文档服务
 * 
 * @author lingyue
 * @since 2026-01-14
 */
@Slf4j
@Service
@RequiredArgsConstructor
public class DocumentService {
    
    private final DocumentRepository documentRepository;
    
    @Value("${file.storage.text-path:/data/lingyue/texts}")
    private String textStoragePath;
    
    /**
     * 根据ID获取文档
     */
    public Document getDocumentById(String documentId) {
        return documentRepository.selectById(documentId);
    }
    
    /**
     * 根据用户ID分页查询文档（支持筛选和搜索）
     * 
     * @param userId 用户ID
     * @param page 分页参数
     * @param status 状态筛选（可选）
     * @param keyword 关键词搜索（可选）
     * @return 分页结果
     */
    public IPage<Document> getDocumentsByUserId(String userId, Page<Document> page, String status, String keyword) {
        LambdaQueryWrapper<Document> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(Document::getUserId, userId);
        
        // 状态筛选
        if (StringUtils.hasText(status)) {
            wrapper.eq(Document::getStatus, status);
        }
        
        // 关键词搜索（搜索文档名称）
        if (StringUtils.hasText(keyword)) {
            wrapper.like(Document::getName, keyword);
        }
        
        wrapper.orderByDesc(Document::getCreateTime);
        return documentRepository.selectPage(page, wrapper);
    }
    
    /**
     * 根据用户ID分页查询文档（简单版本）
     */
    public IPage<Document> getDocumentsByUserId(String userId, Page<Document> page) {
        return getDocumentsByUserId(userId, page, null, null);
    }
    
    /**
     * 获取文档提取的文本内容
     * 
     * @param documentId 文档ID
     * @return 文本内容
     */
    public String getDocumentText(String documentId) {
        // 构建文本文件路径
        String subDir = documentId.substring(0, 2);
        Path textFilePath = Path.of(textStoragePath, subDir, documentId + ".txt");
        
        if (!Files.exists(textFilePath)) {
            log.warn("文档文本文件不存在: {}", textFilePath);
            return null;
        }
        
        try {
            return Files.readString(textFilePath, StandardCharsets.UTF_8);
        } catch (Exception e) {
            log.error("读取文档文本失败: {}", textFilePath, e);
            throw new RuntimeException("读取文档文本失败: " + e.getMessage());
        }
    }
    
    /**
     * 保存文档
     */
    public Document saveDocument(Document document) {
        if (document.getId() == null) {
            document.setId(java.util.UUID.randomUUID().toString().replace("-", ""));
            document.setCreateTime(new java.util.Date());
            documentRepository.insert(document);
        } else {
            // 检查是否已存在该记录
            Document existing = documentRepository.selectById(document.getId());
            if (existing == null) {
                // 如果不存在，执行插入
                document.setCreateTime(new java.util.Date());
                documentRepository.insert(document);
            } else {
                // 如果存在，执行更新
                document.setUpdateTime(new java.util.Date());
                documentRepository.updateById(document);
            }
        }
        return document;
    }
    
    /**
     * 删除文档
     */
    public void deleteDocument(String documentId) {
        documentRepository.deleteById(documentId);
        log.info("删除文档: documentId={}", documentId);
        // TODO: 同时删除关联的文本文件、图节点等
    }
    
    /**
     * 统计用户文档数量
     */
    public long countByUserId(String userId) {
        LambdaQueryWrapper<Document> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(Document::getUserId, userId);
        return documentRepository.selectCount(wrapper);
    }
    
    /**
     * 统计用户本周新增文档数
     */
    public long countWeeklyNewByUserId(String userId) {
        LambdaQueryWrapper<Document> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(Document::getUserId, userId);
        
        // 计算本周开始时间
        java.util.Calendar cal = java.util.Calendar.getInstance();
        cal.set(java.util.Calendar.DAY_OF_WEEK, cal.getFirstDayOfWeek());
        cal.set(java.util.Calendar.HOUR_OF_DAY, 0);
        cal.set(java.util.Calendar.MINUTE, 0);
        cal.set(java.util.Calendar.SECOND, 0);
        cal.set(java.util.Calendar.MILLISECOND, 0);
        
        wrapper.ge(Document::getCreateTime, cal.getTime());
        return documentRepository.selectCount(wrapper);
    }
}
