//package com.gxwebsoft.ai.util;
//
//import com.aliyun.bailian20231229.models.*;
//import com.fasterxml.jackson.databind.ObjectMapper;
//
//import java.io.File;
//import java.io.FileInputStream;
//import java.net.HttpURLConnection;
//import java.net.URL;
//import java.security.MessageDigest;
//import java.util.*;
//import java.util.concurrent.TimeUnit;
//
///**
// * 创建知识库
// * @author GIIT-YC
// *
// */
//public class KnowledgeBaseCreate {
//	
//	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();
//	}
//
//	/**
//	 * 计算文档的MD5值。
//	 *
//	 * @param filePath 文档本地路径
//	 * @return 文档的MD5值
//	 * @throws Exception 如果计算过程中发生错误
//	 */
//	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);
//	}
//
//	/**
//	 * 初始化客户端（Client）。
//	 *
//	 * @return 配置好的客户端对象
//	 */
//	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);
//	}
//
//	/**
//	 * 申请文档上传租约。
//	 *
//	 * @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        客户端对象
//	 * @param workspaceId   业务空间ID
//	 * @param fileId        文档ID
//	 * @param name          知识库名称
//	 * @param structureType 知识库的数据类型
//	 * @param sourceType    应用数据的数据类型，支持类目类型和文档类型
//	 * @param sinkType      知识库的向量存储类型
//	 * @return 阿里云百炼服务的响应对象
//	 */
//	public static CreateIndexResponse createIndex(com.aliyun.bailian20231229.Client client, String workspaceId,
//			String fileId, String name, String structureType, String sourceType, String sinkType) throws Exception {
//		Map<String, String> headers = new HashMap<>();
//		com.aliyun.bailian20231229.models.CreateIndexRequest createIndexRequest = new com.aliyun.bailian20231229.models.CreateIndexRequest();
//		createIndexRequest.setStructureType(structureType);
//		createIndexRequest.setName(name);
//		createIndexRequest.setSourceType(sourceType);
//		createIndexRequest.setSinkType(sinkType);
//		createIndexRequest.setDocumentIds(Collections.singletonList(fileId));
//		com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
//		return client.createIndexWithOptions(workspaceId, createIndexRequest, headers, runtime);
//	}
//
//	/**
//	 * 向阿里云百炼服务提交索引任务。
//	 *
//	 * @param client      客户端对象
//	 * @param workspaceId 业务空间ID
//	 * @param indexId     知识库ID
//	 * @return 阿里云百炼服务的响应对象
//	 */
//	public static SubmitIndexJobResponse submitIndex(com.aliyun.bailian20231229.Client client, String workspaceId,
//			String indexId) throws Exception {
//		Map<String, String> headers = new HashMap<>();
//		com.aliyun.bailian20231229.models.SubmitIndexJobRequest submitIndexJobRequest = new com.aliyun.bailian20231229.models.SubmitIndexJobRequest();
//		submitIndexJobRequest.setIndexId(indexId);
//		com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
//		return client.submitIndexJobWithOptions(workspaceId, submitIndexJobRequest, 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 filePath    文档本地路径
//	 * @param workspaceId 业务空间ID
//	 * @param name        知识库名称
//	 * @return 如果成功，返回知识库ID；否则返回 null
//	 */
//	public static String createKnowledgeBase(String filePath, String workspaceId, String name) {
//		// 设置默认值
//		String categoryId = "default";
//		String parser = "DASHSCOPE_DOCMIND";
//		String sourceType = "DATA_CENTER_FILE";
//		String structureType = "unstructured";
//		String sinkType = "DEFAULT";
//		try {
//			// 步骤1：初始化客户端（Client）
//			System.out.println("步骤1：初始化Client");
//			com.aliyun.bailian20231229.Client client = createClient();
//
//			// 步骤2：准备文档信息
//			System.out.println("步骤2：准备文档信息");
//			String fileName = new File(filePath).getName();
//			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 (status.equals("INIT")) {
//					System.out.println("文档待解析，请稍候...");
//				} else if (status.equals("PARSING")) {
//					System.out.println("文档解析中，请稍候...");
//				} else if (status.equals("PARSE_SUCCESS")) {
//					System.out.println("文档解析完成！");
//					break;
//				} else {
//					System.out.println("未知的文档状态：" + status + "，请联系技术支持。");
//					return null;
//				}
//				TimeUnit.SECONDS.sleep(5);
//			}
//
//			// 步骤7：初始化知识库
//			System.out.println("步骤7：在阿里云百炼中创建知识库");
//			CreateIndexResponse indexResponse = createIndex(client, workspaceId, fileId, name, structureType,
//					sourceType, sinkType);
//			String indexId = indexResponse.getBody().getData().getId();
//
//			// 步骤8：提交索引任务
//			System.out.println("步骤8：向阿里云百炼提交索引任务");
//			SubmitIndexJobResponse submitResponse = submitIndex(client, workspaceId, indexId);
//			String jobId = submitResponse.getBody().getData().getId();
//
//			// 步骤9：获取索引任务状态
//			System.out.println("步骤9：获取阿里云百炼索引任务状态");
//			while (true) {
//				GetIndexJobStatusResponse getStatusResponse = getIndexJobStatus(client, workspaceId, jobId, indexId);
//				String status = getStatusResponse.getBody().getData().getStatus();
//				System.out.println("当前索引任务状态：" + status);
//
//				if (status.equals("COMPLETED")) {
//					break;
//				}
//				TimeUnit.SECONDS.sleep(5);
//			}
//
//			System.out.println("阿里云百炼知识库创建成功！");
//			return indexId;
//
//		} catch (Exception e) {
//			System.out.println("发生错误：" + e.getMessage());
//			e.printStackTrace();
//			return null;
//		}
//	}
//
//	/**
//	 * 主函数。
//	 */
//	public static void main(String[] args) {
//		Scanner scanner = new Scanner(System.in);
//		if (!checkEnvironmentVariables()) {
//			return;
//		}
//
//		System.out.print("请输入您需要上传文档的实际本地路径（以Linux为例：/xxx/xxx/阿里云百炼系列手机产品介绍.docx）：");
//		String filePath = scanner.nextLine();
//
//		System.out.print("请为您的知识库输入一个名称：");
//		String kbName = scanner.nextLine();
//
//		String workspaceId = System.getenv("WORKSPACE_ID");
//		String result = createKnowledgeBase(filePath, workspaceId, kbName);
//		if (result != null) {
//			System.out.println("知识库ID: " + result);
//		}
//	}
//}
