import type { CompletionDocTemplateOption, LinkedServiceTemplate, Service, ServiceWorkOrderType, } from "@/domain/services/types/service"; function asRecord(raw: unknown): Record { return typeof raw === "object" && raw !== null ? (raw as Record) : {}; } function readString(record: Record, ...keys: string[]): string { for (const key of keys) { const value = record[key]; if (typeof value === "string") return value.trim(); if (typeof value === "number") return String(value); } return ""; } function readId(record: Record): string | number { const value = record.id ?? record.Id; return typeof value === "string" || typeof value === "number" ? value : ""; } function readBool(record: Record, ...keys: string[]): boolean { for (const key of keys) { const value = record[key]; if (typeof value === "boolean") return value; } return false; } function mapWorkOrderType(value: unknown): ServiceWorkOrderType | null { if (typeof value === "number") { return value === 2 ? "PM" : value === 3 ? "Emergency" : value === 6 ? "Reactive" : null; } if (typeof value !== "string") return null; const normalized = value.trim().toLowerCase(); return normalized === "pm" || normalized === "preventivemaintenance" ? "PM" : normalized === "emergency" ? "Emergency" : normalized === "reactive" ? "Reactive" : null; } function mapTemplate(raw: unknown): LinkedServiceTemplate | null { if (!raw) return null; const record = asRecord(raw); const id = readId(record); return id === "" ? null : { id, name: readString(record, "name", "Name") }; } export function mapService(raw: unknown): Service { const record = asRecord(raw); const types = record.supportedWorkOrderTypes ?? record.SupportedWorkOrderTypes; return { id: readId(record), name: readString(record, "name", "Name"), trade: readString(record, "trade", "Trade"), iconKey: readString(record, "iconKey", "IconKey"), requiresCompletionDocument: readBool( record, "requiresCompletionDocument", "RequiresCompletionDocument", ), completionDocTemplate: mapTemplate(record.completionDocTemplate ?? record.CompletionDocTemplate) ?? mapTemplate({ id: record.completionDocTemplateId ?? record.CompletionDocTemplateId, }), isActive: readBool(record, "isActive", "IsActive"), supportedWorkOrderTypes: Array.isArray(types) ? types.flatMap((value) => { const mapped = mapWorkOrderType(value); return mapped ? [mapped] : []; }) : [], }; } export function mapServices(raw: unknown): Service[] { const items = asRecord(raw); const payload = Array.isArray(raw) ? raw : (items.items ?? items.Items ?? items.data ?? items.Data); return Array.isArray(payload) ? payload.map(mapService).filter((service) => service.id !== "") : []; } export function mapCompletionDocTemplates(raw: unknown): CompletionDocTemplateOption[] { const payload = Array.isArray(raw) ? raw : (() => { const record = asRecord(raw); return record.items ?? record.Items ?? record.data ?? record.Data; })(); return Array.isArray(payload) ? payload.flatMap((item) => { const record = asRecord(item); const id = readId(record); return id === "" ? [] : [ { id, name: readString(record, "name", "Name"), } satisfies CompletionDocTemplateOption, ]; }) : []; }