import { IBaseCheckableElement, ElementRect, AlertRect } from '@textly/lx-checker-dom-lib';
import { CheckerAlert } from '@textly/lx-checker-lib';

interface ILinguixMessage {
    type: string;
    id: string;
    payload?: any;
    [key: string]: any;
}

interface ILinguixContentMessenger {
    sendToBackground(message: ILinguixMessage): void;
    onBackgroundMessage(callback: (message: ILinguixMessage) => void): void;
    destroy(): void;
}

interface ILinguixBackgroundMessenger {
    sendToContent(message: ILinguixMessage): void;
    onContentMessage(callback: (message: ILinguixMessage) => void): void;
    destroy(): void;
}

interface ILinguixTextStats {
    wordsCount: number;
    charsCount: number;
    avgWordLength: number;
    avgSentenceLength: number;
    sentencesCount: number;
    fleschIndex: number;
    textScore: number;
    readingTimeSeconds: number;
    speakingTimeSeconds: number;
}

interface ILinguixConfig {
    url?: string;
    apiKey?: string;
    options?: {
        query?: {
            clientToken?: string;
        };
    };
    customTagNames?: {
        highlighter?: string;
        alert?: string;
    };
    language?: string;
    callbacks?: ILinguixCallbacks;
}
interface ILinguixCallbacks {
    onCheckResultReceived?: (result: {
        textStats?: ILinguixTextStats;
        alertsCount: number;
    }) => void;
    onReplacementApplied?: (data: {
        originalText: string;
        replacement: string;
        description: string;
    }) => void;
}
interface ILinguixElementConfig {
    callbacks?: ILinguixCallbacks;
}

type SupportedElement = HTMLTextAreaElement | HTMLElement;
type ILinguixMessenger = ILinguixContentMessenger | ILinguixBackgroundMessenger;
declare class LinguixCheckerSDK {
    static initialize(config: ILinguixConfig, messenger?: ILinguixMessenger): void;
    static attachToElement(element: SupportedElement, options?: ILinguixElementConfig): void;
    static detachFromElement(element: SupportedElement): void;
    static destroy(): void;
}

declare const LinguixHighlighterElement: {
    new (): {};
};
interface ILinguixHighlighterElement extends HTMLElement {
    initialize(checkable: IBaseCheckableElement, hasApiSubscription: boolean): void;
    setHasApiSubscription(hasApiSubscription: boolean): void;
    updateElementBox(elementBox: ElementRect): void;
    destroy(): void;
}
declare let highlighterTagName: string;
declare function defineHighlighterElement(customTagName?: string): void;

declare const LinguixAlertPopover: {
    new (): {};
};
interface ILinguixAlertPopover {
    initialize(checkable: IBaseCheckableElement, alert: CheckerAlert, rect: AlertRect, hasApiSubscription: boolean): void;
}
declare let alertPopoverTagName: string;
declare function defineAlertElement(customTagName?: string): void;

export { type ILinguixAlertPopover, type ILinguixBackgroundMessenger, type ILinguixCallbacks, type ILinguixConfig, type ILinguixContentMessenger, type ILinguixElementConfig, type ILinguixHighlighterElement, type ILinguixMessage, type ILinguixTextStats, LinguixAlertPopover, LinguixCheckerSDK, LinguixHighlighterElement, alertPopoverTagName, defineAlertElement, defineHighlighterElement, highlighterTagName };
