package com.fs.chat.service.impl;

import com.fs.chat.domain.ChatDatasetFile;
import com.fs.chat.dto.ChatDatasetFileExportDTO;
import com.fs.chat.mapper.ChatDatasetFileMapper;
import com.fs.chat.service.IChatDatasetFileService;
import com.fs.common.utils.DateUtils;
import org.apache.poi.xwpf.usermodel.ParagraphAlignment;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.stereotype.Service;
import org.springframework.util.MimeTypeUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.List;

/**
 * 文件Service业务层处理
 *
 * @author fs
 * @date 2024-04-21
 */
@Service
public class ChatDatasetFileServiceImpl implements IChatDatasetFileService
{
    @Autowired
    private ChatDatasetFileMapper chatDatasetFileMapper;

    /**
     * 查询文件
     *
     * @param fileId 文件主键
     * @return 文件
     */
    @Override
    public ChatDatasetFile selectChatDatasetFileByFileId(Long fileId)
    {
        return chatDatasetFileMapper.selectChatDatasetFileByFileId(fileId);
    }

    /**
     * 查询文件列表
     *
     * @param chatDatasetFile 文件
     * @return 文件
     */
    @Override
    public List<ChatDatasetFile> selectChatDatasetFileList(ChatDatasetFile chatDatasetFile)
    {
        return chatDatasetFileMapper.selectChatDatasetFileList(chatDatasetFile);
    }

    /**
     * 新增文件
     *
     * @param chatDatasetFile 文件
     * @return 结果
     */
    @Override
    public int insertChatDatasetFile(ChatDatasetFile chatDatasetFile)
    {
        chatDatasetFile.setCreateTime(DateUtils.getNowDate());
        return chatDatasetFileMapper.insertChatDatasetFile(chatDatasetFile);
    }

    /**
     * 修改文件
     *
     * @param chatDatasetFile 文件
     * @return 结果
     */
    @Override
    public int updateChatDatasetFile(ChatDatasetFile chatDatasetFile)
    {
        return chatDatasetFileMapper.updateChatDatasetFile(chatDatasetFile);
    }

    /**
     * 批量删除文件
     *
     * @param fileIds 需要删除的文件主键
     * @return 结果
     */
    @Override
    public int deleteChatDatasetFileByFileIds(Long[] fileIds)
    {
        return chatDatasetFileMapper.deleteChatDatasetFileByFileIds(fileIds);
    }

    /**
     * 删除文件信息
     *
     * @param fileId 文件主键
     * @return 结果
     */
    @Override
    public int deleteChatDatasetFileByFileId(Long fileId)
    {
        return chatDatasetFileMapper.deleteChatDatasetFileByFileId(fileId);
    }

    @Override
    public MultipartFile convertChatDatasetFileByExcel(List<ChatDatasetFileExportDTO> list,String fileName) throws IOException{
        XWPFDocument doc = new XWPFDocument();
        XWPFParagraph paragraph = doc.createParagraph();
        paragraph.setAlignment(ParagraphAlignment.LEFT);
        for (ChatDatasetFileExportDTO item : list) {
            String question = item.getQuestion();
            String answer = item.getAnswer();
            // 创建一个新的运行时实例，以在段落中添加文本
            XWPFRun run = paragraph.createRun();
            run.setText("问：" + question);
            run.addBreak();
            run.setText("回复：" + answer);
            run.addBreak();
        }
        // 将Word文档保存到临时文件
//        File tempFile = File.createTempFile(fileName, ".docx");
//        try (FileOutputStream out = new FileOutputStream(tempFile)) {
//            doc.write(out);
//            // 生成目标文件路径
//            Path targetPath = new File("d:/Users/86155/Desktop/file.docx").toPath();
//            // 复制临时文件到目标位置
//            Files.copy(tempFile.toPath(), targetPath, StandardCopyOption.REPLACE_EXISTING);
//            System.out.println(tempFile.getName());
//        }catch (Exception e) {
//            e.printStackTrace();
//        }
        // 将Word文档转换为MultipartFile类型的文件
        MultipartFile wordFile = null;
        try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
            doc.write(out);
            byte[] content = out.toByteArray();

            // 创建MultipartFile对象
            wordFile = new MockMultipartFile(fileName+".docx", fileName+".docx", MimeTypeUtils.APPLICATION_OCTET_STREAM_VALUE, content);
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 将MultipartFile对象用于后续操作
        if (wordFile != null) {
            return wordFile;
        }
        return null;
    }
}
