#!/usr/bin/env node

const { NodeDocumentationService } = require('../dist/services/node-documentation-service');

async function testService() {
  console.log('=== Testing Node Documentation Service ===\n');
  
  // Use the main database
  const service = new NodeDocumentationService('./data/nodes.db');
  
  try {
    // Test 1: List nodes
    console.log('1️⃣ Testing list nodes...');
    const nodes = await service.listNodes();
    console.log(`   Found ${nodes.length} nodes in database`);
    
    if (nodes.length === 0) {
      console.log('\n⚠️  No nodes found. Running rebuild...');
      const stats = await service.rebuildDatabase();
      console.log(`   Rebuild complete: ${stats.successful} nodes stored`);
    }
    
    // Test 2: Get specific node info (IF node)
    console.log('\n2️⃣ Testing get node info for "If" node...');
    const ifNode = await service.getNodeInfo('n8n-nodes-base.if');
    
    if (ifNode) {
      console.log('   ✅ Found IF node:');
      console.log(`      Name: ${ifNode.displayName}`);
      console.log(`      Description: ${ifNode.description}`);
      console.log(`      Has source code: ${!!ifNode.sourceCode}`);
      console.log(`      Source code length: ${ifNode.sourceCode?.length || 0} bytes`);
      console.log(`      Has documentation: ${!!ifNode.documentation}`);
      console.log(`      Has example: ${!!ifNode.exampleWorkflow}`);
      
      if (ifNode.exampleWorkflow) {
        console.log('\n   📋 Example workflow:');
        console.log(JSON.stringify(ifNode.exampleWorkflow, null, 2).substring(0, 500) + '...');
      }
    } else {
      console.log('   ❌ IF node not found');
    }
    
    // Test 3: Search nodes
    console.log('\n3️⃣ Testing search functionality...');
    
    // Search for webhook nodes
    const webhookNodes = await service.searchNodes({ query: 'webhook' });
    console.log(`\n   🔍 Search for "webhook": ${webhookNodes.length} results`);
    webhookNodes.slice(0, 3).forEach(node => {
      console.log(`      - ${node.displayName} (${node.nodeType})`);
    });
    
    // Search for HTTP nodes
    const httpNodes = await service.searchNodes({ query: 'http' });
    console.log(`\n   🔍 Search for "http": ${httpNodes.length} results`);
    httpNodes.slice(0, 3).forEach(node => {
      console.log(`      - ${node.displayName} (${node.nodeType})`);
    });
    
    // Test 4: Get statistics
    console.log('\n4️⃣ Testing database statistics...');
    const stats = service.getStatistics();
    console.log('   📊 Database stats:');
    console.log(`      Total nodes: ${stats.totalNodes}`);
    console.log(`      Nodes with docs: ${stats.nodesWithDocs}`);
    console.log(`      Nodes with examples: ${stats.nodesWithExamples}`);
    console.log(`      Trigger nodes: ${stats.triggerNodes}`);
    console.log(`      Webhook nodes: ${stats.webhookNodes}`);
    console.log(`      Total packages: ${stats.totalPackages}`);
    
    // Test 5: Category filtering
    console.log('\n5️⃣ Testing category filtering...');
    const coreNodes = await service.searchNodes({ category: 'Core Nodes' });
    console.log(`   Found ${coreNodes.length} core nodes`);
    
    console.log('\n✅ All tests completed!');
    
  } catch (error) {
    console.error('\n❌ Test failed:', error);
    process.exit(1);
  } finally {
    service.close();
  }
}

// Run tests
testService().catch(console.error);