import { prisma as db } from "@repo/db/client"; export type TwilioSettingsData = { accountSid: string; authToken: string; phoneNumber: string; greetingMessage?: string | null; }; export type CommunicationCreateData = { patientId: number; userId?: number; channel: "sms" | "voice"; direction: "outbound" | "inbound"; status: "queued" | "sent" | "delivered" | "failed" | "completed" | "busy" | "no_answer"; body?: string; callDuration?: number; twilioSid?: string; }; export const twilioStorage = { async getTwilioSettings(userId: number) { return db.twilioSettings.findUnique({ where: { userId } }); }, async upsertTwilioSettings(userId: number, data: TwilioSettingsData) { return db.twilioSettings.upsert({ where: { userId }, update: data, create: { userId, ...data }, }); }, async createCommunication(data: CommunicationCreateData) { return db.communication.create({ data: data as any }); }, async getCommunicationsByPatient(patientId: number) { return db.communication.findMany({ where: { patientId }, orderBy: { createdAt: "asc" }, }); }, async getTemplates(userId: number): Promise> { const settings = await db.twilioSettings.findUnique({ where: { userId } }); if (!settings?.templates) return {}; return settings.templates as Record; }, async saveTemplate(userId: number, key: string, body: string) { const settings = await db.twilioSettings.findUnique({ where: { userId } }); const existing = (settings?.templates as Record) || {}; const updated = { ...existing, [key]: body }; return db.twilioSettings.upsert({ where: { userId }, update: { templates: updated }, create: { userId, accountSid: "", authToken: "", phoneNumber: "", templates: updated }, }); }, async getAiChatTemplates(userId: number): Promise> { const settings = await db.twilioSettings.findUnique({ where: { userId } }); const all = (settings?.templates as Record) || {}; return { reminderGreeting: all["_ai_chat_reminder_greeting"] ?? "", newPatientGreeting: all["_ai_chat_new_patient_greeting"] ?? "", generalFallback: all["_ai_chat_general_fallback"] ?? "", }; }, async saveAiChatTemplates(userId: number, templates: { reminderGreeting?: string; newPatientGreeting?: string; generalFallback?: string }) { const settings = await db.twilioSettings.findUnique({ where: { userId } }); const existing = (settings?.templates as Record) || {}; const updated: Record = { ...existing }; if (templates.reminderGreeting !== undefined) updated["_ai_chat_reminder_greeting"] = templates.reminderGreeting; if (templates.newPatientGreeting !== undefined) updated["_ai_chat_new_patient_greeting"] = templates.newPatientGreeting; if (templates.generalFallback !== undefined) updated["_ai_chat_general_fallback"] = templates.generalFallback; return db.twilioSettings.upsert({ where: { userId }, update: { templates: updated }, create: { userId, accountSid: "", authToken: "", phoneNumber: "", templates: updated }, }); }, async getRecentCommunicationsByUser(userId: number, limit = 20) { return db.communication.findMany({ where: { patient: { userId } }, orderBy: { createdAt: "desc" }, take: limit, include: { patient: { select: { id: true, firstName: true, lastName: true, phone: true } }, }, }); }, };