import type { Context } from '../context.js';
import type { _ConfigApplicationContext } from '../../stdlib/index.js';
/** @public */
export declare namespace InvoiceCollectionSetting {
    /** @public */
    type ParentType = 'billing_cadence' | 'contract' | 'quote' | 'standalone' | 'subscription_schedule' | 'subscription';
    /** @public */
    type PaymentMethodType = 'ach_credit_transfer' | 'ach_debit' | 'affirm' | 'afterpay_clearpay' | 'alipay' | 'au_becs_debit' | 'bacs_debit' | 'bancontact' | 'boleto' | 'card' | 'cashapp' | 'eps' | 'fpx' | 'giropay' | 'grabpay' | 'ideal' | 'klarna' | 'konbini' | 'link' | 'multibanco' | 'oxxo' | 'p24' | 'paynow' | 'paypal' | 'promptpay' | 'sepa_credit_transfer' | 'sepa_debit' | 'sofort' | 'us_bank_account' | 'wechat_pay';
    /** @public */
    type CollectionMethod = 'charge_automatically' | 'send_invoice';
    /**
     * The result of the invoice collection settings override extension.
     * @public
     */
    interface InvoiceCollectionResponse {
        /** Override the auto-advancement setting. Set to false to keep the invoice in draft. Return null to use the default. */
        autoAdvance?: boolean;
    }
    /** @public */
    type InvoiceCollectionRequest = ({
        customer: Customer;
        payer: 'customer';
    } | {
        otherPayer: string;
        payer: 'other';
    }) & {
        collectionSettings: CollectionSettings;
        parent: Parent;
    };
    /** @public */
    interface Customer {
        id: string;
        metadata: Record<string, string>;
    }
    /**
     * The parent resource that triggered the invoice creation.
     * @public
     */
    interface Parent {
        /** The type of parent resource (for example, subscription or contract). */
        type: ParentType;
        /** Custom key-value pairs attached to the parent resource. */
        metadata: Record<string, string>;
    }
    /**
     * The collection settings for an invoice.
     * @public
     */
    interface CollectionSettings {
        /** Whether the invoice automatically advances through its lifecycle. */
        autoAdvance: boolean;
        /** The payment collection method: charge_automatically or send_invoice. */
        collectionMethod: CollectionMethod;
        /** The delay before the invoice is finalized, in hours. */
        finalizationGracePeriod: number;
        /** The payment methods configured for this invoice. */
        paymentMethods: PaymentMethodType[];
    }
    /**
     * @public
     * @deprecated Platform dispatch handles wire/SDK conversion.
     */
    function prepareArgsCollectionOverride(proto: unknown): InvoiceCollectionRequest;
    /**
     * @public
     * @deprecated Platform dispatch handles wire/SDK conversion.
     */
    function prepareResultCollectionOverride(result: InvoiceCollectionResponse): InvoiceCollectionResponse;
    /** @internal */
    function $platformWrapCollectionOverride(configTransformer?: (wireConfig: unknown, appCtx: _ConfigApplicationContext) => unknown): (cls: new () => { collectionOverride(...a: unknown[]): unknown }, wireArgs: unknown, wireConfig: unknown, ctx: unknown) => unknown;
    /**
     * @public
     * @deprecated Platform dispatch handles wire/SDK conversion.
     */
    const prepareArgs: typeof prepareArgsCollectionOverride;
    /**
     * @public
     * @deprecated Platform dispatch handles wire/SDK conversion.
     */
    const prepareResult: typeof prepareResultCollectionOverride;
    /**
     * Overrides invoice collection settings before a draft invoice is created.
     * @public
     */
    type CollectionOverrideFunction<Config> = (request: InvoiceCollectionRequest, config: Config, context: Context) => InvoiceCollectionResponse;
}
/**
 * @example
 * ```ts
 * import type { Billing, Context } from '@stripe/extensibility-sdk';
 *
 * // eslint-disable-next-line @typescript-eslint/no-empty-object-type
 * interface MyInvoiceCollectionSettingConfig {}
 *
 * export default class MyInvoiceCollectionSetting implements Billing.InvoiceCollectionSetting<MyInvoiceCollectionSettingConfig> {
 *   collectionOverride(
 *     _request: Billing.InvoiceCollectionSetting.InvoiceCollectionRequest,
 *     _config: MyInvoiceCollectionSettingConfig,
 *     _context: Context
 *   ) {
 *     // TODO: implement your collection setting logic here
 *
 *     return {};
 *   }
 * }
 *
 * ```
 * @public
 */
export interface InvoiceCollectionSetting<Config> {
    collectionOverride: InvoiceCollectionSetting.CollectionOverrideFunction<Config>;
}
//# sourceMappingURL=invoice_collection_setting.d.ts.map