export type BillingInterval = 'monthly' | 'annual';
declare const storageBytesBrand: unique symbol;
export type StorageBytes = number & {
    readonly [storageBytesBrand]: 'StorageBytes';
};
export type StorageByteParseError = 'invalid-storage-bytes';
export type StorageByteParseResult = Readonly<{
    ok: true;
    value: StorageBytes;
}> | Readonly<{
    ok: false;
    error: StorageByteParseError;
}>;
export type StorageQuota = Readonly<{
    tag: 'limited';
    maxBytes: StorageBytes;
}> | Readonly<{
    tag: 'unlimited';
}>;
export declare function asStorageBytes(value: number): StorageByteParseResult;
export declare function unsafeStorageBytes(value: number): StorageBytes;
export declare function storageMegabytes(value: number): StorageBytes;
export declare function storageGigabytes(value: number): StorageBytes;
export declare function limitedStorageQuota(maxBytes: StorageBytes): StorageQuota;
export declare function formatStorageBytes(bytes: StorageBytes): string;
export declare function formatStorageQuota(quota: StorageQuota): string;
export declare const BILLING_PLAN_IDS: readonly ["free", "core", "solo", "studio"];
export type BillingPlanId = (typeof BILLING_PLAN_IDS)[number];
export declare const PAID_BILLING_PLAN_IDS: readonly ["core", "solo", "studio"];
export type PaidBillingPlanId = (typeof PAID_BILLING_PLAN_IDS)[number];
export declare const CONTENT_FLEXIBILITY_TIERS: readonly ["limited", "full"];
export type ContentFlexibilityTier = (typeof CONTENT_FLEXIBILITY_TIERS)[number];
export declare const FORMS_TIERS: readonly ["limited", "full"];
export type FormsTier = (typeof FORMS_TIERS)[number];
export declare const SEO_TIERS: readonly ["none", "basic", "advanced"];
export type SeoTier = (typeof SEO_TIERS)[number];
export declare const NEWSLETTER_TIERS: readonly ["none", "crm_lite"];
export type NewsletterTier = (typeof NEWSLETTER_TIERS)[number];
export declare const BRANDING_TIERS: readonly ["macadamia_visible", "light_customisation", "white_label"];
export type BrandingTier = (typeof BRANDING_TIERS)[number];
export declare const TEAM_TIERS: readonly ["owner_only", "multi_practitioner"];
export type TeamTier = (typeof TEAM_TIERS)[number];
export declare const SITE_ROLE_ENTITLEMENTS: readonly ["administrator", "editor", "event_host", "team_member"];
export type SiteRoleEntitlement = (typeof SITE_ROLE_ENTITLEMENTS)[number];
export declare const PLAN_BOOLEAN_FEATURE_KEYS: readonly ["customDomain", "customContentTypes", "analytics", "passes", "memberships", "discountCodes", "advancedPaymentSchemes", "internalNotes", "multipleTeamLogins", "multiplePractitioners"];
export type PlanBooleanFeatureKey = (typeof PLAN_BOOLEAN_FEATURE_KEYS)[number];
export type StripeBookingCommission = Readonly<{
    kind: 'none';
}> | Readonly<{
    kind: 'percentage';
    percent: number;
    appliesTo: 'stripe_payments_only';
}>;
export interface PlanEntitlements {
    planId: BillingPlanId;
    monthlyPricePence: number | null;
    availableIntervals: readonly BillingInterval[];
    monthlyBookingLimit: number | null;
    durableStorageQuota: StorageQuota;
    stripeBookingCommission: StripeBookingCommission;
    customDomain: boolean;
    customContentTypes: boolean;
    analytics: boolean;
    passes: boolean;
    memberships: boolean;
    discountCodes: boolean;
    advancedPaymentSchemes: boolean;
    internalNotes: boolean;
    multipleTeamLogins: boolean;
    multiplePractitioners: boolean;
    contentFlexibility: ContentFlexibilityTier;
    forms: FormsTier;
    seo: SeoTier;
    newsletter: NewsletterTier;
    branding: BrandingTier;
    team: TeamTier;
    enabledSiteRoles: readonly SiteRoleEntitlement[];
}
export interface PlanDefinition {
    id: BillingPlanId;
    name: string;
    description: string;
    defaultCurrency: string;
    annualDiscountPercent?: number;
    /** @deprecated Use database pricing instead. Will be removed in Phase 6. */
    stripePriceLookupKeys?: Partial<Record<BillingInterval, string>>;
    /** @deprecated Stripe products are now auto-created via ensurePlatformProduct(). */
    stripeProductId?: string;
    entitlements: PlanEntitlements;
    trialDays?: number;
    metadata?: Record<string, string | number | boolean>;
}
export interface DisplayPricing {
    planId: BillingPlanId;
    currency: string;
    monthly: {
        amountPence: number;
        formatted: string;
    };
    annual: {
        amountPence: number;
        formatted: string;
        discountPercent?: number;
    };
}
export {};
