import { ZodDiscriminatedUnion, ZodObject, ZodLiteral, ZodTypeAny, ZodRawShape, z } from 'zod';

type ValidZodEventSchema = ZodDiscriminatedUnion<"event", ZodObject<{
    event: ZodLiteral<string>;
    request: ZodTypeAny;
    response: ZodTypeAny;
} & ZodRawShape>[]>;
type MaybePromise<T> = Promise<T> | T;
type FullServerImplementation<Schema extends ValidZodEventSchema> = {
    [K in NonNullable<z.infer<Schema>["event"]>]: (request: Extract<z.infer<Schema>, {
        event: K;
    }>["request"]) => MaybePromise<Extract<z.infer<Schema>, {
        event: K;
    }>["response"]>;
};
type ClientSDK<ClientSchema extends ValidZodEventSchema, Complete extends boolean> = {
    [K in NonNullable<z.infer<ClientSchema>["event"]>]: (req: Extract<z.infer<ClientSchema>, {
        event: K;
    }>["request"]) => Promise<Complete extends true ? Extract<z.infer<ClientSchema>, {
        event: K;
    }>["response"] : Extract<z.infer<ClientSchema>, {
        event: K;
    }>["response"] | undefined>;
};
type ServerImplementation<Schema extends ValidZodEventSchema, ForceCompleteness extends boolean = false> = ForceCompleteness extends true ? FullServerImplementation<Schema> : Partial<FullServerImplementation<Schema>>;
type FullServerMiddlewareImplementation<Schema extends ValidZodEventSchema, ForceCompleteness extends boolean = false> = {
    [K in NonNullable<z.infer<Schema>["event"]>]: (request: Extract<z.infer<Schema>, {
        event: K;
    }>["request"], next: ForceCompleteness extends true ? (request: Extract<z.infer<Schema>, {
        event: K;
    }>["request"]) => MaybePromise<Extract<z.infer<Schema>, {
        event: K;
    }>["response"]> : ((request: Extract<z.infer<Schema>, {
        event: K;
    }>["request"]) => MaybePromise<Extract<z.infer<Schema>, {
        event: K;
    }>["response"]>) | undefined) => MaybePromise<ForceCompleteness extends true ? Extract<z.infer<Schema>, {
        event: K;
    }>["response"] : Extract<z.infer<Schema>, {
        event: K;
    }>["response"] | undefined>;
};
type ServerMiddleware<Schema extends ValidZodEventSchema, ForceCompleteness extends boolean = false> = Partial<FullServerMiddlewareImplementation<Schema, ForceCompleteness>>;
type Transport<ServerSchema extends ValidZodEventSchema | undefined> = {
    send: (event: string, data: unknown, params: {
        localAppId: string;
        remoteAppId: string;
    }) => unknown;
    recv: (handler: (event: string, data: unknown) => Promise<(ServerSchema extends ValidZodEventSchema ? z.infer<ServerSchema>["response"] : undefined) | undefined>, params: {
        localAppId: string;
        remoteAppId: string;
    }) => void | (() => void);
    cleanup?: () => void;
};
declare function createSDK<ClientSchema extends ValidZodEventSchema | undefined, ServerSchema extends ValidZodEventSchema | undefined, ForceCompleteness extends boolean = false, ServerComplete extends boolean = false>({ clientSchema, serverSchema, serverComplete, transport, timeout, timeouts, localAppId, remoteAppId, serverImplementation, serverMiddleware, }: {
    clientSchema: ClientSchema;
    serverSchema: ServerSchema;
    forceCompleteness?: ForceCompleteness;
    serverComplete?: ServerComplete;
    localAppId: string;
    remoteAppId: string;
    serverMiddleware?: ServerSchema extends ValidZodEventSchema ? ServerMiddleware<ServerSchema, ForceCompleteness>[] : undefined;
    serverImplementation: ServerSchema extends ValidZodEventSchema ? ServerImplementation<ServerSchema, ForceCompleteness> : undefined;
    transport: Transport<ServerSchema>;
    timeout?: number;
    timeouts?: ClientSchema extends ValidZodEventSchema ? {
        [K in NonNullable<z.infer<ClientSchema>["event"]>]?: number;
    } : never;
}): (ClientSchema extends ValidZodEventSchema ? ClientSDK<ClientSchema, ServerComplete> : object) & {
    _cleanupTransport: () => void;
};

