import { Injectable, NotFoundException } from '@nestjs/common'; import { PrismaService } from '../../common/prisma.service'; @Injectable() export class SupportService { constructor(private prisma: PrismaService) {} getFaqCategories() { return this.prisma.faqCategory.findMany({ include: { _count: { select: { articles: true } } } }); } getFaqArticles(categoryId: string) { return this.prisma.faqArticle.findMany({ where: { categoryId }, orderBy: { rank: 'asc' } }); } startConversation(userId: string) { return this.prisma.supportConversation.create({ data: { userId } }); } async sendMessage(conversationId: string, sender: 'USER' | 'BOT' | 'AGENT', text: string) { const conv = await this.prisma.supportConversation.findUnique({ where: { id: conversationId } }); if (!conv) throw new NotFoundException('Conversation not found'); const message = await this.prisma.supportMessage.create({ data: { conversationId, sender, text } }); if (sender === 'USER') await this.prisma.supportMessage.create({ data: { conversationId, sender: 'BOT', text: this.getBotReply(text) } }); return message; } async getConversation(conversationId: string) { const conv = await this.prisma.supportConversation.findUnique({ where: { id: conversationId }, include: { messages: { orderBy: { createdAt: 'asc' } } } }); if (!conv) throw new NotFoundException('Conversation not found'); return conv; } private getBotReply(text: string): string { const lower = text.toLowerCase(); if (lower.includes('cancel') || lower.includes('refund')) return 'To cancel or refund, go to Bookings and select the booking. Refunds are processed within 3-5 business days.'; if (lower.includes('miss') || lower.includes('missed')) return 'If you missed your train, please check the Disruptions section for alternative options.'; if (lower.includes('seat')) return 'You can select or change seats during booking. Seat changes after confirmation may incur a fee.'; return 'Thank you for contacting EDR support. An agent will assist you shortly.'; } }