import type { CodeableConcept, HealthcareService, Reference, Schedule } from 'fhir/r4'; import { applyRefSelfBookable, getRefSelfBookableOverride, overrideToChoice, type SelfBookableChoice, } from '../config/serviceSelfBookable'; // Resolve selected HealthcareService ids the services (for Schedule.actor refs + derived serviceType). export const resolveServices = (serviceIds: string[] | undefined, services: HealthcareService[]): HealthcareService[] => (serviceIds ?? []) .map((id) => services.find((service) => service.id === id)) .filter((service): service is HealthcareService => Boolean(service)); // The block-level self-booking override rides on each HealthcareService actor; booking reads it before the // practitioner and org levels. Absent in `overrides` (or undefined) means Default: no extension, inherit. export const toServiceActors = ( services: HealthcareService[], overrides?: Record, ): Reference[] => services.map((service) => applyRefSelfBookable( { reference: `HealthcareService/${service.id}`, display: service.name }, overrides?.[service.id as string], ), ); // The choice stored on each of a saved block's service actors, for seeding the block form. export const readBlockSelfBookingChoices = (schedule?: Schedule): Record => Object.fromEntries( (schedule?.actor ?? []) .filter((ref) => ref.reference?.startsWith('HealthcareService/')) .map((ref) => [ref.reference!.split('/').pop() as string, overrideToChoice(getRefSelfBookableOverride(ref))]), ); export const toServiceTypeConcepts = (services: HealthcareService[]): CodeableConcept[] => services.flatMap((service) => service.type ?? []);