import type { Page, PageTemplateDefinition } from "../types/session"; export const BUILTIN_PAGE_TEMPLATES: PageTemplateDefinition[] = [ { id: "repex:standard", name: "Standard Job Sheet", description: "Observations + up to two photos.", blank: false, variant: "full", source: "builtin", }, { id: "repex:photos", name: "Photo Continuation", description: "Photo-only continuation page.", blank: false, variant: "photos", source: "builtin", }, { id: "repex:blank", name: "Blank Canvas", description: "Blank white page.", blank: true, variant: "full", source: "builtin", }, ]; export function mergePageTemplates( customTemplates?: PageTemplateDefinition[], ): PageTemplateDefinition[] { const byId = new Map(); BUILTIN_PAGE_TEMPLATES.forEach((template) => { byId.set(template.id, template); }); (customTemplates ?? []).forEach((template) => { if (!template?.id) return; byId.set(template.id, { ...template, source: "custom" }); }); return Array.from(byId.values()); } export function inferPageTemplateId(page?: Page | null): string { if (page?.page_template) return page.page_template; if (page?.blank) return "repex:blank"; if (page?.variant === "photos") return "repex:photos"; return "repex:standard"; } export function resolvePageTemplate( page: Page | null | undefined, templates: PageTemplateDefinition[], ): PageTemplateDefinition { const id = inferPageTemplateId(page); return ( templates.find((template) => template.id === id) ?? BUILTIN_PAGE_TEMPLATES[0] ); } export function applyPageTemplateToPage( page: Page, template: PageTemplateDefinition, ): Page { const next: Page = { ...page, page_template: template.id, blank: Boolean(template.blank), variant: template.variant ?? "full", }; if (template.photo_layout) { next.photo_layout = template.photo_layout; } return next; } export function createCustomTemplateId() { return `tpl_${crypto.randomUUID().replace(/-/g, "")}`; }