import { StructuredTool, ToolRunnableConfig } from '@langchain/core/tools';
import { z } from 'zod';
import { CallbackManagerForToolRun } from '@langchain/core/callbacks/manager';
import { getVectorStore } from './vector-store';

export class KnowledgeBaseTool extends StructuredTool {
    name = 'search_knowledge_base';
    description = 'Ищет информацию в базе знаний компании о процессах, оплатах, подаче заявок, правилах и документах УК. Используй этот инструмент для вопросов, требующих специфических знаний о компании.';
    
    schema = z.object({
        query: z.string().describe('Поисковый запрос для поиска в базе знаний'),
    });

    protected async _call(
        arg: z.infer<typeof this.schema>, 
        runManager?: CallbackManagerForToolRun, 
        parentConfig?: ToolRunnableConfig<Record<string, any>>
    ): Promise<string> {
        try {
            const vectorStore = getVectorStore();
            const retriever = vectorStore.asRetriever({
                k: 5
            });

            const relevantDocs = await retriever.getRelevantDocuments(arg.query);

            if (!relevantDocs || relevantDocs.length === 0) {
                return 'В базе знаний не найдено информации по данному запросу. Возможно, стоит переформулировать вопрос или обратиться к специалисту.';
            }

            const formattedDocs = relevantDocs.map((doc, index) => {
                return `Документ ${index + 1}:\n${doc.pageContent}\n`;
            }).join('\n---\n');

            return `Найдена следующая информация в базе знаний компании:\n\n${formattedDocs}\n\nИспользуй эту информацию для ответа на вопрос пользователя.`;

        } catch (error) {
            return 'Произошла ошибка при поиске в базе знаний. Попробуйте переформулировать запрос.';
        }
    }
} 