#!/bin/bash

# Test script for RAG-based integrations

# Set environment variables for testing
export KANBN_ENV=test
export DEBUG=true

# Function to print info message
print_info() {
  echo -e "\033[0;34m ℹ️ $1\033[0m"
}

# Function to print success message
print_success() {
  echo -e "\033[0;32m ✅ $1\033[0m"
}

# Function to print error message
print_error() {
  echo -e "\033[0;31m ❌ $1\033[0m"
  exit 1
}

print_info "Starting Kanbn RAG Integrations Test"

# Create a test directory
TEST_DIR="/tmp/kanbn_rag_test_$(date +%s)"
mkdir -p "$TEST_DIR"
cd "$TEST_DIR" || exit 1

print_info "Testing in: $TEST_DIR"

# Check for Ollama
print_info "Checking for Ollama..."
if command -v ollama >/dev/null 2>&1; then
  print_success "Ollama is installed"

  # Check if Ollama is running
  if curl -s http://localhost:11434/api/tags >/dev/null 2>&1; then
    print_success "Ollama is running"
  else
    print_info "Starting Ollama service..."
    ollama serve &
    sleep 5
    print_success "Ollama started"
  fi

  # Check for an embedding model
  if ollama list | grep -q "llama3"; then
    print_success "Embedding model found: llama3"
  else
    print_info "Pulling embedding model..."
    ollama pull llama3:8b
    print_success "Embedding model pulled"
  fi
else
  print_info "Ollama not available - tests will use fallback embedding method"
fi

# Initialize kanbn board
print_info "Initializing Kanbn board..."
NODE_OPTIONS=--no-deprecation kanbn init --name "NPCForge" --description "A tool for RPG/DMs to generate deep NPCs with motivations, accents, secret backstories"

# Check if kanbn was initialized
if [ -d ".kanbn" ]; then
  print_success "Board initialized"
else
  print_error "Board initialization failed"
fi

# Create some tasks
print_info "Creating test tasks..."

# Add high priority tasks with explicit error checking
NODE_OPTIONS=--no-deprecation kanbn add "npc-generator-core" \
    --name "Create NPC generation engine" \
    --description "Develop the core algorithm for generating NPCs with consistent personalities and backstories" \
    --column "Backlog" \
    --tags "backend,ai,high-priority"

NODE_OPTIONS=--no-deprecation kanbn add "character-sheet-ui" \
    --name "Design character sheet UI" \
    --description "Create wireframes and mockups for the NPC character sheet display" \
    --column "Backlog" \
    --tags "frontend,design,high-priority"

print_success "Test tasks created"

# Test listing integrations (should be empty at first)
print_info "Testing integrations list command..."
NODE_OPTIONS=--no-deprecation kanbn integrations --list

# Add game systems integration
print_info "Adding game systems integration..."
NODE_OPTIONS=--no-deprecation kanbn integrations --add --name game-systems --content "# RPG Game Systems Reference

## Dungeons & Dragons 5E
- **Character Stats**: STR, DEX, CON, INT, WIS, CHA (range 3-18)
- **Key NPC Elements**: Alignment (Lawful/Neutral/Chaotic + Good/Neutral/Evil), Background, Class, Race
- **Common Races**: Human, Elf, Dwarf, Halfling, Gnome, Half-Orc, Tiefling

## Pathfinder 2E
- **Character Stats**: STR, DEX, CON, INT, WIS, CHA (usually +4 to -4 modifier)
- **Key NPC Elements**: Ancestry, Background, Class, Heritage
- **Common Ancestries**: Human, Elf, Dwarf, Gnome, Goblin, Halfling

## Call of Cthulhu
- **Character Stats**: STR, CON, SIZ, DEX, APP, INT, POW, EDU
- **Key NPC Elements**: Occupation, Connections, Backstory Trauma
- **Era Settings**: 1890s, 1920s, Modern Day

## Vampire: The Masquerade
- **Character Stats**: Physical (Strength, Dexterity, Stamina), Social (Charisma, Manipulation, Appearance), Mental (Perception, Intelligence, Wits)
- **Key NPC Elements**: Clan, Generation, Humanity, Disciplines
- **Common Clans**: Brujah, Gangrel, Malkavian, Nosferatu, Toreador, Tremere, Ventrue"

if [ $? -eq 0 ]; then
  print_success "Added game systems integration successfully"
else
  print_error "Failed to add game systems integration"
fi

# Add personality traits integration
print_info "Adding personality traits integration..."
NODE_OPTIONS=--no-deprecation kanbn integrations --add --name personality-traits --content "# NPC Personality Traits Reference

