/**
 * Dify客户端测试脚本
 * 
 * 用于测试Dify API的连接和基本功能
 */

import { DifyClient } from '../clients/DifyClient.js';

// 创建客户端实例
const client = new DifyClient();

// 测试知识库ID（测试时会创建）
let testDatasetId: string;
let testDocumentId: string;

/**
 * 测试1：创建知识库
 */
async function testCreateDataset() {
  console.log('\n========== 测试1：创建知识库 ==========');
  try {
    const result = await client.createDataset({
      name: '测试知识库 - ' + Date.now(),
      description: '这是一个测试知识库，用于验证API功能',
      indexing_technique: 'high_quality',
    });
    
    testDatasetId = result.id;
    console.log('✅ 创建成功');
    console.log('知识库ID:', result.id);
    console.log('知识库名称:', result.name);
    console.log('创建时间:', new Date(result.created_at * 1000).toLocaleString());
  } catch (error: any) {
    console.error('❌ 创建失败:', error.message);
    throw error;
  }
}

/**
 * 测试2：获取知识库列表
 */
async function testGetDatasets() {
  console.log('\n========== 测试2：获取知识库列表 ==========');
  try {
    const result = await client.getDatasets(1, 10);
    console.log('✅ 获取成功');
    console.log(`找到 ${result.total} 个知识库`);
    
    if (result.data.length > 0) {
      console.log('前3个知识库:');
      result.data.slice(0, 3).forEach((dataset, index) => {
        console.log(`  ${index + 1}. ${dataset.name} (ID: ${dataset.id})`);
        console.log(`     - 文档数量: ${dataset.document_count}`);
        console.log(`     - 创建时间: ${new Date(dataset.created_at * 1000).toLocaleString()}`);
      });
    }
  } catch (error: any) {
    console.error('❌ 获取失败:', error.message);
    throw error;
  }
}

/**
 * 测试3：获取知识库详情
 */
async function testGetDataset() {
  console.log('\n========== 测试3：获取知识库详情 ==========');
  try {
    const result = await client.getDataset(testDatasetId);
    console.log('✅ 获取成功');
    console.log('知识库名称:', result.name);
    console.log('描述:', result.description);
    console.log('文档数量:', result.document_count);
    console.log('索引技术:', result.indexing_technique);
  } catch (error: any) {
    console.error('❌ 获取失败:', error.message);
    throw error;
  }
}

/**
 * 测试4：上传文件并创建文档
 */
async function testUploadDocument() {
  console.log('\n========== 测试4：上传文档 ==========');
  try {
    // 创建一个测试文本文件
    const testContent = `
# 临床研究测试文档

## 研究背景
这是一个用于测试Dify API的示例文档。

## 研究目标
验证以下功能：
1. 文件上传功能
2. 文档索引功能
3. 知识库检索功能

## 研究方法
使用自动化测试脚本验证API的各项功能。

## 预期结果
所有测试应该通过，并返回正确的数据。
    `.trim();

    const testBuffer = Buffer.from(testContent, 'utf-8');
    const filename = 'test-document.txt';

    console.log('正在上传文档...');
    const document = await client.uploadAndProcessDocument(
      testDatasetId,
      testBuffer,
      filename
    );

    testDocumentId = document.id;
    console.log('✅ 上传成功');
    console.log('文档ID:', document.id);
    console.log('文档名称:', document.name);
    console.log('处理状态:', document.indexing_status);
    console.log('字符数:', document.word_count);
    console.log('Token数:', document.tokens);
  } catch (error: any) {
    console.error('❌ 上传失败:', error.message);
    throw error;
  }
}

/**
 * 测试5：获取文档列表
 */
async function testGetDocuments() {
  console.log('\n========== 测试5：获取文档列表 ==========');
  try {
    const result = await client.getDocuments(testDatasetId, 1, 10);
    console.log('✅ 获取成功');
    console.log(`找到 ${result.total} 个文档`);
    
    if (result.data.length > 0) {
      console.log('文档列表:');
      result.data.forEach((doc, index) => {
        console.log(`  ${index + 1}. ${doc.name}`);
        console.log(`     - 状态: ${doc.indexing_status}`);
        console.log(`     - 字符数: ${doc.word_count}`);
        console.log(`     - Token数: ${doc.tokens}`);
      });
    }
  } catch (error: any) {
    console.error('❌ 获取失败:', error.message);
    throw error;
  }
}

/**
 * 测试6：知识库检索
 */
async function testRetrieveKnowledge() {
  console.log('\n========== 测试6：知识库检索 ==========');
  try {
    const result = await client.retrieveKnowledge(
      testDatasetId,
      '研究目标是什么？',
      {
        retrieval_model: {
          search_method: 'semantic_search',
          top_k: 3,
        },
      }
    );

    console.log('✅ 检索成功');
    console.log('查询:', result.query.content);
    console.log(`找到 ${result.records.length} 条结果`);
    
    result.records.forEach((record, index) => {
      console.log(`\n结果 ${index + 1}:`);
      console.log(`  文档: ${record.document_name}`);
      console.log(`  相似度得分: ${record.score.toFixed(4)}`);
      console.log(`  内容片段: ${record.content.substring(0, 100)}...`);
    });
  } catch (error: any) {
    console.error('❌ 检索失败:', error.message);
    // 不抛出错误，因为可能是文档还未完全索引
  }
}

/**
 * 测试7：删除文档
 */
async function testDeleteDocument() {
  console.log('\n========== 测试7：删除文档 ==========');
  try {
    await client.deleteDocument(testDatasetId, testDocumentId);
    console.log('✅ 删除文档成功');
  } catch (error: any) {
    console.error('❌ 删除文档失败:', error.message);
    // 不抛出错误，继续后续测试
  }
}

/**
 * 测试8：删除知识库
 */
async function testDeleteDataset() {
  console.log('\n========== 测试8：删除知识库 ==========');
  try {
    await client.deleteDataset(testDatasetId);
    console.log('✅ 删除知识库成功');
  } catch (error: any) {
    console.error('❌ 删除知识库失败:', error.message);
    throw error;
  }
}

/**
 * 运行所有测试
 */
async function runAllTests() {
  console.log('========================================');
  console.log('     Dify API 客户端测试');
  console.log('========================================');
  console.log('开始时间:', new Date().toLocaleString());

  try {
    await testCreateDataset();
    await testGetDatasets();
    await testGetDataset();
    await testUploadDocument();
    await testGetDocuments();
    
    // 等待5秒让文档完全索引
    console.log('\n等待5秒让文档完全索引...');
    await new Promise((resolve) => setTimeout(resolve, 5000));
    
    await testRetrieveKnowledge();
    await testDeleteDocument();
    await testDeleteDataset();

    console.log('\n========================================');
    console.log('✅ 所有测试通过！');
    console.log('========================================');
    console.log('结束时间:', new Date().toLocaleString());
  } catch (error: any) {
    console.log('\n========================================');
    console.log('❌ 测试失败！');
    console.log('========================================');
    console.error('错误信息:', error.message);
    if (error.code) {
      console.error('错误代码:', error.code);
    }
    if (error.status) {
      console.error('HTTP状态码:', error.status);
    }
    process.exit(1);
  }
}

// 执行测试
runAllTests();

