//package com.gxwebsoft.ai.util;
//
//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.net.HttpURLConnection;
//import java.net.URL;
//import java.nio.file.Paths;
//import java.security.MessageDigest;
//import java.util.*;
//
///**
// * 更新知识库
// * @author GIIT-YC
// *
// */
//public class KnowledgeBaseUpdate {
//	
//	String ALIBABA_CLOUD_ACCESS_KEY_ID = "LTAI5tD5YRKuxWz6Eg7qrM4P";
//	String ALIBABA_CLOUD_ACCESS_KEY_SECRET = "bO8TBDXflOwbtSKimPpG8XrJnyzgTk";
//	String WORKSPACE_ID = "llm-4pf5auwewoz34zqu";
//
//	/**
//	 * 检查并提示设置必要的环境变量。
//	 *
//	 * @return true 如果所有必需的环境变量都已设置，否则 false
//	 */
//	public static boolean checkEnvironmentVariables() {
//		Map<String, String> requiredVars = new HashMap<>();
//        requiredVars.put("ALIBABA_CLOUD_ACCESS_KEY_ID", "阿里云访问密钥ID");
//        requiredVars.put("ALIBABA_CLOUD_ACCESS_KEY_SECRET", "阿里云访问密钥密码");
//        requiredVars.put("WORKSPACE_ID", "阿里云百炼业务空间ID");
//
//		List<String> missingVars = new ArrayList<>();
//		for (Map.Entry<String, String> entry : requiredVars.entrySet()) {
//			String value = System.getenv(entry.getKey());
//			if (value == null || value.isEmpty()) {
//				missingVars.add(entry.getKey());
//				System.out.println("错误：请设置 " + entry.getKey() + " 环境变量 (" + entry.getValue() + ")");
//			}
//		}
//
//		return missingVars.isEmpty();
//	}
//
//	/**
//	 * 创建并配置客户端（Client）
//	 *
//	 * @return 配置好的客户端（Client）
//	 */
//	public static com.aliyun.bailian20231229.Client createClient() throws Exception {
//		com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
//				.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
//				.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
//		// 下方接入地址以公有云的公网接入地址为例，可按需更换接入地址。
//		config.endpoint = "bailian.cn-beijing.aliyuncs.com";
//		return new com.aliyun.bailian20231229.Client(config);
//	}
//
//	/**
//	 * 计算文档的MD5值
//	 *
//	 * @param filePath 文档本地路径
//	 * @return 文档的MD5值
//	 */
//	public 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();
//	}
//
//	/**
//	 * 获取文档大小（以字节为单位）
//	 *
//	 * @param filePath 文档本地路径
//	 * @return 文档大小（以字节为单位）
//	 */
//	public static String getFileSize(String filePath) {
//		File file = new File(filePath);
//		long fileSize = file.length();
//		return String.valueOf(fileSize);
//	}
//
//	/**
//	 * 申请文档上传租约。
//	 *
//	 * @param client      客户端对象
//	 * @param categoryId  类目ID
//	 * @param fileName    文档名称
//	 * @param fileMd5     文档的MD5值
//	 * @param fileSize    文档大小（以字节为单位）
//	 * @param workspaceId 业务空间ID
//	 * @return 阿里云百炼服务的响应对象
//	 */
//	public static ApplyFileUploadLeaseResponse applyLease(com.aliyun.bailian20231229.Client client, String categoryId,
//			String fileName, String fileMd5, String fileSize, String workspaceId) throws Exception {
//		Map<String, String> headers = new HashMap<>();
//		com.aliyun.bailian20231229.models.ApplyFileUploadLeaseRequest applyFileUploadLeaseRequest = new com.aliyun.bailian20231229.models.ApplyFileUploadLeaseRequest();
//		applyFileUploadLeaseRequest.setFileName(fileName);
//		applyFileUploadLeaseRequest.setMd5(fileMd5);
//		applyFileUploadLeaseRequest.setSizeInBytes(fileSize);
//		com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
//		ApplyFileUploadLeaseResponse applyFileUploadLeaseResponse = null;
//		applyFileUploadLeaseResponse = client.applyFileUploadLeaseWithOptions(categoryId, workspaceId,
//				applyFileUploadLeaseRequest, headers, runtime);
//		return applyFileUploadLeaseResponse;
//	}
//
//	/**
//	 * 上传文档到临时存储。
//	 *
//	 * @param preSignedUrl 上传租约中的 URL
//	 * @param headers      上传请求的头部
//	 * @param filePath     文档本地路径
//	 * @throws Exception 如果上传过程中发生错误
//	 */
//	public static void uploadFile(String preSignedUrl, Map<String, String> headers, String filePath) throws Exception {
//		File file = new File(filePath);
//		if (!file.exists() || !file.isFile()) {
//			throw new IllegalArgumentException("文件不存在或不是普通文件: " + filePath);
//		}
//
//		try (FileInputStream fis = new FileInputStream(file)) {
//			URL url = new URL(preSignedUrl);
//			HttpURLConnection conn = (HttpURLConnection) url.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);
//			}
//
//			int responseCode = conn.getResponseCode();
//			if (responseCode != 200) {
//				throw new RuntimeException("上传失败: " + responseCode);
//			}
//		}
//	}
//
//	/**
//	 * 将文档添加到类目中。
//	 *
//	 * @param client      客户端对象
//	 * @param leaseId     租约ID
//	 * @param parser      用于文档的解析器
//	 * @param categoryId  类目ID
//	 * @param workspaceId 业务空间ID
//	 * @return 阿里云百炼服务的响应对象
//	 */
//	public static AddFileResponse addFile(com.aliyun.bailian20231229.Client client, String leaseId, String parser,
//			String categoryId, String workspaceId) throws Exception {
//		Map<String, String> headers = new HashMap<>();
//		com.aliyun.bailian20231229.models.AddFileRequest addFileRequest = new com.aliyun.bailian20231229.models.AddFileRequest();
//		addFileRequest.setLeaseId(leaseId);
//		addFileRequest.setParser(parser);
//		addFileRequest.setCategoryId(categoryId);
//		com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
//		return client.addFileWithOptions(workspaceId, addFileRequest, headers, runtime);
//	}
//
//	/**
//	 * 查询文档的基本信息。
//	 *
//	 * @param client      客户端对象
//	 * @param workspaceId 业务空间ID
//	 * @param fileId      文档ID
//	 * @return 阿里云百炼服务的响应对象
//	 */
//	public static DescribeFileResponse describeFile(com.aliyun.bailian20231229.Client client, String workspaceId,
//			String fileId) throws Exception {
//		Map<String, String> headers = new HashMap<>();
//		com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
//		return client.describeFileWithOptions(workspaceId, fileId, headers, runtime);
//	}
//
//	/**
//	 * 向一个非结构化知识库追加导入已解析的文档
//	 *
//	 * @param client      客户端（Client）
//	 * @param workspaceId 业务空间ID
//	 * @param indexId     知识库ID
//	 * @param fileId      文档ID
//	 * @param sourceType  数据类型
//	 * @return 阿里云百炼服务的响应
//	 */
//	public static SubmitIndexAddDocumentsJobResponse submitIndexAddDocumentsJob(
//			com.aliyun.bailian20231229.Client client, String workspaceId, String indexId, String fileId,
//			String sourceType) throws Exception {
//		Map<String, String> headers = new HashMap<>();
//		SubmitIndexAddDocumentsJobRequest submitIndexAddDocumentsJobRequest = new SubmitIndexAddDocumentsJobRequest();
//		submitIndexAddDocumentsJobRequest.setIndexId(indexId);
//		submitIndexAddDocumentsJobRequest.setDocumentIds(Collections.singletonList(fileId));
//		submitIndexAddDocumentsJobRequest.setSourceType(sourceType);
//		RuntimeOptions runtime = new RuntimeOptions();
//		return client.submitIndexAddDocumentsJobWithOptions(workspaceId, submitIndexAddDocumentsJobRequest, headers,
//				runtime);
//	}
//
//	/**
//	 * 查询索引任务状态。
//	 *
//	 * @param client      客户端对象
//	 * @param workspaceId 业务空间ID
//	 * @param jobId       任务ID
//	 * @param indexId     知识库ID
//	 * @return 阿里云百炼服务的响应对象
//	 */
//	public static GetIndexJobStatusResponse getIndexJobStatus(com.aliyun.bailian20231229.Client client,
//			String workspaceId, String jobId, String indexId) throws Exception {
//		Map<String, String> headers = new HashMap<>();
//		com.aliyun.bailian20231229.models.GetIndexJobStatusRequest getIndexJobStatusRequest = new com.aliyun.bailian20231229.models.GetIndexJobStatusRequest();
//		getIndexJobStatusRequest.setIndexId(indexId);
//		getIndexJobStatusRequest.setJobId(jobId);
//		com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
//		GetIndexJobStatusResponse getIndexJobStatusResponse = null;
//		getIndexJobStatusResponse = client.getIndexJobStatusWithOptions(workspaceId, getIndexJobStatusRequest, headers,
//				runtime);
//		return getIndexJobStatusResponse;
//	}
//
//	/**
//	 * 从指定的非结构化知识库中永久删除一个或多个文档
//	 *
//	 * @param client      客户端（Client）
//	 * @param workspaceId 业务空间ID
//	 * @param indexId     知识库ID
//	 * @param fileId      文档ID
//	 * @return 阿里云百炼服务的响应
//	 */
//	public static DeleteIndexDocumentResponse deleteIndexDocument(com.aliyun.bailian20231229.Client client,
//			String workspaceId, String indexId, String fileId) throws Exception {
//		Map<String, String> headers = new HashMap<>();
//		DeleteIndexDocumentRequest deleteIndexDocumentRequest = new DeleteIndexDocumentRequest();
//		deleteIndexDocumentRequest.setIndexId(indexId);
//		deleteIndexDocumentRequest.setDocumentIds(Collections.singletonList(fileId));
//		com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
//		return client.deleteIndexDocumentWithOptions(workspaceId, deleteIndexDocumentRequest, headers, runtime);
//	}
//
//	/**
//	 * 使用阿里云百炼服务更新知识库
//	 *
//	 * @param filePath    文档（更新后的）的实际本地路径
//	 * @param workspaceId 业务空间ID
//	 * @param indexId     需要更新的知识库ID
//	 * @param oldFileId   需要更新的文档的FileID
//	 * @return 如果成功，返回知识库ID；否则返回 null
//	 */
//	public static String updateKnowledgeBase(String filePath, String workspaceId, String indexId, String oldFileId) {
//		// 设置默认值
//		String categoryId = "default";
//		String parser = "DASHSCOPE_DOCMIND";
//		String sourceType = "DATA_CENTER_FILE";
//		try {
//			// 步骤1：初始化客户端（Client）
//			System.out.println("步骤1：创建Client");
//			com.aliyun.bailian20231229.Client client = createClient();
//
//			// 步骤2：准备文档信息（更新后的文档）
//			System.out.println("步骤2：准备文档信息");
//			String fileName = Paths.get(filePath).getFileName().toString();
//			String fileMd5 = calculateMD5(filePath);
//			String fileSize = getFileSize(filePath);
//
//			// 步骤3：申请上传租约
//			System.out.println("步骤3：向阿里云百炼申请上传租约");
//			ApplyFileUploadLeaseResponse leaseResponse = applyLease(client, categoryId, fileName, fileMd5, fileSize,
//					workspaceId);
//			String leaseId = leaseResponse.getBody().getData().getFileUploadLeaseId();
//			String uploadUrl = leaseResponse.getBody().getData().getParam().getUrl();
//			Object uploadHeaders = leaseResponse.getBody().getData().getParam().getHeaders();
//
//			// 步骤4：上传文档到临时存储
//			System.out.println("步骤4：上传文档到临时存储");
//			// 请自行安装jackson-databind
//			// 将上一步的uploadHeaders转换为Map(Key-Value形式)
//			ObjectMapper mapper = new ObjectMapper();
//			Map<String, String> uploadHeadersMap = (Map<String, String>) mapper
//					.readValue(mapper.writeValueAsString(uploadHeaders), Map.class);
//			uploadFile(uploadUrl, uploadHeadersMap, filePath);
//
//			// 步骤5：添加文档到类目中
//			System.out.println("步骤5：添加文档到类目中");
//			AddFileResponse addResponse = addFile(client, leaseId, parser, categoryId, workspaceId);
//			String fileId = addResponse.getBody().getData().getFileId();
//
//			// 步骤6：检查更新后的文档状态
//			System.out.println("步骤6：检查阿里云百炼中的文档状态");
//			while (true) {
//				DescribeFileResponse describeResponse = describeFile(client, workspaceId, fileId);
//				String status = describeResponse.getBody().getData().getStatus();
//				System.out.println("当前文档状态：" + status);
//				if ("INIT".equals(status)) {
//					System.out.println("文档待解析，请稍候...");
//				} else if ("PARSING".equals(status)) {
//					System.out.println("文档解析中，请稍候...");
//				} else if ("PARSE_SUCCESS".equals(status)) {
//					System.out.println("文档解析完成！");
//					break;
//				} else {
//					System.out.println("未知的文档状态：" + status + "，请联系技术支持。");
//					return null;
//				}
//				Thread.sleep(5000);
//			}
//
//			// 步骤7：提交追加文档任务
//			System.out.println("步骤7：提交追加文档任务");
//			SubmitIndexAddDocumentsJobResponse indexAddResponse = submitIndexAddDocumentsJob(client, workspaceId,
//					indexId, fileId, sourceType);
//			String jobId = indexAddResponse.getBody().getData().getId();
//
//			// 步骤8：等待追加任务完成
//			System.out.println("步骤8：等待追加任务完成");
//			while (true) {
//				GetIndexJobStatusResponse jobStatusResponse = getIndexJobStatus(client, workspaceId, jobId, indexId);
//				String status = jobStatusResponse.getBody().getData().getStatus();
//				System.out.println("当前索引任务状态：" + status);
//				if ("COMPLETED".equals(status)) {
//					break;
//				}
//				Thread.sleep(5000);
//			}
//
//			// 步骤9：删除旧文档
//			System.out.println("步骤9：删除旧文档");
//			deleteIndexDocument(client, workspaceId, indexId, oldFileId);
//
//			System.out.println("阿里云百炼知识库更新成功！");
//			return indexId;
//		} catch (Exception e) {
//			System.out.println("发生错误：" + e.getMessage());
//			return null;
//		}
//	}
//
//	/**
//	 * 主函数。
//	 */
//	public static void main(String[] args) {
//		if (!checkEnvironmentVariables()) {
//			System.out.println("环境变量校验未通过。");
//			return;
//		}
//
//		Scanner scanner = new Scanner(System.in);
//		System.out.print("请输入您需要上传文档（更新后的）的实际本地路径（以Linux为例：/xxx/xxx/阿里云百炼系列手机产品介绍.docx）：");
//		String filePath = scanner.nextLine();
//
//		System.out.print("请输入需要更新的知识库ID："); // 即 CreateIndex 接口返回的 Data.Id，您也可以在阿里云百炼控制台的知识库页面获取。
//		String indexId = scanner.nextLine(); // 即 AddFile 接口返回的 FileId。您也可以在阿里云百炼控制台的应用数据页面，单击文件名称旁的 ID 图标获取。
//
//		System.out.print("请输入需要更新的文档的 FileID：");
//		String oldFileId = scanner.nextLine();
//
//		String workspaceId = System.getenv("WORKSPACE_ID");
//		String result = updateKnowledgeBase(filePath, workspaceId, indexId, oldFileId);
//		if (result != null) {
//			System.out.println("知识库更新成功，返回知识库ID: " + result);
//		} else {
//			System.out.println("知识库更新失败。");
//		}
//	}
//}