## Core Personality Dimensions
- **Openness**: Curiosity, Creativity, Open-mindedness vs. Conventional, Traditional
- **Conscientiousness**: Organized, Responsible, Disciplined vs. Spontaneous, Carefree
- **Extraversion**: Outgoing, Energetic, Assertive vs. Reserved, Solitary, Quiet
- **Agreeableness**: Cooperative, Compassionate, Trusting vs. Competitive, Suspicious
- **Neuroticism**: Anxious, Sensitive, Moody vs. Confident, Stable, Resilient

## Character Flaws
- **Pride**: Excessive self-esteem, arrogance, unwillingness to admit mistakes
- **Greed**: Excessive desire for wealth, possessions, or power
- **Wrath**: Quick to anger, vengeful, holds grudges
- **Envy**: Resentful of others' success or possessions
- **Lust**: Overwhelming desire (not just sexual, but for any pleasure)
- **Gluttony**: Excessive indulgence, inability to moderate consumption
- **Sloth**: Laziness, apathy, unwillingness to act or change"

if [ $? -eq 0 ]; then
  print_success "Added personality traits integration successfully"
else
  print_error "Failed to add personality traits integration"
fi

# List integrations to verify they were added
print_info "Listing integrations after adding..."
NODE_OPTIONS=--no-deprecation kanbn integrations --list

# Add repository content as integrations
print_info "Adding repository content as integrations..."

# Add README.md as integration
if [ -f "README.md" ]; then
  NODE_OPTIONS=--no-deprecation kanbn integrations --add --name readme-content --content "$(cat README.md)"
  print_success "Added README.md as integration"
fi

# Add repository structure as integration
repo_structure=$(find . -type f -not -path "*/\.*" | sort | head -n 50)
NODE_OPTIONS=--no-deprecation kanbn integrations --add --name "repo-structure" --content "$repo_structure"
print_success "Added repository structure as integration"

# Add key JavaScript files as integrations
for file in $(find . -name "*.js" -type f | grep -v "node_modules" | head -n 3); do
  if [ -f "$file" ]; then
    filename=$(basename "$file")
    integration_name="code-${filename}"
    NODE_OPTIONS=--no-deprecation kanbn integrations --add --name "$integration_name" --content "$(cat "$file")"
    print_success "Added source code file $filename as integration"
  fi
done

# Test the RAG functionality with a specific query
print_info "Testing chat with game systems integration (simple query)..."
NODE_OPTIONS=--no-deprecation kanbn chat --message "Describe D&D 5E." --integration game-systems --quiet

# Check chat with multiple integrations
print_info "Testing chat with all integrations (complex query)..."
NODE_OPTIONS=--no-deprecation kanbn chat --message "What are some interesting character personality traits?" --with-integrations --quiet

# Test repository context awareness
print_info "Testing repository context awareness..."
NODE_OPTIONS=--no-deprecation kanbn chat --message "What files are in this repository?" --with-integrations --quiet

# Test README content awareness
print_info "Testing README content awareness..."
NODE_OPTIONS=--no-deprecation kanbn chat --message "What does the README.md file contain?" --with-integrations --quiet

# Test vector search with specific query
print_info "Testing direct vector search with RAGManager..."
cat > /tmp/test_rag_search.js << EOL
const path = require('path');
const RAGManager = require(path.join(process.env.KANBN_ROOT || process.cwd(), 'src/lib/rag-manager'));
const util = require('util');

async function testRagSearch() {
  console.log('Creating RAG Manager instance...');
  const ragManager = new RAGManager({paths: {kanbn: '${TEST_DIR}/.kanbn'}});

  console.log('Initializing RAG Manager...');
  await ragManager.initialize();

  console.log('Loading integrations...');
  await ragManager.loadIntegrations();

  console.log('Performing vector search for: "character stats in D&D"');
  const results = await ragManager.getRelevantContent('character stats in D&D', 3);

  console.log('Search results:');
  console.log(results);
}

testRagSearch()
  .then(() => console.log('Test completed successfully'))
  .catch(err => console.error('Test failed:', err));
EOL

NODE_OPTIONS=--no-deprecation node /tmp/test_rag_search.js

print_info "All tests completed successfully"
print_info "Your test environment is available at: $TEST_DIR"
print_info "To chat with integrations: cd $TEST_DIR && kanbn chat --with-integrations"
print_info "To chat with specific integration: cd $TEST_DIR && kanbn chat --integration game-systems"

# Cleanup tempfiles
rm -f /tmp/test_rag_search.js
