import { validateEvent } from '@polar-sh/sdk/webhooks';
import { WebhookBenefitCreatedPayload } from '@polar-sh/sdk/models/components/webhookbenefitcreatedpayload';
import { WebhookBenefitGrantCreatedPayload } from '@polar-sh/sdk/models/components/webhookbenefitgrantcreatedpayload';
import { WebhookBenefitGrantRevokedPayload } from '@polar-sh/sdk/models/components/webhookbenefitgrantrevokedpayload';
import { WebhookBenefitGrantUpdatedPayload } from '@polar-sh/sdk/models/components/webhookbenefitgrantupdatedpayload';
import { WebhookBenefitUpdatedPayload } from '@polar-sh/sdk/models/components/webhookbenefitupdatedpayload';
import { WebhookCheckoutCreatedPayload } from '@polar-sh/sdk/models/components/webhookcheckoutcreatedpayload';
import { WebhookCheckoutUpdatedPayload } from '@polar-sh/sdk/models/components/webhookcheckoutupdatedpayload';
import { WebhookOrderCreatedPayload } from '@polar-sh/sdk/models/components/webhookordercreatedpayload';
import { WebhookOrderPaidPayload } from '@polar-sh/sdk/models/components/webhookorderpaidpayload';
import { WebhookOrderRefundedPayload } from '@polar-sh/sdk/models/components/webhookorderrefundedpayload';
import { WebhookOrderUpdatedPayload } from '@polar-sh/sdk/models/components/webhookorderupdatedpayload';
import { WebhookOrganizationUpdatedPayload } from '@polar-sh/sdk/models/components/webhookorganizationupdatedpayload';
import { WebhookProductCreatedPayload } from '@polar-sh/sdk/models/components/webhookproductcreatedpayload';
import { WebhookProductUpdatedPayload } from '@polar-sh/sdk/models/components/webhookproductupdatedpayload';
import { WebhookRefundCreatedPayload } from '@polar-sh/sdk/models/components/webhookrefundcreatedpayload';
import { WebhookRefundUpdatedPayload } from '@polar-sh/sdk/models/components/webhookrefundupdatedpayload';
import { WebhookSubscriptionActivePayload } from '@polar-sh/sdk/models/components/webhooksubscriptionactivepayload';
import { WebhookSubscriptionCanceledPayload } from '@polar-sh/sdk/models/components/webhooksubscriptioncanceledpayload';
import { WebhookSubscriptionCreatedPayload } from '@polar-sh/sdk/models/components/webhooksubscriptioncreatedpayload';
import { WebhookSubscriptionRevokedPayload } from '@polar-sh/sdk/models/components/webhooksubscriptionrevokedpayload';
import { WebhookSubscriptionUncanceledPayload } from '@polar-sh/sdk/models/components/webhooksubscriptionuncanceledpayload';
import { WebhookSubscriptionUpdatedPayload } from '@polar-sh/sdk/models/components/webhooksubscriptionupdatedpayload';
import { Customer } from '@polar-sh/sdk/models/components/customer';
import { WebhookCustomerUpdatedPayload } from '@polar-sh/sdk/models/components/webhookcustomerupdatedpayload';
import { WebhookCustomerDeletedPayload } from '@polar-sh/sdk/models/components/webhookcustomerdeletedpayload';
import { WebhookCustomerCreatedPayload } from '@polar-sh/sdk/models/components/webhookcustomercreatedpayload';
import { WebhookCustomerStateChangedPayload } from '@polar-sh/sdk/models/components/webhookcustomerstatechangedpayload';

