//package com.gxwebsoft.ai.util;
//
//import com.aliyun.bailian20231229.Client;
//import com.aliyun.bailian20231229.models.*;
//import com.aliyun.teautil.models.RuntimeOptions;
//import com.fasterxml.jackson.databind.ObjectMapper;
//
//import java.io.File;
//import java.io.FileInputStream;
//import java.io.InputStream;
//import java.net.HttpURLConnection;
//import java.net.URL;
//import java.nio.file.Paths;
//import java.security.MessageDigest;
//import java.util.*;
//
//import org.springframework.web.multipart.MultipartFile;
//
///**
// * 知识库上传工具类
// * @author GIIT-YC
// *
// */
//public class KnowledgeBaseUploader {
//    
//	/**
//	 * 上传文档到知识库（直接处理MultipartFile）
//	 *
//	 * @param client      阿里云客户端
//	 * @param workspaceId 业务空间ID
//	 * @param indexId     知识库ID
//	 * @param file        上传的文件
//	 * @return 新文档的FileID，失败返回null
//	 */
//	public static String uploadDocument(com.aliyun.bailian20231229.Client client, String workspaceId, String indexId, MultipartFile file) {
//	    try {
//	        // 准备文档信息
//	        String fileName = file.getOriginalFilename();
//	        String fileMd5 = calculateMD5(file.getInputStream());
//	        String fileSize = String.valueOf(file.getSize());
//	        
//	        // 申请上传租约
//	        ApplyFileUploadLeaseRequest leaseRequest = new ApplyFileUploadLeaseRequest()
//	                .setFileName(fileName)
//	                .setMd5(fileMd5)
//	                .setSizeInBytes(fileSize);
//	        
//	        ApplyFileUploadLeaseResponse leaseResponse = client.applyFileUploadLeaseWithOptions(
//	                "default", workspaceId, leaseRequest, new HashMap<>(), new RuntimeOptions());
//	        
//	        String leaseId = leaseResponse.getBody().getData().getFileUploadLeaseId();
//	        String uploadUrl = leaseResponse.getBody().getData().getParam().getUrl();
//	        
//	        // 上传文件
//	        ObjectMapper mapper = new ObjectMapper();
//	        Map<String, String> headers = mapper.readValue(mapper.writeValueAsString(leaseResponse.getBody().getData().getParam().getHeaders()), Map.class);
//	        
//	        uploadFile(uploadUrl, headers, file);
//	        
//	        // 添加文件到类目
//	        AddFileRequest addRequest = new AddFileRequest()
//	                .setLeaseId(leaseId)
//	                .setParser("DASHSCOPE_DOCMIND")
//	                .setCategoryId("default");
//	        
//	        AddFileResponse addResponse = client.addFileWithOptions(workspaceId, addRequest, new HashMap<>(), new RuntimeOptions());
//	        
//	        String fileId = addResponse.getBody().getData().getFileId();
//	        
//	        // 等待文件解析完成
//	        waitForFileParsing(client, workspaceId, fileId);
//	        
//	        // 添加到知识库
//	        SubmitIndexAddDocumentsJobRequest indexRequest = new SubmitIndexAddDocumentsJobRequest()
//	                .setIndexId(indexId)
//	                .setDocumentIds(Collections.singletonList(fileId))
//	                .setSourceType("DATA_CENTER_FILE");
//	        
//	        SubmitIndexAddDocumentsJobResponse indexResponse = client.submitIndexAddDocumentsJobWithOptions(workspaceId, indexRequest, new HashMap<>(), new RuntimeOptions());
//	        
//	        // 等待索引完成
//	        waitForIndexJob(client, workspaceId, indexResponse.getBody().getData().getId(), indexId);
//	        
//	        return fileId;
//	        
//	    } catch (Exception e) {
//	        e.printStackTrace();
//	        return null;
//	    }
//	}
//
//	/**
//	 * 批量上传文档到知识库
//	 */
//	public static List<String> uploadDocuments(com.aliyun.bailian20231229.Client client, String workspaceId, String indexId, MultipartFile[] files) {
//	    List<String> fileIds = new ArrayList<>();
//	    for (MultipartFile file : files) {
//	        String fileId = uploadDocument(client, workspaceId, indexId, file);
//	        if (fileId != null) {
//	            fileIds.add(fileId);
//	        }
//	    }
//	    return fileIds;
//	}
//    
//    /**
//     * 上传文档到知识库
//     *
//     * @param client      阿里云客户端
//     * @param workspaceId 业务空间ID
//     * @param indexId     知识库ID
//     * @param filePath    文档本地路径
//     * @return 新文档的FileID，失败返回null
//     */
//    public static String uploadDocument(com.aliyun.bailian20231229.Client client, String workspaceId, String indexId, String filePath) {
//        try {
//            // 准备文档信息
//            String fileName = Paths.get(filePath).getFileName().toString();
//            String fileMd5 = calculateMD5(filePath);
//            String fileSize = String.valueOf(new File(filePath).length());
//            
//            // 申请上传租约
//            ApplyFileUploadLeaseRequest leaseRequest = new ApplyFileUploadLeaseRequest()
//                    .setFileName(fileName)
//                    .setMd5(fileMd5)
//                    .setSizeInBytes(fileSize);
//            
//            ApplyFileUploadLeaseResponse leaseResponse = client.applyFileUploadLeaseWithOptions(
//                    "default", workspaceId, leaseRequest, new HashMap<>(), new RuntimeOptions());
//            
//            String leaseId = leaseResponse.getBody().getData().getFileUploadLeaseId();
//            String uploadUrl = leaseResponse.getBody().getData().getParam().getUrl();
//            
//            // 上传文件
//            ObjectMapper mapper = new ObjectMapper();
//            Map<String, String> headers = mapper.readValue(
//                    mapper.writeValueAsString(leaseResponse.getBody().getData().getParam().getHeaders()), 
//                    Map.class);
//            
//            uploadFile(uploadUrl, headers, filePath);
//            
//            // 添加文件到类目
//            AddFileRequest addRequest = new AddFileRequest()
//                    .setLeaseId(leaseId)
//                    .setParser("DASHSCOPE_DOCMIND")
//                    .setCategoryId("default");
//            
//            AddFileResponse addResponse = client.addFileWithOptions(
//                    workspaceId, addRequest, new HashMap<>(), new RuntimeOptions());
//            
//            String fileId = addResponse.getBody().getData().getFileId();
//            
//            // 等待文件解析完成
//            waitForFileParsing(client, workspaceId, fileId);
//            
//            // 添加到知识库
//            SubmitIndexAddDocumentsJobRequest indexRequest = new SubmitIndexAddDocumentsJobRequest()
//                    .setIndexId(indexId)
//                    .setDocumentIds(Collections.singletonList(fileId))
//                    .setSourceType("DATA_CENTER_FILE");
//            
//            SubmitIndexAddDocumentsJobResponse indexResponse = client.submitIndexAddDocumentsJobWithOptions(
//                    workspaceId, indexRequest, new HashMap<>(), new RuntimeOptions());
//            
//            // 等待索引完成
//            waitForIndexJob(client, workspaceId, indexResponse.getBody().getData().getId(), indexId);
//            
//            return fileId;
//            
//        } catch (Exception e) {
//            e.printStackTrace();
//            return null;
//        }
//    }
//    
//    private static String calculateMD5(String filePath) throws Exception {
//        MessageDigest md = MessageDigest.getInstance("MD5");
//        try (FileInputStream fis = new FileInputStream(filePath)) {
//            byte[] buffer = new byte[4096];
//            int bytesRead;
//            while ((bytesRead = fis.read(buffer)) != -1) {
//                md.update(buffer, 0, bytesRead);
//            }
//        }
//        StringBuilder sb = new StringBuilder();
//        for (byte b : md.digest()) {
//            sb.append(String.format("%02x", b & 0xff));
//        }
//        return sb.toString();
//    }
//    
//    private static void uploadFile(String preSignedUrl, Map<String, String> headers, 
//                                 String filePath) throws Exception {
//        try (FileInputStream fis = new FileInputStream(filePath)) {
//            HttpURLConnection conn = (HttpURLConnection) new URL(preSignedUrl).openConnection();
//            conn.setRequestMethod("PUT");
//            conn.setDoOutput(true);
//            conn.setRequestProperty("X-bailian-extra", headers.get("X-bailian-extra"));
//            conn.setRequestProperty("Content-Type", headers.get("Content-Type"));
//            
//            byte[] buffer = new byte[4096];
//            int bytesRead;
//            while ((bytesRead = fis.read(buffer)) != -1) {
//                conn.getOutputStream().write(buffer, 0, bytesRead);
//            }
//            
//            if (conn.getResponseCode() != 200) {
//                throw new RuntimeException("上传失败: " + conn.getResponseCode());
//            }
//        }
//    }
//    
//    private static void waitForFileParsing(com.aliyun.bailian20231229.Client client, 
//                                         String workspaceId, String fileId) throws Exception {
//        while (true) {
//            DescribeFileResponse response = client.describeFileWithOptions(
//                    workspaceId, fileId, new HashMap<>(), new RuntimeOptions());
//            
//            String status = response.getBody().getData().getStatus();
//            if ("PARSE_SUCCESS".equals(status)) break;
//            if ("PARSE_FAILED".equals(status)) throw new RuntimeException("文档解析失败");
//            Thread.sleep(5000);
//        }
//    }
//    
//    private static void waitForIndexJob(com.aliyun.bailian20231229.Client client, 
//                                      String workspaceId, String jobId, String indexId) throws Exception {
//        while (true) {
//            GetIndexJobStatusRequest request = new GetIndexJobStatusRequest()
//                    .setIndexId(indexId)
//                    .setJobId(jobId);
//            
//            GetIndexJobStatusResponse response = client.getIndexJobStatusWithOptions(
//                    workspaceId, request, new HashMap<>(), new RuntimeOptions());
//            
//            String status = response.getBody().getData().getStatus();
//            if ("COMPLETED".equals(status)) break;
//            if ("FAILED".equals(status)) throw new RuntimeException("索引任务失败");
//            Thread.sleep(5000);
//        }
//    }
//
//	private static String calculateMD5(InputStream inputStream) throws Exception {
//	    MessageDigest md = MessageDigest.getInstance("MD5");
//	    byte[] buffer = new byte[4096];
//	    int bytesRead;
//	    while ((bytesRead = inputStream.read(buffer)) != -1) {
//	        md.update(buffer, 0, bytesRead);
//	    }
//	    StringBuilder sb = new StringBuilder();
//	    for (byte b : md.digest()) {
//	        sb.append(String.format("%02x", b & 0xff));
//	    }
//	    return sb.toString();
//	}
//
//	private static void uploadFile(String preSignedUrl, Map<String, String> headers, 
//	                             MultipartFile file) throws Exception {
//	    HttpURLConnection conn = (HttpURLConnection) new URL(preSignedUrl).openConnection();
//	    conn.setRequestMethod("PUT");
//	    conn.setDoOutput(true);
//	    conn.setRequestProperty("X-bailian-extra", headers.get("X-bailian-extra"));
//	    conn.setRequestProperty("Content-Type", headers.get("Content-Type"));
//	    
//	    try (InputStream inputStream = file.getInputStream()) {
//	        byte[] buffer = new byte[4096];
//	        int bytesRead;
//	        while ((bytesRead = inputStream.read(buffer)) != -1) {
//	            conn.getOutputStream().write(buffer, 0, bytesRead);
//	        }
//	    }
//	    
//	    if (conn.getResponseCode() != 200) {
//	        throw new RuntimeException("上传失败: " + conn.getResponseCode());
//	    }
//	}
//    
//	/**
//	 * 初始化客户端（Client）。
//	 *
//	 * @return 配置好的客户端对象
//	 */
//	public static com.aliyun.bailian20231229.Client createClient(String accessKeyId, String accessKeySecret) throws Exception {
//		com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
//				.setAccessKeyId(accessKeyId)
//				.setAccessKeySecret(accessKeySecret);
//		// 下方接入地址以公有云的公网接入地址为例，可按需更换接入地址。
//		config.endpoint = "bailian.cn-beijing.aliyuncs.com";
//		return new com.aliyun.bailian20231229.Client(config);
//	}
//    
//    public static void main(String[] args) throws Exception {
//		String ALIBABA_CLOUD_ACCESS_KEY_ID = "LTAI5tD5YRKuxWz6Eg7qrM4P";
//		String ALIBABA_CLOUD_ACCESS_KEY_SECRET = "bO8TBDXflOwbtSKimPpG8XrJnyzgTk";
//		String WORKSPACE_ID = "llm-4pf5auwewoz34zqu";
//		String indexId = "b9pvwfqp3d";
//		String filePath = "D:\\公司经济责任审计方案模板.docx";
//		
//		Client client = createClient(ALIBABA_CLOUD_ACCESS_KEY_ID, ALIBABA_CLOUD_ACCESS_KEY_SECRET);
//    	
//    	uploadDocument(client, WORKSPACE_ID, indexId, filePath);
//	}
//}