declare const whopServerSchema: z.ZodDiscriminatedUnion<"event", [z.ZodObject<{
    event: z.ZodLiteral<"ping">;
    request: z.ZodLiteral<"ping">;
    response: z.ZodLiteral<"pong">;
}, "strip", z.ZodTypeAny, {
    event: "ping";
    request: "ping";
    response: "pong";
}, {
    event: "ping";
    request: "ping";
    response: "pong";
}>, z.ZodObject<{
    event: z.ZodLiteral<"getTopLevelUrlData">;
    request: z.ZodOptional<z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>>;
    response: z.ZodObject<{
        companyRoute: z.ZodString;
        experienceRoute: z.ZodString;
        experienceId: z.ZodString;
        viewType: z.ZodEnum<["app", "admin", "analytics", "preview"]>;
        baseHref: z.ZodString;
        fullHref: z.ZodString;
    }, "strip", z.ZodTypeAny, {
        companyRoute: string;
        experienceRoute: string;
        experienceId: string;
        viewType: "app" | "admin" | "analytics" | "preview";
        baseHref: string;
        fullHref: string;
    }, {
        companyRoute: string;
        experienceRoute: string;
        experienceId: string;
        viewType: "app" | "admin" | "analytics" | "preview";
        baseHref: string;
        fullHref: string;
    }>;
}, "strip", z.ZodTypeAny, {
    event: "getTopLevelUrlData";
    response: {
        companyRoute: string;
        experienceRoute: string;
        experienceId: string;
        viewType: "app" | "admin" | "analytics" | "preview";
        baseHref: string;
        fullHref: string;
    };
    request?: {} | undefined;
}, {
    event: "getTopLevelUrlData";
    response: {
        companyRoute: string;
        experienceRoute: string;
        experienceId: string;
        viewType: "app" | "admin" | "analytics" | "preview";
        baseHref: string;
        fullHref: string;
    };
    request?: {} | undefined;
}>, z.ZodObject<{
    event: z.ZodLiteral<"openExternalUrl">;
    request: z.ZodObject<{
        newTab: z.ZodOptional<z.ZodBoolean>;
        url: z.ZodString;
    }, "strip", z.ZodTypeAny, {
        url: string;
        newTab?: boolean | undefined;
    }, {
        url: string;
        newTab?: boolean | undefined;
    }>;
    response: z.ZodLiteral<"ok">;
}, "strip", z.ZodTypeAny, {
    event: "openExternalUrl";
    request: {
        url: string;
        newTab?: boolean | undefined;
    };
    response: "ok";
}, {
    event: "openExternalUrl";
    request: {
        url: string;
        newTab?: boolean | undefined;
    };
    response: "ok";
}>, z.ZodObject<{
    event: z.ZodLiteral<"onHrefChange">;
    request: z.ZodObject<{
        href: z.ZodString;
    }, "strip", z.ZodTypeAny, {
        href: string;
    }, {
        href: string;
    }>;
    response: z.ZodLiteral<"ok">;
}, "strip", z.ZodTypeAny, {
    event: "onHrefChange";
    request: {
        href: string;
    };
    response: "ok";
}, {
    event: "onHrefChange";
    request: {
        href: string;
    };
    response: "ok";
}>, z.ZodObject<{
    event: z.ZodLiteral<"inAppPurchase">;
    request: z.ZodObject<{
        /**
         * ID returned from the `chargeUser` API call.
         * @example "ch_1234567890"
         */
        id: z.ZodOptional<z.ZodString>;
        /**
         * ID of the plan returned from the `chargeUser` API call.
         * @example "plan_1234567890"
         */
        planId: z.ZodString;
    }, "strip", z.ZodTypeAny, {
        planId: string;
        id?: string | undefined;
    }, {
        planId: string;
        id?: string | undefined;
    }>;
    response: z.ZodDiscriminatedUnion<"status", [z.ZodObject<{
        status: z.ZodLiteral<"ok">;
        data: z.ZodObject<{
            sessionId: z.ZodString;
            /**
             * The receipt ID can be used to verify the purchase.
             *
             * NOTE: When receiving payments you should always listen to webhooks as a fallback
             * to process the payment. Do not solely rely on the client to process payments. The receipt ID
             * can be used to deduplicate payment events.
             */
            receiptId: z.ZodString;
        }, "strip", z.ZodTypeAny, {
            sessionId: string;
            receiptId: string;
        }, {
            sessionId: string;
            receiptId: string;
        }>;
    }, "strip", z.ZodTypeAny, {
        status: "ok";
        data: {
            sessionId: string;
            receiptId: string;
        };
    }, {
        status: "ok";
        data: {
            sessionId: string;
            receiptId: string;
        };
    }>, z.ZodObject<{
        status: z.ZodLiteral<"error">;
        error: z.ZodString;
    }, "strip", z.ZodTypeAny, {
        status: "error";
        error: string;
    }, {
        status: "error";
        error: string;
    }>]>;
}, "strip", z.ZodTypeAny, {
    event: "inAppPurchase";
    request: {
        planId: string;
        id?: string | undefined;
    };
    response: {
        status: "ok";
        data: {
            sessionId: string;
            receiptId: string;
        };
    } | {
        status: "error";
        error: string;
    };
}, {
    event: "inAppPurchase";
    request: {
        planId: string;
        id?: string | undefined;
    };
    response: {
        status: "ok";
        data: {
            sessionId: string;
            receiptId: string;
        };
    } | {
        status: "error";
        error: string;
    };
}>, z.ZodObject<{
    event: z.ZodLiteral<"closeApp">;
    request: z.ZodNull;
    response: z.ZodLiteral<"ok">;
}, "strip", z.ZodTypeAny, {
    event: "closeApp";
    request: null;
    response: "ok";
}, {
    event: "closeApp";
    request: null;
    response: "ok";
}>, z.ZodObject<{
    event: z.ZodLiteral<"openHelpChat">;
    request: z.ZodNull;
    response: z.ZodLiteral<"ok">;
}, "strip", z.ZodTypeAny, {
    event: "openHelpChat";
    request: null;
    response: "ok";
}, {
    event: "openHelpChat";
    request: null;
    response: "ok";
}>, z.ZodObject<{
    event: z.ZodLiteral<"getColorTheme">;
    request: z.ZodVoid;
    response: z.ZodObject<{
        appearance: z.ZodOptional<z.ZodEnum<["light", "dark"]>>;
        accentColor: z.ZodOptional<z.ZodString>;
        dangerColor: z.ZodOptional<z.ZodString>;
        grayColor: z.ZodOptional<z.ZodString>;
        infoColor: z.ZodOptional<z.ZodString>;
        successColor: z.ZodOptional<z.ZodString>;
        warningColor: z.ZodOptional<z.ZodString>;
    }, "strip", z.ZodTypeAny, {
        appearance?: "light" | "dark" | undefined;
        accentColor?: string | undefined;
        dangerColor?: string | undefined;
        grayColor?: string | undefined;
        infoColor?: string | undefined;
        successColor?: string | undefined;
        warningColor?: string | undefined;
    }, {
        appearance?: "light" | "dark" | undefined;
        accentColor?: string | undefined;
        dangerColor?: string | undefined;
        grayColor?: string | undefined;
        infoColor?: string | undefined;
        successColor?: string | undefined;
        warningColor?: string | undefined;
    }>;
}, "strip", z.ZodTypeAny, {
    event: "getColorTheme";
    response: {
        appearance?: "light" | "dark" | undefined;
        accentColor?: string | undefined;
        dangerColor?: string | undefined;
        grayColor?: string | undefined;
        infoColor?: string | undefined;
        successColor?: string | undefined;
        warningColor?: string | undefined;
    };
    request?: void | undefined;
}, {
    event: "getColorTheme";
    response: {
        appearance?: "light" | "dark" | undefined;
        accentColor?: string | undefined;
        dangerColor?: string | undefined;
        grayColor?: string | undefined;
        infoColor?: string | undefined;
        successColor?: string | undefined;
        warningColor?: string | undefined;
    };
    request?: void | undefined;
}>, z.ZodObject<{
    event: z.ZodLiteral<"earliestUnreadNotification">;
    request: z.ZodObject<{
        experienceId: z.ZodString;
    }, "strip", z.ZodTypeAny, {
        experienceId: string;
    }, {
        experienceId: string;
    }>;
    response: z.ZodNullable<z.ZodObject<{
        externalId: z.ZodString;
    }, "strip", z.ZodTypeAny, {
        externalId: string;
    }, {
        externalId: string;
    }>>;
}, "strip", z.ZodTypeAny, {
    event: "earliestUnreadNotification";
    request: {
        experienceId: string;
    };
    response: {
        externalId: string;
    } | null;
}, {
    event: "earliestUnreadNotification";
    request: {
        experienceId: string;
    };
    response: {
        externalId: string;
    } | null;
}>, z.ZodObject<{
    event: z.ZodLiteral<"markExperienceRead">;
    request: z.ZodObject<{
        experienceId: z.ZodString;
        notificationExternalId: z.ZodOptional<z.ZodString>;
    }, "strip", z.ZodTypeAny, {
        experienceId: string;
        notificationExternalId?: string | undefined;
    }, {
        experienceId: string;
        notificationExternalId?: string | undefined;
    }>;
    response: z.ZodLiteral<"ok">;
}, "strip", z.ZodTypeAny, {
    event: "markExperienceRead";
    request: {
        experienceId: string;
        notificationExternalId?: string | undefined;
    };
    response: "ok";
}, {
    event: "markExperienceRead";
    request: {
        experienceId: string;
        notificationExternalId?: string | undefined;
    };
    response: "ok";
}>, z.ZodObject<{
    event: z.ZodLiteral<"performHaptic">;
    request: z.ZodObject<{
        type: z.ZodEnum<["selection", "impact", "notification"]>;
        style: z.ZodEnum<["light", "medium", "heavy"]>;
    }, "strip", z.ZodTypeAny, {
        type: "selection" | "impact" | "notification";
        style: "light" | "medium" | "heavy";
    }, {
        type: "selection" | "impact" | "notification";
        style: "light" | "medium" | "heavy";
    }>;
    response: z.ZodLiteral<"ok">;
}, "strip", z.ZodTypeAny, {
    event: "performHaptic";
    request: {
        type: "selection" | "impact" | "notification";
        style: "light" | "medium" | "heavy";
    };
    response: "ok";
}, {
    event: "performHaptic";
    request: {
        type: "selection" | "impact" | "notification";
        style: "light" | "medium" | "heavy";
    };
    response: "ok";
}>]>;

export { type ClientSDK as C, type ServerImplementation as S, type Transport as T, type ValidZodEventSchema as V, createSDK as c, whopServerSchema as w };
