import { StructuredTool, ToolRunnableConfig } from '@langchain/core/tools';
import { z } from 'zod';
import { CallbackManagerForToolRun } from '@langchain/core/callbacks/manager';
import { getSupabaseClient } from '../supabaseClient';

export class CreateTicketTool extends StructuredTool {
    name = 'create_ticket';
    description = 'Создает заявку в системе. ВАЖНО: используй этот инструмент ТОЛЬКО после получения явного согласия пользователя на создание заявки с конкретным текстом.';
    
    schema = z.object({
        title: z.string().describe('Заголовок заявки'),
        description: z.string().describe('Подробное описание проблемы'),
        category: z.string().describe('Категория заявки (например: ремонт, уборка, техническая_поддержка, жалоба)'),
    });

    private userId: string;
    private apartmentId: string;

    constructor(userId: string, apartmentId: string) {
        super();
        this.userId = userId;
        this.apartmentId = apartmentId;
    }

    protected async _call(
        arg: z.infer<typeof this.schema>, 
        runManager?: CallbackManagerForToolRun, 
        parentConfig?: ToolRunnableConfig<Record<string, any>>
    ): Promise<string> {
        try {
            if (!this.apartmentId) {
                return 'Не удалось определить вашу квартиру. Обратитесь к администратору для создания заявки.';
            }

            const supabase = getSupabaseClient();
            
            const { data: ticket, error } = await supabase
                .from('tickets')
                .insert({
                    user_id: this.userId,
                    apartment_id: this.apartmentId,
                    title: arg.title,
                    description: arg.description,
                    category: arg.category,
                    status: 'open'
                })
                .select()
                .single();

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

            return `Заявка успешно создана! 
Номер заявки: ${ticket.id}
Заголовок: ${ticket.title}
Статус: Открыта
Дата создания: ${new Date(ticket.created_at).toLocaleString('ru-RU')}

Ваша заявка принята в работу. Мы свяжемся с вами в ближайшее время.`;

        } catch (error) {
            return 'Произошла техническая ошибка при создании заявки. Пожалуйста, попробуйте позже.';
        }
    }
} 