import { effectiveDefault, holdsRelation, isUnique, supportsChoices, supportsLimits, trimmedOptions, type BuilderField, type BuilderForm, } from '@/lib/schemaBuilderModel' import type { RelationDefinition } from '@/lib/relationField' export interface PayloadField { key: string label: string type: string required: boolean unique: boolean default: string | number | boolean | null min: number | string | null max: number | string | null options: string[] relation: RelationDefinition | null } export interface ContentTypePayload { key: string name: string fields: PayloadField[] } function limit(field: BuilderField, text: string) { if (!supportsLimits(field.type) || text.trim() === '') { return null } return field.type === 'date' ? text : Number(text) } function defaultFor(field: BuilderField) { if (field.type === 'boolean') { return field.defaultOn ? true : null } const given = effectiveDefault(field) if (given === '') { return null } return field.type === 'number' ? Number(given) : given } export interface UpdatePayload { name: string icon: string | null fields: PayloadField[] } function relationFor(field: BuilderField): RelationDefinition | null { return holdsRelation(field.type) ? { content_type: field.relationType, kind: field.relationKind } : null } export function payloadField(field: BuilderField): PayloadField { return { key: field.key, label: field.label.trim(), type: field.type, required: field.required, unique: isUnique(field), default: defaultFor(field), min: limit(field, field.min), max: limit(field, field.max), options: supportsChoices(field.type) ? trimmedOptions(field) : [], relation: relationFor(field), } } export function buildPayload(form: BuilderForm): ContentTypePayload { return { key: form.key, name: form.name.trim(), fields: form.fields.map(payloadField), } } export function buildUpdatePayload(form: BuilderForm, icon: string | null): UpdatePayload { return { name: form.name.trim(), icon, fields: form.fields.map(payloadField), } }