type EntitlementProperties = Record<string, string>;
type EntitlementHandler = (payload: WebhookBenefitGrantCreatedPayload | WebhookBenefitGrantRevokedPayload) => Promise<void>;
interface EntitlementContext<T extends EntitlementProperties> {
    customer: Customer;
    properties: T;
    payload: WebhookBenefitGrantCreatedPayload | WebhookBenefitGrantRevokedPayload;
}
declare class EntitlementStrategy<T extends EntitlementProperties> {
    private grantCallbacks;
    private revokeCallbacks;
    grant(callback: (context: EntitlementContext<T>) => Promise<void>): this;
    revoke(callback: (context: EntitlementContext<T>) => Promise<void>): this;
    handler(slug: string): EntitlementHandler;
}
declare class Entitlements {
    static handlers: EntitlementHandler[];
    static use<T extends EntitlementProperties = EntitlementProperties>(slug: string, strategy: EntitlementStrategy<T>): typeof Entitlements;
}

interface WebhooksConfig {
    webhookSecret: string;
    entitlements?: typeof Entitlements;
    onPayload?: (payload: ReturnType<typeof validateEvent>) => Promise<void>;
    onCheckoutCreated?: (payload: WebhookCheckoutCreatedPayload) => Promise<void>;
    onCheckoutUpdated?: (payload: WebhookCheckoutUpdatedPayload) => Promise<void>;
    onOrderCreated?: (payload: WebhookOrderCreatedPayload) => Promise<void>;
    onOrderUpdated?: (payload: WebhookOrderUpdatedPayload) => Promise<void>;
    onOrderPaid?: (payload: WebhookOrderPaidPayload) => Promise<void>;
    onOrderRefunded?: (payload: WebhookOrderRefundedPayload) => Promise<void>;
    onRefundCreated?: (payload: WebhookRefundCreatedPayload) => Promise<void>;
    onRefundUpdated?: (payload: WebhookRefundUpdatedPayload) => Promise<void>;
    onSubscriptionCreated?: (payload: WebhookSubscriptionCreatedPayload) => Promise<void>;
    onSubscriptionUpdated?: (payload: WebhookSubscriptionUpdatedPayload) => Promise<void>;
    onSubscriptionActive?: (payload: WebhookSubscriptionActivePayload) => Promise<void>;
    onSubscriptionCanceled?: (payload: WebhookSubscriptionCanceledPayload) => Promise<void>;
    onSubscriptionRevoked?: (payload: WebhookSubscriptionRevokedPayload) => Promise<void>;
    onSubscriptionUncanceled?: (payload: WebhookSubscriptionUncanceledPayload) => Promise<void>;
    onProductCreated?: (payload: WebhookProductCreatedPayload) => Promise<void>;
    onProductUpdated?: (payload: WebhookProductUpdatedPayload) => Promise<void>;
    onOrganizationUpdated?: (payload: WebhookOrganizationUpdatedPayload) => Promise<void>;
    onBenefitCreated?: (payload: WebhookBenefitCreatedPayload) => Promise<void>;
    onBenefitUpdated?: (payload: WebhookBenefitUpdatedPayload) => Promise<void>;
    onBenefitGrantCreated?: (payload: WebhookBenefitGrantCreatedPayload) => Promise<void>;
    onBenefitGrantUpdated?: (payload: WebhookBenefitGrantUpdatedPayload) => Promise<void>;
    onBenefitGrantRevoked?: (payload: WebhookBenefitGrantRevokedPayload) => Promise<void>;
    onCustomerCreated?: (payload: WebhookCustomerCreatedPayload) => Promise<void>;
    onCustomerUpdated?: (payload: WebhookCustomerUpdatedPayload) => Promise<void>;
    onCustomerDeleted?: (payload: WebhookCustomerDeletedPayload) => Promise<void>;
    onCustomerStateChanged?: (payload: WebhookCustomerStateChangedPayload) => Promise<void>;
}
declare const handleWebhookPayload: (payload: ReturnType<typeof validateEvent>, { webhookSecret, entitlements, onPayload, ...eventHandlers }: WebhooksConfig) => Promise<void[]>;

export { type EntitlementContext, type EntitlementHandler, type EntitlementProperties, EntitlementStrategy, Entitlements, type WebhooksConfig, handleWebhookPayload };
