import { z } from "zod";
import { type InteractiveIslandProps } from "../../../contracts/islands";
import { type BookingFormService, type BookingFormConfig, type BookingFormServicesSource, type BookingFormSettings, type BookingFormSourceRecord } from "./booking-form.state";
export type { BookingFormConfig, BookingFormService };
export type BookingFormRebookContext = Readonly<{
    kind: "portal_rebook";
}>;
export type BookingFormSourceProps = Readonly<{
    siteId?: string;
    apiBaseUrl?: string;
    portalToken?: string | null;
    formId?: string;
    serviceId?: string | null;
    resourceId?: string | null;
    initialData?: Readonly<Record<string, unknown>> | null;
    noticeMessage?: string | null;
    requiresServiceSelection?: boolean;
    requiresResourceSelection?: boolean;
    shouldAutoSelectSingleResource?: boolean;
    rebookContext?: BookingFormRebookContext | null;
    submitLabel?: string | null;
    successMessage?: string | null;
    form?: BookingFormSourceRecord | null;
    services?: BookingFormServicesSource | null;
    spamProtectionEnabled?: boolean;
    className?: string | null;
}>;
export type BookingFormDisplay = Readonly<{
    kind: "booking-form";
    state: "missing" | "ready";
    className: string | null;
    submitLabel: string;
    successMessage: string | null;
    message: string | null;
}>;
export type BookingFormHydration = Readonly<{
    formId: string | null;
    serviceId: string | null;
    resourceId: string | null;
    initialData?: Readonly<Record<string, unknown>> | null;
    noticeMessage?: string | null;
    requiresServiceSelection?: boolean;
    requiresResourceSelection?: boolean;
    shouldAutoSelectSingleResource?: boolean;
    rebookContext?: BookingFormRebookContext | null;
    form: BookingFormConfig | null;
    services: readonly BookingFormService[];
    spamProtectionEnabled?: boolean;
}>;
export declare const bookingSettingsSchema: z.ZodType<BookingFormSettings>;
export declare const bookingSourceFormSchema: z.ZodType<BookingFormSourceRecord>;
type BookingFormIslandMeta = Readonly<{
    siteId?: string;
    apiBaseUrl?: string;
    portalToken?: string | null;
}>;
export declare function buildBookingFormDisplay(source: BookingFormSourceProps, form?: BookingFormConfig | null): BookingFormDisplay;
export type BookingFormInteractiveIslandProps = InteractiveIslandProps<BookingFormIslandMeta, "booking-form", typeof bookingFormBlockRuntime>;
export declare const bookingFormBlockRuntime: Readonly<{
    kind: "client-owned";
    buildRender: (source: Readonly<{
        siteId?: string;
        apiBaseUrl?: string;
        portalToken?: string | null;
        formId?: string;
        serviceId?: string | null;
        resourceId?: string | null;
        initialData?: Readonly<Record<string, unknown>> | null;
        noticeMessage?: string | null;
        requiresServiceSelection?: boolean;
        requiresResourceSelection?: boolean;
        shouldAutoSelectSingleResource?: boolean;
        rebookContext?: Readonly<{
            kind: "portal_rebook";
        }> | null;
        submitLabel?: string | null;
        successMessage?: string | null;
        form?: Readonly<{
            id: string;
            siteId: string;
            userId: string;
            name: string;
            schemaJson?: Readonly<{
                version?: string;
                fields?: readonly Readonly<{
                    id: string;
                    label: string;
                    type: "text" | "email" | "textarea" | "select" | "radio" | "checkbox" | "booking_requirement_consent" | "tel" | "url" | "number" | "date" | "time";
                    required?: boolean;
                    placeholder?: string;
                    helpText?: string;
                    options?: readonly Readonly<{
                        value: string;
                        label: string;
                    }>[];
                    multiple?: boolean;
                    minLength?: number;
                    maxLength?: number;
                    pattern?: string;
                    min?: number;
                    max?: number;
                }>[];
            }>;
            settingsJson?: Readonly<{
                type: "booking";
                serviceId?: string;
                serviceIds?: readonly string[];
                resourceId?: string;
                requiresApproval?: boolean;
                successMessage?: string;
            }>;
            createdAt: string;
            updatedAt: string;
        }> | null;
        services?: BookingFormServicesSource | null;
        spamProtectionEnabled?: boolean;
        className?: string | null;
    }>) => Readonly<{
        display: Readonly<{
            kind: "booking-form";
            state: "missing" | "ready";
            className: string | null;
            submitLabel: string;
            successMessage: string | null;
            message: string | null;
        }>;
        hydration: Readonly<{
            formId: string | null;
            serviceId: string | null;
            resourceId: string | null;
            initialData?: Readonly<Record<string, unknown>> | null;
            noticeMessage?: string | null;
            requiresServiceSelection?: boolean;
            requiresResourceSelection?: boolean;
            shouldAutoSelectSingleResource?: boolean;
            rebookContext?: Readonly<{
                kind: "portal_rebook";
            }> | null;
            form: Readonly<{
                id: string;
                name: string;
                slug: string;
                settings?: Readonly<{
                    type: "booking";
                    serviceId?: string;
                    serviceIds?: readonly string[];
                    resourceId?: string;
                    requiresApproval?: boolean;
                    successMessage?: string;
                }>;
                schema?: Readonly<{
                    version?: string;
                    fields: readonly Readonly<{
                        id: string;
                        label: string;
                        type: "text" | "email" | "textarea" | "select" | "radio" | "checkbox" | "booking_requirement_consent" | "tel" | "url" | "number" | "date" | "time";
                        required?: boolean;
                        placeholder?: string;
                        helpText?: string;
                        options?: readonly Readonly<{
                            value: string;
                            label: string;
                        }>[];
                        multiple?: boolean;
                        minLength?: number;
                        maxLength?: number;
                        pattern?: string;
                        min?: number;
                        max?: number;
                    }>[];
                }>;
            }> | null;
            services: readonly Readonly<{
                id: string;
                siteId: string;
                title: string;
                description?: string;
                durationMinutes?: number;
                priceAmount?: number | null;
                priceCurrency?: string | null;
                paymentTerms?: import("../../blocks/shared/bookingPaymentTerms").BlockBookingPaymentTerms;
                paymentTermsAvailability?: Readonly<{
                    kind: "available";
                    paymentTerms: import("../../blocks/shared/bookingPaymentTerms").BlockBookingPaymentTerms;
                }> | Readonly<{
                    kind: "pending_stripe_setup";
                    paymentTerms: import("../../blocks/shared/bookingPaymentTerms").BlockBookingPaymentTerms;
                    reason: "online_payment_configured_before_launch";
                }>;
            }>[];
            spamProtectionEnabled?: boolean;
        }>;
    }>;
    contracts: Readonly<{
        source: Readonly<{
            encode: (value: Readonly<{
                siteId?: string;
                apiBaseUrl?: string;
                portalToken?: string | null;
                formId?: string;
                serviceId?: string | null;
                resourceId?: string | null;
                initialData?: Readonly<Record<string, unknown>> | null;
                noticeMessage?: string | null;
                requiresServiceSelection?: boolean;
                requiresResourceSelection?: boolean;
                shouldAutoSelectSingleResource?: boolean;
                rebookContext?: Readonly<{
                    kind: "portal_rebook";
                }> | null;
                submitLabel?: string | null;
                successMessage?: string | null;
                form?: Readonly<{
                    id: string;
                    siteId: string;
                    userId: string;
                    name: string;
                    schemaJson?: Readonly<{
                        version?: string;
                        fields?: readonly Readonly<{
                            id: string;
                            label: string;
                            type: "text" | "email" | "textarea" | "select" | "radio" | "checkbox" | "booking_requirement_consent" | "tel" | "url" | "number" | "date" | "time";
                            required?: boolean;
                            placeholder?: string;
                            helpText?: string;
                            options?: readonly Readonly<{
                                value: string;
                                label: string;
                            }>[];
                            multiple?: boolean;
                            minLength?: number;
                            maxLength?: number;
                            pattern?: string;
                            min?: number;
                            max?: number;
                        }>[];
                    }>;
                    settingsJson?: Readonly<{
                        type: "booking";
                        serviceId?: string;
                        serviceIds?: readonly string[];
                        resourceId?: string;
                        requiresApproval?: boolean;
                        successMessage?: string;
                    }>;
                    createdAt: string;
                    updatedAt: string;
                }> | null;
                services?: BookingFormServicesSource | null;
                spamProtectionEnabled?: boolean;
                className?: string | null;
            }>) => unknown;
            decode: (input: unknown) => import("../../../contracts").DecodeResult<Readonly<{
                siteId?: string;
                apiBaseUrl?: string;
                portalToken?: string | null;
                formId?: string;
                serviceId?: string | null;
                resourceId?: string | null;
                initialData?: Readonly<Record<string, unknown>> | null;
                noticeMessage?: string | null;
                requiresServiceSelection?: boolean;
                requiresResourceSelection?: boolean;
                shouldAutoSelectSingleResource?: boolean;
                rebookContext?: Readonly<{
                    kind: "portal_rebook";
                }> | null;
                submitLabel?: string | null;
                successMessage?: string | null;
                form?: Readonly<{
                    id: string;
                    siteId: string;
                    userId: string;
                    name: string;
                    schemaJson?: Readonly<{
                        version?: string;
                        fields?: readonly Readonly<{
                            id: string;
                            label: string;
                            type: "text" | "email" | "textarea" | "select" | "radio" | "checkbox" | "booking_requirement_consent" | "tel" | "url" | "number" | "date" | "time";
                            required?: boolean;
                            placeholder?: string;
                            helpText?: string;
                            options?: readonly Readonly<{
                                value: string;
                                label: string;
                            }>[];
                            multiple?: boolean;
                            minLength?: number;
                            maxLength?: number;
                            pattern?: string;
                            min?: number;
                            max?: number;
                        }>[];
                    }>;
                    settingsJson?: Readonly<{
                        type: "booking";
                        serviceId?: string;
                        serviceIds?: readonly string[];
                        resourceId?: string;
                        requiresApproval?: boolean;
                        successMessage?: string;
                    }>;
                    createdAt: string;
                    updatedAt: string;
                }> | null;
                services?: BookingFormServicesSource | null;
                spamProtectionEnabled?: boolean;
                className?: string | null;
            }>>;
        }>;
        render: Readonly<{
            encode: (value: Readonly<{
                display: Readonly<{
                    kind: "booking-form";
                    state: "missing" | "ready";
                    className: string | null;
                    submitLabel: string;
                    successMessage: string | null;
                    message: string | null;
                }>;
                hydration: Readonly<{
                    formId: string | null;
                    serviceId: string | null;
                    resourceId: string | null;
                    initialData?: Readonly<Record<string, unknown>> | null;
                    noticeMessage?: string | null;
                    requiresServiceSelection?: boolean;
                    requiresResourceSelection?: boolean;
                    shouldAutoSelectSingleResource?: boolean;
                    rebookContext?: Readonly<{
                        kind: "portal_rebook";
                    }> | null;
                    form: Readonly<{
                        id: string;
                        name: string;
                        slug: string;
                        settings?: Readonly<{
                            type: "booking";
                            serviceId?: string;
                            serviceIds?: readonly string[];
                            resourceId?: string;
                            requiresApproval?: boolean;
                            successMessage?: string;
                        }>;
                        schema?: Readonly<{
                            version?: string;
                            fields: readonly Readonly<{
                                id: string;
                                label: string;
                                type: "text" | "email" | "textarea" | "select" | "radio" | "checkbox" | "booking_requirement_consent" | "tel" | "url" | "number" | "date" | "time";
                                required?: boolean;
                                placeholder?: string;
                                helpText?: string;
                                options?: readonly Readonly<{
                                    value: string;
                                    label: string;
                                }>[];
                                multiple?: boolean;
                                minLength?: number;
                                maxLength?: number;
                                pattern?: string;
                                min?: number;
                                max?: number;
                            }>[];
                        }>;
                    }> | null;
                    services: readonly Readonly<{
                        id: string;
                        siteId: string;
                        title: string;
                        description?: string;
                        durationMinutes?: number;
                        priceAmount?: number | null;
                        priceCurrency?: string | null;
                        paymentTerms?: import("../../blocks/shared/bookingPaymentTerms").BlockBookingPaymentTerms;
                        paymentTermsAvailability?: Readonly<{
                            kind: "available";
                            paymentTerms: import("../../blocks/shared/bookingPaymentTerms").BlockBookingPaymentTerms;
                        }> | Readonly<{
                            kind: "pending_stripe_setup";
                            paymentTerms: import("../../blocks/shared/bookingPaymentTerms").BlockBookingPaymentTerms;
                            reason: "online_payment_configured_before_launch";
                        }>;
                    }>[];
                    spamProtectionEnabled?: boolean;
                }>;
            }>) => unknown;
            decode: (input: unknown) => import("../../../contracts").DecodeResult<Readonly<{
                display: Readonly<{
                    kind: "booking-form";
                    state: "missing" | "ready";
                    className: string | null;
                    submitLabel: string;
                    successMessage: string | null;
                    message: string | null;
                }>;
                hydration: Readonly<{
                    formId: string | null;
                    serviceId: string | null;
                    resourceId: string | null;
                    initialData?: Readonly<Record<string, unknown>> | null;
                    noticeMessage?: string | null;
                    requiresServiceSelection?: boolean;
                    requiresResourceSelection?: boolean;
                    shouldAutoSelectSingleResource?: boolean;
                    rebookContext?: Readonly<{
                        kind: "portal_rebook";
                    }> | null;
                    form: Readonly<{
                        id: string;
                        name: string;
                        slug: string;
                        settings?: Readonly<{
                            type: "booking";
                            serviceId?: string;
                            serviceIds?: readonly string[];
                            resourceId?: string;
                            requiresApproval?: boolean;
                            successMessage?: string;
                        }>;
                        schema?: Readonly<{
                            version?: string;
                            fields: readonly Readonly<{
                                id: string;
                                label: string;
                                type: "text" | "email" | "textarea" | "select" | "radio" | "checkbox" | "booking_requirement_consent" | "tel" | "url" | "number" | "date" | "time";
                                required?: boolean;
                                placeholder?: string;
                                helpText?: string;
                                options?: readonly Readonly<{
                                    value: string;
                                    label: string;
                                }>[];
                                multiple?: boolean;
                                minLength?: number;
                                maxLength?: number;
                                pattern?: string;
                                min?: number;
                                max?: number;
                            }>[];
                        }>;
                    }> | null;
                    services: readonly Readonly<{
                        id: string;
                        siteId: string;
                        title: string;
                        description?: string;
                        durationMinutes?: number;
                        priceAmount?: number | null;
                        priceCurrency?: string | null;
                        paymentTerms?: import("../../blocks/shared/bookingPaymentTerms").BlockBookingPaymentTerms;
                        paymentTermsAvailability?: Readonly<{
                            kind: "available";
                            paymentTerms: import("../../blocks/shared/bookingPaymentTerms").BlockBookingPaymentTerms;
                        }> | Readonly<{
                            kind: "pending_stripe_setup";
                            paymentTerms: import("../../blocks/shared/bookingPaymentTerms").BlockBookingPaymentTerms;
                            reason: "online_payment_configured_before_launch";
                        }>;
                    }>[];
                    spamProtectionEnabled?: boolean;
                }>;
            }>>;
        }>;
    }>;
}>;
export declare const bookingFormInteractiveIslandPropsCodec: Readonly<{
    encode: (value: Readonly<Readonly<{
        siteId?: string;
        apiBaseUrl?: string;
        portalToken?: string | null;
    }> & {
        renderKind: "client-owned";
        render: Readonly<{
            mode: "booking-form";
        } & Readonly<{
            display: Readonly<{
                kind: "booking-form";
                state: "missing" | "ready";
                className: string | null;
                submitLabel: string;
                successMessage: string | null;
                message: string | null;
            }>;
            hydration: Readonly<{
                formId: string | null;
                serviceId: string | null;
                resourceId: string | null;
                initialData?: Readonly<Record<string, unknown>> | null;
                noticeMessage?: string | null;
                requiresServiceSelection?: boolean;
                requiresResourceSelection?: boolean;
                shouldAutoSelectSingleResource?: boolean;
                rebookContext?: Readonly<{
                    kind: "portal_rebook";
                }> | null;
                form: Readonly<{
                    id: string;
                    name: string;
                    slug: string;
                    settings?: Readonly<{
                        type: "booking";
                        serviceId?: string;
                        serviceIds?: readonly string[];
                        resourceId?: string;
                        requiresApproval?: boolean;
                        successMessage?: string;
                    }>;
                    schema?: Readonly<{
                        version?: string;
                        fields: readonly Readonly<{
                            id: string;
                            label: string;
                            type: "text" | "email" | "textarea" | "select" | "radio" | "checkbox" | "booking_requirement_consent" | "tel" | "url" | "number" | "date" | "time";
                            required?: boolean;
                            placeholder?: string;
                            helpText?: string;
                            options?: readonly Readonly<{
                                value: string;
                                label: string;
                            }>[];
                            multiple?: boolean;
                            minLength?: number;
                            maxLength?: number;
                            pattern?: string;
                            min?: number;
                            max?: number;
                        }>[];
                    }>;
                }> | null;
                services: readonly Readonly<{
                    id: string;
                    siteId: string;
                    title: string;
                    description?: string;
                    durationMinutes?: number;
                    priceAmount?: number | null;
                    priceCurrency?: string | null;
                    paymentTerms?: import("../../blocks/shared/bookingPaymentTerms").BlockBookingPaymentTerms;
                    paymentTermsAvailability?: Readonly<{
                        kind: "available";
                        paymentTerms: import("../../blocks/shared/bookingPaymentTerms").BlockBookingPaymentTerms;
                    }> | Readonly<{
                        kind: "pending_stripe_setup";
                        paymentTerms: import("../../blocks/shared/bookingPaymentTerms").BlockBookingPaymentTerms;
                        reason: "online_payment_configured_before_launch";
                    }>;
                }>[];
                spamProtectionEnabled?: boolean;
            }>;
        }>>;
    }>) => unknown;
    decode: (input: unknown) => import("../../../contracts").DecodeResult<Readonly<Readonly<{
        siteId?: string;
        apiBaseUrl?: string;
        portalToken?: string | null;
    }> & {
        renderKind: "client-owned";
        render: Readonly<{
            mode: "booking-form";
        } & Readonly<{
            display: Readonly<{
                kind: "booking-form";
                state: "missing" | "ready";
                className: string | null;
                submitLabel: string;
                successMessage: string | null;
                message: string | null;
            }>;
            hydration: Readonly<{
                formId: string | null;
                serviceId: string | null;
                resourceId: string | null;
                initialData?: Readonly<Record<string, unknown>> | null;
                noticeMessage?: string | null;
                requiresServiceSelection?: boolean;
                requiresResourceSelection?: boolean;
                shouldAutoSelectSingleResource?: boolean;
                rebookContext?: Readonly<{
                    kind: "portal_rebook";
                }> | null;
                form: Readonly<{
                    id: string;
                    name: string;
                    slug: string;
                    settings?: Readonly<{
                        type: "booking";
                        serviceId?: string;
                        serviceIds?: readonly string[];
                        resourceId?: string;
                        requiresApproval?: boolean;
                        successMessage?: string;
                    }>;
                    schema?: Readonly<{
                        version?: string;
                        fields: readonly Readonly<{
                            id: string;
                            label: string;
                            type: "text" | "email" | "textarea" | "select" | "radio" | "checkbox" | "booking_requirement_consent" | "tel" | "url" | "number" | "date" | "time";
                            required?: boolean;
                            placeholder?: string;
                            helpText?: string;
                            options?: readonly Readonly<{
                                value: string;
                                label: string;
                            }>[];
                            multiple?: boolean;
                            minLength?: number;
                            maxLength?: number;
                            pattern?: string;
                            min?: number;
                            max?: number;
                        }>[];
                    }>;
                }> | null;
                services: readonly Readonly<{
                    id: string;
                    siteId: string;
                    title: string;
                    description?: string;
                    durationMinutes?: number;
                    priceAmount?: number | null;
                    priceCurrency?: string | null;
                    paymentTerms?: import("../../blocks/shared/bookingPaymentTerms").BlockBookingPaymentTerms;
                    paymentTermsAvailability?: Readonly<{
                        kind: "available";
                        paymentTerms: import("../../blocks/shared/bookingPaymentTerms").BlockBookingPaymentTerms;
                    }> | Readonly<{
                        kind: "pending_stripe_setup";
                        paymentTerms: import("../../blocks/shared/bookingPaymentTerms").BlockBookingPaymentTerms;
                        reason: "online_payment_configured_before_launch";
                    }>;
                }>[];
                spamProtectionEnabled?: boolean;
            }>;
        }>>;
    }>>;
}>;
export declare function buildBookingFormInteractiveIslandProps(props: BookingFormSourceProps): BookingFormInteractiveIslandProps;
