import { Stripe } from "stripe";
import { AbstractPaymentServerProvider, PaymentExternalProductData } from "./abstract-payment-server-provider.js";
import { PaymentCalculatedCheckout, PaymentCheckoutExecution, PaymentEnforceProviderBase, PaymentProduct, PaymentUser } from "../types.js";
import { NarrowedStripeCalculatedCheckout, NarrowedStripeCompletedCheckout, PaymentStripeProviderData } from "../payment-stripe-types.js";
import { Intersection } from "utility-types";
export declare type PaymentStripeAccount = PaymentEnforceProviderBase<{
    provider: "stripe";
    customer: Stripe.Customer;
    paymentSources: Array<Stripe.Card>;
}>;
declare type PaymentStripePreCaptureResult = {
    intentOpts?: Partial<Intersection<Stripe.SetupIntentCreateParams, Stripe.PaymentIntentCreateParams>>;
};
declare type PaymentStripeProviderOpts = {
    customizeIntent: (user: PaymentUser, checkout: NarrowedStripeCalculatedCheckout, card?: Stripe.PaymentMethod.Card) => Promise<PaymentStripePreCaptureResult>;
    preCaptureCheck?: (user: PaymentUser, checkout: NarrowedStripeCalculatedCheckout, intent: Stripe.SetupIntent | Stripe.PaymentIntent) => Promise<void>;
};
export declare class PaymentStripeServerProvider extends AbstractPaymentServerProvider<PaymentStripeProviderData> {
    opts?: PaymentStripeProviderOpts | undefined;
    stripe: Stripe;
    provider: "stripe";
    constructor(apiKey: string, opts?: PaymentStripeProviderOpts | undefined);
    readWebhookCustomer(event: Stripe.Event): Promise<{
        id: string;
    } | {
        email: string;
    } | void>;
    supportsWebhook(event: any): Promise<boolean>;
    readWebhookCheckout(user: PaymentUser, event: Stripe.Event): Promise<{
        providerCheckoutId: string;
    } | void>;
    handleWebhook(user: PaymentUser, checkout: NarrowedStripeCompletedCheckout, webhookData: any): Promise<PaymentCheckoutExecution | void>;
    private retrievePaymentIntent;
    updateDefaultCard(user: PaymentUser, cardIdentifier: string): Promise<PaymentStripeAccount>;
    createCard(user: PaymentUser, data: Stripe.Token): Promise<PaymentStripeAccount>;
    prepareCheckout(step: "calc" | "execution", user: PaymentUser, calculatedCheckout: PaymentCalculatedCheckout, opts?: {
        paymentMethodId: Stripe.PaymentMethod["id"];
        intentOptions?: Partial<Intersection<Stripe.SetupIntentCreateParams, Stripe.PaymentIntentCreateParams>>;
    }): Promise<NarrowedStripeCalculatedCheckout>;
    checkout(user: PaymentUser, checkoutObj: NarrowedStripeCalculatedCheckout | NarrowedStripeCompletedCheckout): Promise<PaymentCheckoutExecution>;
    protected revertSubscriptionCancellation(user: PaymentUser, checkoutObj: NarrowedStripeCalculatedCheckout): Promise<PaymentCheckoutExecution | void>;
    cancelCheckout(user: PaymentUser, checkoutObj: NarrowedStripeCompletedCheckout): Promise<PaymentCheckoutExecution>;
    private createSubscription;
    protected buildCheckoutResult(checkoutObj: NarrowedStripeCalculatedCheckout | NarrowedStripeCompletedCheckout, intent: Stripe.PaymentIntent | Stripe.SetupIntent, subscription: Stripe.Subscription | undefined, providerProducts: PaymentExternalProductData[], products: PaymentProduct[]): NarrowedStripeCompletedCheckout;
    private ensureStripeProducts;
    private ensureStripeAccount;
    private _getStripeAccount;
    private _createStripeAccount;
    private getIdFromStringOrObject;
    get3dsResultFromSetupIntent(intent: Stripe.SetupIntent): Promise<Stripe.SetupAttempt.PaymentMethodDetails.Card.ThreeDSecure>;
    get3dsResultFromPaymentIntent(intent: Stripe.PaymentIntent): Promise<Stripe.Charge.PaymentMethodDetails.Card.ThreeDSecure>;
}
export {};
