/**
 * Copyright (c) 2024-2025 Тарабанов Александр Викторович
 * All rights reserved.
 * 
 * This software is proprietary and confidential.
 * Unauthorized copying, modification, or distribution is prohibited.
 * 
 * For licensing inquiries: info@hb3-accelerator.com
 * Website: https://hb3-accelerator.com
 * GitHub: https://github.com/HB3-ACCELERATOR
 */

// Временно устанавливаем URL для локального тестирования
process.env.VECTOR_SEARCH_URL = 'http://localhost:8001';

const ragService = require('../services/ragService');
const db = require('../db');

const TEST_TABLE_ID = 999999; // Используем числовой ID

describe('ragService full integration (DB + vector-search)', () => {
  before(async () => {
    console.log('Создаем тестовую таблицу и данные...');
    
    // Создаем тестовую таблицу
    await db.getQuery()(`
      INSERT INTO user_tables (id, name, description) 
      VALUES ($1, 'Test RAG Table', 'Test table for RAG integration')
      ON CONFLICT (id) DO NOTHING
    `, [TEST_TABLE_ID]);

    // Создаем колонки
    const columns = [
      { id: 'col_question', name: 'Question', type: 'text', purpose: 'question' },
      { id: 'col_answer', name: 'Answer', type: 'text', purpose: 'answer' },
      { id: 'col_product', name: 'Product', type: 'text', purpose: 'product' }
    ];

    for (const col of columns) {
      await db.getQuery()(`
        INSERT INTO user_columns (id, table_id, name, type, options) 
        VALUES ($1, $2, $3, $4, $5)
        ON CONFLICT (id) DO NOTHING
      `, [col.id, TEST_TABLE_ID, col.name, col.type, JSON.stringify({ purpose: col.purpose })]);
    }

    // Создаем строки
    const rows = [
      { id: 'row_1', question: 'Что такое RAG?', answer: 'Retrieval Augmented Generation', product: 'A' },
      { id: 'row_2', question: 'Что такое FAISS?', answer: 'Facebook AI Similarity Search', product: 'B' },
      { id: 'row_3', question: 'Что такое Ollama?', answer: 'Локальный inference LLM', product: 'A' }
    ];

    for (const row of rows) {
      // Создаем строку
      await db.getQuery()(`
        INSERT INTO user_rows (id, table_id, name) 
        VALUES ($1, $2, $3)
        ON CONFLICT (id) DO NOTHING
      `, [row.id, TEST_TABLE_ID, row.question]);

      // Создаем значения ячеек
      await db.getQuery()(`
        INSERT INTO user_cell_values (row_id, column_id, value) 
        VALUES ($1, $2, $3), ($1, $4, $5), ($1, $6, $7), ($1, $8, $9)
        ON CONFLICT (row_id, column_id) DO UPDATE SET value = EXCLUDED.value
      `, [
        row.id, 'col_question', row.question,
        row.id, 'col_answer', row.answer,
        row.id, 'col_product', row.product
      ]);
    }

    console.log('Тестовые данные созданы');
  });

  after(async () => {
    console.log('Очищаем тестовые данные...');
    
    // Удаляем значения ячеек
    await db.getQuery()(`
      DELETE FROM user_cell_values 
      WHERE row_id IN (SELECT id FROM user_rows WHERE table_id = $1)
    `, [TEST_TABLE_ID]);

    // Удаляем строки
    await db.getQuery()(`
      DELETE FROM user_rows WHERE table_id = $1
    `, [TEST_TABLE_ID]);

    // Удаляем колонки
    await db.getQuery()(`
      DELETE FROM user_columns WHERE table_id = $1
    `, [TEST_TABLE_ID]);

    // Удаляем таблицу
    await db.getQuery()(`
      DELETE FROM user_tables WHERE id = $1
    `, [TEST_TABLE_ID]);

    console.log('Тестовые данные очищены');
  });

  it('Полная интеграция: поиск без фильтрации', async () => {
    const result = await ragService.ragAnswer({ 
      tableId: TEST_TABLE_ID, 
      userQuestion: 'Что такое RAG?' 
    });
    
    console.log('Результат RAG:', result);
    if (!result) throw new Error('Нет результата');
    if (result.answer !== 'Retrieval Augmented Generation') {
      throw new Error(`Ответ не совпадает: ${result.answer}`);
    }
  });

  it('Полная интеграция: фильтрация по продукту', async () => {
    const result = await ragService.ragAnswer({ 
      tableId: TEST_TABLE_ID, 
      userQuestion: 'Что такое Ollama?',
      product: 'A'
    });
    
    console.log('Результат с фильтром по продукту:', result);
    if (!result) throw new Error('Нет результата');
    if (result.answer !== 'Локальный inference LLM') {
      throw new Error(`Ответ не совпадает: ${result.answer}`);
    }
  });

  it('Полная интеграция: комбинированная фильтрация', async () => {
    const result = await ragService.ragAnswer({ 
      tableId: TEST_TABLE_ID, 
      userQuestion: 'Что такое RAG?',
      product: 'A'
    });
    
    console.log('Результат с комбинированной фильтрацией:', result);
    if (!result) throw new Error('Нет результата');
    if (result.answer !== 'Retrieval Augmented Generation') {
      throw new Error(`Ответ не совпадает: ${result.answer}`);
    }
  });

  it('Полная интеграция: проверка порога score', async () => {
    const result = await ragService.ragAnswer({ 
      tableId: TEST_TABLE_ID, 
      userQuestion: 'Что такое Ollama?',
      threshold: 0.95
    });
    
    console.log('Результат с высоким порогом:', result);
    // С высоким порогом может не быть результата, это нормально
    if (result && result.score < 0.95) {
      throw new Error(`Score слишком низкий: ${result.score}`);
    }
  });
}); 