// Transform platform GraphQL responses → frontend entity types // Platform remaps field names during sync — this layer normalizes them import type { Lead, Campaign, Ad, FollowUp, LeadActivity, Call, Patient, Appointment } from '@/types/entities'; type PlatformNode = Record; function extractEdges(data: any, entityName: string): PlatformNode[] { return data?.[entityName]?.edges?.map((e: any) => e.node) ?? []; } export function transformLeads(data: any): Lead[] { return extractEdges(data, 'leads').map((n) => ({ id: n.id, createdAt: n.createdAt, updatedAt: n.updatedAt, contactName: n.contactName ?? { firstName: '', lastName: '' }, contactPhone: n.contactPhone?.primaryPhoneNumber ? [{ number: n.contactPhone.primaryPhoneNumber, callingCode: n.contactPhone.primaryPhoneCallingCode ?? '+91' }] : [], contactEmail: n.contactEmail?.primaryEmail ? [{ address: n.contactEmail.primaryEmail }] : [], leadSource: n.source, leadStatus: n.status, priority: n.priority ?? 'NORMAL', interestedService: n.interestedService, assignedAgent: n.assignedAgent, utmSource: n.utmSource, utmMedium: n.utmMedium, utmCampaign: n.utmCampaign, utmContent: n.utmContent, utmTerm: n.utmTerm, landingPageUrl: n.landingPage?.primaryLinkUrl ?? null, referrerUrl: n.referrerUrl, leadScore: n.leadScore, spamScore: n.spamScore ?? 0, isSpam: n.isSpam ?? false, isDuplicate: n.isDuplicate ?? false, duplicateOfLeadId: null, firstContactedAt: n.firstContacted, lastContactedAt: n.lastContacted, contactAttempts: n.contactAttempts ?? 0, convertedAt: n.convertedAt, patientId: n.patientId, campaignId: n.campaignId, adId: null, aiSummary: n.aiSummary, aiSuggestedAction: n.aiSuggestedAction, })); } export function transformCampaigns(data: any): Campaign[] { return extractEdges(data, 'campaigns').map((n) => ({ id: n.id, createdAt: n.createdAt, updatedAt: n.updatedAt, campaignName: n.campaignName ?? n.name, campaignType: n.typeCustom, campaignStatus: n.status, platform: n.platform, startDate: n.startDate, endDate: n.endDate, budget: n.budget ? { amountMicros: n.budget.amountMicros, currencyCode: n.budget.currencyCode } : null, amountSpent: n.amountSpent ? { amountMicros: n.amountSpent.amountMicros, currencyCode: n.amountSpent.currencyCode } : null, impressionCount: n.impressions ?? 0, clickCount: n.clicks ?? 0, targetCount: n.targetCount ?? 0, contactedCount: n.contacted ?? 0, convertedCount: n.converted ?? 0, leadCount: n.leadsGenerated ?? 0, externalCampaignId: n.externalCampaignId, platformUrl: n.platformUrl?.primaryLinkUrl ?? null, })); } export function transformAds(data: any): Ad[] { return extractEdges(data, 'ads').map((n) => ({ id: n.id, createdAt: n.createdAt, updatedAt: n.updatedAt, adName: n.adName ?? n.name, externalAdId: n.externalAdId, adStatus: n.status, adFormat: n.format, headline: n.headline, adDescription: n.adDescription, destinationUrl: n.destinationUrl?.primaryLinkUrl ?? null, previewUrl: n.previewUrl?.primaryLinkUrl ?? null, impressions: n.impressions ?? 0, clicks: n.clicks ?? 0, conversions: n.conversions ?? 0, spend: n.spend ? { amountMicros: n.spend.amountMicros, currencyCode: n.spend.currencyCode } : null, campaignId: n.campaignId, })); } export function transformFollowUps(data: any): FollowUp[] { return extractEdges(data, 'followUps').map((n) => ({ id: n.id, createdAt: n.createdAt, followUpType: n.typeCustom, followUpStatus: n.status, scheduledAt: n.scheduledAt, completedAt: n.completedAt, priority: n.priority ?? 'NORMAL', assignedAgent: n.assignedAgent, patientId: n.patientId, callId: null, patientName: undefined, patientPhone: undefined, description: n.name, })); } export function transformLeadActivities(data: any): LeadActivity[] { return extractEdges(data, 'leadActivities').map((n) => ({ id: n.id, createdAt: n.createdAt, activityType: n.activityType, summary: n.summary, occurredAt: n.occurredAt, performedBy: n.performedBy, previousValue: n.previousValue, newValue: n.newValue, channel: n.channel, durationSeconds: n.durationSec ?? 0, outcome: n.outcome, activityNotes: null, leadId: n.leadId, })); } export function transformCalls(data: any): Call[] { return extractEdges(data, 'calls').map((n) => ({ id: n.id, createdAt: n.createdAt, callDirection: n.direction, callStatus: n.callStatus, callerNumber: n.callerNumber?.primaryPhoneNumber ? [{ number: n.callerNumber.primaryPhoneNumber, callingCode: '+91' }] : [], agentName: n.agentName, startedAt: n.startedAt, endedAt: n.endedAt, durationSeconds: n.durationSec ?? 0, recordingUrl: n.recording?.primaryLinkUrl || null, disposition: n.disposition, callNotes: null, patientId: n.patientId, appointmentId: n.appointmentId, leadId: n.leadId, })); } export function transformAppointments(data: any): Appointment[] { return extractEdges(data, 'appointments').map((n) => ({ id: n.id, createdAt: n.createdAt, scheduledAt: n.scheduledAt, durationMinutes: n.durationMin ?? 30, appointmentType: n.appointmentType, appointmentStatus: n.status, doctorName: n.doctorName, doctorId: n.doctor?.id ?? null, department: n.department, reasonForVisit: n.reasonForVisit, patientId: n.patient?.id ?? null, patientName: n.patient?.fullName ? `${n.patient.fullName.firstName} ${n.patient.fullName.lastName}`.trim() : null, patientPhone: n.patient?.phones?.primaryPhoneNumber ?? null, clinicName: n.department ?? null, })); } export function transformPatients(data: any): Patient[] { return extractEdges(data, 'patients').map((n) => ({ id: n.id, createdAt: n.createdAt, fullName: n.fullName ?? null, phones: n.phones ?? null, emails: n.emails ?? null, dateOfBirth: n.dateOfBirth ?? null, gender: n.gender ?? null, patientType: n.patientType ?? null, })); }