declare type ExtendedWindow = Window & {
    __lc: {
        license: number;
        group?: number;
        params?: Array<{
            name: string;
            value: string;
        }>;
        chat_between_groups?: boolean;
        integration_name?: string;
        custom_identity_provider?: CustomIdentityProvider;
    };
    LiveChatWidget: {
        on: typeof on;
        off: typeof on;
        once: typeof on;
        get: typeof get;
        call: typeof call;
        init: VoidFunction;
    };
    LC_API?: {
        on_after_load?: VoidFunction;
    };
};
declare function on(name: 'ready', handler: EventHandlers['onReady']): void;
declare function on(name: 'new_event', handler: EventHandlers['onNewEvent']): void;
declare function on(name: 'form_submitted', handler: EventHandlers['onFormSubmitted']): void;
declare function on(name: 'greeting_hidden', handler: EventHandlers['onGreetingHidden']): void;
declare function on(name: 'rating_submitted', handler: EventHandlers['onRatingSubmitted']): void;
declare function on(name: 'visibility_changed', handler: EventHandlers['onVisibilityChanged']): void;
declare function on(name: 'greeting_displayed', handler: EventHandlers['onGreetingDisplayed']): void;
declare function on(name: 'availability_changed', handler: EventHandlers['onAvailabilityChanged']): void;
declare function on(name: 'customer_status_changed', handler: EventHandlers['onCustomerStatusChanged']): void;
declare function on(name: 'rich_message_button_clicked', handler: EventHandlers['onRichMessageButtonClicked']): void;
declare function get(name: 'state'): WidgetState;
declare function get(name: 'chat_data'): ChatData;
declare function get(name: 'customer_data'): CustomerData;
declare function call(name: 'hide'): void;
declare function call(name: 'maximize'): void;
declare function call(name: 'minimize'): void;
declare function call(name: 'destroy'): void;
declare function call(name: 'hide_greeting'): void;
declare function call(name: 'set_customer_name', payload: CustomerData['name']): void;
declare function call(name: 'set_customer_email', payload: CustomerData['email']): void;
declare function call(name: 'set_session_variables', payload: CustomerData['sessionVariables']): void;
declare function call(name: 'update_session_variables', payload: CustomerData['sessionVariables']): void;
declare type MutableCustomerData = {
    name: string;
    email: string;
};
declare type CustomerData = MutableCustomerData & {
    id: string;
    isReturning: boolean;
    status: 'queued' | 'chatting' | 'browsing' | 'invited';
    sessionVariables: Record<string, string>;
};
declare type ConfigurationOptions = {
    license: string;
    group?: string;
    chatBetweenGroups?: boolean;
    sessionVariables?: CustomerData['sessionVariables'];
    customIdentityProvider?: CustomIdentityProvider;
};
declare type ChatData = {
    chatId: string;
    threadId: string;
};
declare type Greeting = {
    id: number;
    uniqueId: string;
};
declare type ChatEvent = {
    timestamp: number;
    type: 'message' | 'rich_message' | 'file';
    author: {
        id: string;
        type: 'customer' | 'agent';
    };
    greeting?: Greeting;
};
declare type RichMessageButton = {
    eventId: string;
    postbackId: string;
    greeting?: Greeting;
};
declare type WidgetState = {
    availability: 'online' | 'offline';
    visibility: 'maximized' | 'minimized' | 'hidden';
};
declare type EventHandlers = {
    onReady?: (data: {
        state: WidgetState;
        customerData: CustomerData;
    }) => void;
    onAvailabilityChanged?: (data: Pick<WidgetState, 'availability'>) => void;
    onVisibilityChanged?: (data: Pick<WidgetState, 'visibility'>) => void;
    onCustomerStatusChanged?: (data: Pick<CustomerData, 'status'>) => void;
    onNewEvent?: (event: ChatEvent) => void;
    onFormSubmitted?: (data: {
        type: 'prechat' | 'postchat' | 'ticket';
    }) => void;
    onRatingSubmitted?: (rating: 'good' | 'bad' | 'none') => void;
    onGreetingDisplayed?: (greeting: Greeting) => void;
    onGreetingHidden?: (greeting: Greeting) => void;
    onRichMessageButtonClicked?: (button: RichMessageButton) => void;
};
declare type EventHandlerPayload<T extends keyof EventHandlers, E = Required<EventHandlers>[T]> = E extends (...args: any) => void ? Parameters<E>['0'] : never;
declare type Token = {
    accessToken: string;
    entityId: string;
    expiresIn: number;
    tokenType: 'Bearer';
    creationDate: number;
    licenseId: number;
};
declare type CustomIdentityProvider = () => {
    getToken: () => Promise<Token>;
    getFreshToken: () => Promise<Token>;
    hasToken: () => Promise<boolean>;
    invalidate: () => Promise<void>;
};

declare function getData(entity: 'state'): WidgetState;
declare function getData(entity: 'chat'): ChatData;
declare function getData(entity: 'customer'): CustomerData;

declare type WidgetConfig = ConfigurationOptions & EventHandlers & {
    visibility?: WidgetState['visibility'];
    customerName?: CustomerData['name'];
    customerEmail?: CustomerData['email'];
};
declare type WidgetInstance = {
    init: VoidFunction;
    destroy: VoidFunction;
    hideGreeting: VoidFunction;
    updateVisibility: (visibility?: WidgetState['visibility']) => void;
    updateEventHandlers: (eventHandlers: EventHandlers) => void;
    updateSessionVariables: (sessionVariables: WidgetConfig['sessionVariables']) => void;
    updateCustomerData: (customerData: Partial<MutableCustomerData>) => void;
};
declare function createWidget(config: WidgetConfig): WidgetInstance;

declare function assignConfiguration({ license, group, chatBetweenGroups, sessionVariables, customIdentityProvider, }: ConfigurationOptions): void;

declare function assignCustomerData(customerData: Partial<MutableCustomerData>): void;

declare function assignEventHandlers(method: 'on' | 'off' | 'once', eventHandlers: EventHandlers): void;

declare function assignVisibility(visibility?: WidgetState['visibility']): void;

declare function lcOnInit(callback: VoidFunction): VoidFunction;
declare function lcOnDestroy(callback: VoidFunction): VoidFunction;

export { ChatData, ChatEvent, ConfigurationOptions, CustomIdentityProvider, CustomerData, EventHandlerPayload, EventHandlers, ExtendedWindow, Greeting, MutableCustomerData, RichMessageButton, Token, WidgetConfig, WidgetInstance, WidgetState, assignConfiguration, assignCustomerData, assignEventHandlers, assignVisibility, createWidget, getData, lcOnDestroy, lcOnInit };
