/** Widget element */
declare class SanaWidgetHTMLElement extends HTMLElement {
    displaymode: "LIGHTBOX" | "EMBEDDED";
    operationmode: "DEFAULT" | "SINGLE_ROOM";
    locale: Locale;
    singleroomid: string;
    uicustomizations: UICustomizations;
    whitelabelid: string;
    hiddenonstartup: boolean;
    singleroomheader: "DEFAULT" | "CONTEXT" | "NONE";
    uploadcallbackconfig: UploadCallbacksConfig;
    externaluserid: string;
    notificationicon: string;
    notificationappname: string;
    ssoname: string;
    oidcprovider: "rofim" | "curie";
    securitytokenttl: number;
    resourcecallbackconfig: ResourceCallbackConfig;

    show(): void;
    hide(): void;
    toggleVisibility(): boolean;
    deployLightbox(): void;
    foldLightbox(): void;
    getUnreadMessageNumber(): Promise<number>;
    markAllAsRead(): Promise<void>;
    getRoom(roomId: string): Promise<Room>;
    sendMessage(roomId: string, message: AbstractMessage): Promise<void>;
    sendFileMessage(securityToken: string, message: FileMessage): Promise<void>;
    createRoom(roomCreationRequest: RoomCreationRequest): Promise<Room>;
    enableLogs(): Promise<void>;
    disableLogs(): Promise<void>;
    logout(): Promise<void>;
    requestNotificationsPermission(): Promise<void>;
    disableNotifications(): Promise<void>;
    isNotificationsEnabled(): Promise<boolean>;
    sendResource(securityToken: string, resource: AbstractResource): Promise<void>;

}

// ---- WIDGET API TYPES ----
/**
 * Erreur remontée en cas de resource invalide
 */
declare class InvalidResourceError extends Error {
    constructor(msg: string);
}

/**
 * Erreur remonté en cas d'upload de fichier avec un securityToken invalid ou expiré
 */
declare class InvalidSecurityTokenError extends Error {
    constructor(securityToken: string);
}

declare class NonExistentUsersError extends Error {
    nonExistentUsers: string[];
    constructor(nonExistentUsers: string[]);
}

/**
 * Erreur remonté en cas d'erreur lors de l'upload de fichier avec un Uuid
 */
declare class SendFileError extends Error {
    constructor(uuid: string, error: string);
}

declare class SingleRoomError extends Error {
    constructor(message: string);
}

declare class WhitelabelError extends Error {
    constructor(message: string, error?: Error);
}

declare class ChatWidgetEvent {
    'm.rofim.is-ready': boolean;
    'm.rofim.display-mode': string;
    'm.rofim.operation-mode': string;
    'm.rofim.user-id': string;
    'm.rofim.unread-messages': number;
    constructor(ready: boolean, displayMode: 'LIGHTBOX' | 'EMBEDDED', operationMode: 'DEFAULT' | 'SINGLE_ROOM', userID: string, unreadMessages: number);
}

declare class AllNotificationsHaveBeenReadEvent extends ChatWidgetEvent {
    constructor(ready: boolean, displayMode: 'LIGHTBOX' | 'EMBEDDED', operationMode: 'DEFAULT' | 'SINGLE_ROOM', userID: string, unreadMessages: number);
}

declare class LightboxDeployedEvent extends ChatWidgetEvent {
    constructor(ready: boolean, displayMode: 'LIGHTBOX' | 'EMBEDDED', operationMode: 'DEFAULT' | 'SINGLE_ROOM', userID: string, unreadMessages: number);
}

declare class LightboxFoldedEvent extends ChatWidgetEvent {
    constructor(ready: boolean, displayMode: 'LIGHTBOX' | 'EMBEDDED', operationMode: 'DEFAULT' | 'SINGLE_ROOM', userID: string, unreadMessages: number);
}

declare class MessageReadEvent extends ChatWidgetEvent {
    'm.rofim.message-read': {
        'm.rofim.room.room-id': string;
        'm.rofim.room.room-alias': string | null | undefined;
        'm.rofim.room.unread-message': number;
    };
    constructor(ready: boolean, displayMode: 'LIGHTBOX' | 'EMBEDDED', operationMode: 'DEFAULT' | 'SINGLE_ROOM', userID: string, roomID: string, roomAlias: string | null | undefined, unreadMessages: number, roomUnreadMessage: number);
}

declare class NewMessageEvent extends ChatWidgetEvent {
    'm.rofim.new-message': {
        'm.rofim.room.room-id': string;
        'm.rofim.room.room-alias': string | null | undefined;
        'm.rofim.message.from': string;
        'm.rofim.room.unread-message': number;
        'm.rofim.message.type': 'TEXT' | 'FILE';
    };
    constructor(ready: boolean, displayMode: 'LIGHTBOX' | 'EMBEDDED', operationMode: 'DEFAULT' | 'SINGLE_ROOM', userID: string, roomID: string, roomAlias: string | null | undefined, from: string, unreadMessages: number, roomUnreadMessage: number, messageType: 'TEXT' | 'FILE');
}

