import type { PaymentCalculatedCheckout, PaymentCheckoutExecution, PaymentPartialCheckout, PaymentProviderData, PaymentUserData } from "./types.js";
import type { AbstractPaymentClientProvider, ProviderClientProviderData } from "./client-providers/abstract-payment-client-provider.js";
import type { Narrow } from "../utils.js";
declare type NarrowedCalculetedCheckout<P extends AbstractPaymentClientProvider = any, PN extends P["provider"] = any> = Narrow<PaymentCalculatedCheckout, {
    provider: PN;
    externalData: Narrow<PaymentProviderData, {
        provider: PN;
        data: ProviderClientProviderData<Extract<P, {
            provider: PN;
        }>>;
    }>;
}>;
/**
 * PaymentClient is the class for executing the checkout on front-end
 */
export declare abstract class AbstractPaymentClient<P extends AbstractPaymentClientProvider = any> {
    private inited;
    providers: P[];
    providersInitializers: (() => P)[];
    constructor(providers: (() => P)[]);
    init(): void;
    buildUi<PN extends P["provider"]>(calculatedCheckout: NarrowedCalculetedCheckout<P, PN>, opts: Parameters<Extract<P, {
        provider: PN;
    }>["buildUi"]>[1] & {
        onSuccess: (checkout: PaymentCheckoutExecution) => void;
        onError: (err: Error, checkout?: PaymentCheckoutExecution) => void;
    }): Promise<HTMLElement>;
    calculateCheckout<PN extends P["provider"]>(checkout: Narrow<PaymentPartialCheckout, {
        provider: PN;
    }>): Promise<NarrowedCalculetedCheckout<P, PN>>;
    checkout(checkout: PaymentCalculatedCheckout): Promise<PaymentCheckoutExecution>;
    private getProvider;
    private checkInited;
    cancelCheckout(checkout: PaymentCheckoutExecution, reason: string): Promise<PaymentUserData>;
    /**
     * Here you should send the checkout to the server
     *
     * @param checkout
     */
    protected abstract sendCheckout(checkout: PaymentCalculatedCheckout): Promise<PaymentCheckoutExecution>;
    /**
     * Implement this method and send your partial checkout to the server,
     * then you will have ensured prices from your api
     *
     * @param checkout
     * @protected
     */
    protected abstract sendCalculateCheckout(checkout: PaymentPartialCheckout): Promise<PaymentCalculatedCheckout>;
    protected abstract sendCancelCheckout(checkout: PaymentCheckoutExecution): Promise<PaymentUserData>;
}
export {};