declare class ReadyEvent extends ChatWidgetEvent {
    'm.rofim.ready': {
        'm.rofim.failure-reason'?: string;
        'm.rofim.singleroom-id'?: string;
        'm.rofim.singleroom-alias'?: string | null;
    };
    'm.rofim.rooms-unread-messages': Array<{
        'm.rofim.room.room-id': string;
        'm.rofim.room.room-alias': string | null | undefined;
        'm.rofim.room.unread-messages': number;
    }>;
    constructor(ready: boolean, displayMode: 'LIGHTBOX' | 'EMBEDDED', operationMode: 'DEFAULT' | 'SINGLE_ROOM', userID: string, unreadMessages: number, singleroomId?: string, singleroomAlias?: string | null, failureReason?: string, roomsUnreadMessages?: Array<{
        roomId: string;
        roomAlias: string | null | undefined;
        unreadMessages: number;
    }>);
}

declare class ResourceClickedEvent extends ChatWidgetEvent {
    'm.rofim.resource-clicked': {
        'm.rofim.payload': Object;
        'm.rofim.resource-type': 'GENERIC' | 'ACT' | 'PATIENT';
    };
    constructor(ready: boolean, displayMode: 'LIGHTBOX' | 'EMBEDDED', operationMode: 'DEFAULT' | 'SINGLE_ROOM', userID: string, unreadMessages: number, payload: Object, resourceType: 'GENERIC' | 'ACT' | 'PATIENT');
}

declare abstract class AbstractMessage {
    abstract type: 'TEXT' | 'FILE';
}

declare class FileMessage extends AbstractMessage {
    type: 'TEXT' | 'FILE';
    securityToken: string;
    uploadFile: AbstractUploadFile;
    constructor(securityToken: string, uploadFile: AbstractUploadFile);
}
declare abstract class AbstractUploadFile {
    /** Type de Fichier à uploader */
    abstract type: 'BLOB' | 'URL';
}

declare class Room {
    roomId: string;
    name: string;
    members: string[];
    constructor(roomId: string, name: string, members: string[]);
}

declare class RoomCreationRequest {
    roomName: string;
    membersToInvite: string[];
    act?: Act;
    constructor(roomName: string, membersToInvite: string[]);
}
declare class Act {
    actType: string;
    actId: string;
    actUrl: string;
    constructor(actType: string, actId: string, actUrl: string);
}

declare class TextMessage extends AbstractMessage {
    type: 'TEXT' | 'FILE';
    text: string;
    constructor(text: string);
}

/**
 * Configuration générale des callbacks d'upload de fichier.
 */
declare interface UploadCallbacksConfig {
    /** Liste des callbacks disponibles */
    callbacks: CallbackConfig[];
}
/**
 * Configuration générale des callbacks de resource
 */
declare interface ResourceCallbackConfig {
    onClickAction: 'NONE' | 'OPEN_TAB';
    /** Liste des callbacks disponibles */
    callbacks: CallbackConfig[];
}
/** Le context qui sera définie dans les paramètres d'appels de la Callback */
declare interface CallbackContext {
    /** Identifiant à usage unique utilisé lors de l'upload des fichiers via API. */
    securityToken: string;
    /** La clé de la callback qui est éxécuté */
    callbackKey: string;
}
declare interface CallbackReference {
    /** Type de référence : 'function' pour fonction directe, 'alias' pour alias global */
    type: 'FUNCTION_NAME' | 'FUNCTION_OBJECT';
    /** La fonction elle-même (si type='function') ou l'alias string (si type='alias') */
    value: Function | string;
}
/**
 * Configuration d'une callback d'upload
 */
declare interface CallbackConfig {
    /** Identifiant unique de la callback */
    key: string;
    /** Nom affiché à l'utilisateur */
    buttonLabel: string;
    /** Description optionnelle (title) */
    buttonTitle?: string;
    /** Icône à afficher (classe CSS ou nom d'icône) */
    icon?: string;
    /** La fonction callback à exécuter OU l'alias de la fonction présente dans le DOM*/
    callbackRef: CallbackReference;
}

declare enum Locale {
    DE_DE = "de-DE",
    EN_GB = "en-GB",
    ES_ES = "es-ES",
    FR_FR = "fr-FR",
    IT_IT = "it-IT",
    PT_PT = "pt-PT"
}

declare interface UICustomizations {
    primaryColor?: string;
    surfaceColor?: string;
    radius?: number;
    sentMessageBackgroundColor?: string;
    sentMessageTextColor?: string;
    readMessageIconColor?: string;
}
