import { ChatSDK } from '@tencentcloud/chat';

/**
 * TUILogin login 参数信息(未说明的参数均可忽略)
 * @interface LoginParams
 * @property {number} SDKAppID 云通信应用的 SDKAppID
 * @property {string} userID 用户 ID
 * @property {string} userSig 用户登录即时通信 IM 的密码，其本质是对 UserID 等信息加密后得到的密文。<br/>具体生成方法请参见{@link https://cloud.tencent.com/document/product/269/32688 生成 UserSig}
 * @property {any} [TIMPush] uniapp 推送插件 默认 undefined
 * @property {any} [pushConfig] uniapp 推送插件配置信息 默认 undefined
 * @property {any} [TUIOfflinePush] uniapp 离线推送插件 默认 undefined(已废弃，推荐使用 TIMPush)
 * @property {any} [offlinePushConfig] uniapp 离线推送插件配置信息 默认 undefined(已废弃，推荐使用 TIMPush 对应的 pushConfig 参数)
 * @property {boolean} [useUploadPlugin] 是否使用上传插件 默认 false
 * @property {string} [fileUploadProxy] 图片、视频、文件上传代理地址
 * @property {string} [fileDownloadProxy] 图片、视频、文件下载代理地址
 * @property {string} [proxyServer] 设置 IM 服务代理服务
 * @property {string} [framework] vue2 | vue3 | rn，默认为空，请务必准确填写，用于分析 badcase
*/
interface LoginParams {
    SDKAppID: number;
    userID: string;
    userSig: string;
    TIMPush?: any;
    pushConfig?: any;
    TUIOfflinePush?: any;
    offlinePushConfig?: any;
    useUploadPlugin?: boolean;
    useProfanityFilterPlugin?: boolean;
    unlimitedAVChatRoom?: boolean;
    scene?: string;
    fileUploadProxy?: string;
    fileDownloadProxy?: string;
    proxyServer?: string;
    devMode?: boolean;
    framework?: string;
}
type func = (...args: any[]) => any;
/**
 * 调用服务的参数信息
 * @interface CallServiceParams
 * @property {string} serviceName 服务名
 * @property {string} method 调用的方法名
 * @property {any} params 业务参数
 * @property {func} [callback] 回调函数
*/
interface CallServiceParams {
    serviceName: string;
    method: string;
    params: Record<string, any>;
    callback?: func;
}
/**
 * 扩展配置信息
 * @interface ExtensionInfo
 * @property {number} weight 扩展组件权重，用于排序，weight 值越大显示位置越靠前
 * @property {string} text 扩展组件显示的名称
 * @property {string} icon 扩展组件图标 url
 * @property {object} data 自定义扩展信息
 * @property {object} listener 回调函数
 * @property {func} [listener.onClicked] 页面点击回调
 * @property {func} [listener.onLongPressed] 页面长按回调
 * @property {func} [listener.onTouched] 屏幕触摸回调
 * @property {func} [listener.onSwiped] 页面左右滑动回调
*/
interface ExtensionInfo {
    weight: number;
    text: string;
    icon: string;
    data: Record<string, any>;
    listener: {
        onClicked?: func;
        onLongPressed?: func;
        onTouched?: func;
        onSwiped?: func;
    };
}

interface ITUIService {
    onCall(method: string, params: object, callback?: func): void;
}

/**
 * @interface TUICore
*/
interface ITUICore {
    /**
     * 注册服务
     * @function
     * @param {string} serviceName 服务名
     * @param {ITUIService} service 服务实例
     * @example
     * TUICore.registerService(TUIConstants.TUICall.SERVICE.NAME, this);
    */
    registerService(serviceName: string, service: any): void;
    /**
     * 反注册服务
     * @function
     * @param {string} serviceName 服务名
     * @example
     * TUICore.unregisterService(TUIConstants.TUICall.SERVICE.NAME);
    */
    unregisterService(serviceName: string): void;
    /**
     * 获取服务
     * @function
     * @param {string} serviceName 服务名
     * @example
     * TUICore.getService(TUIConstants.TUICall.SERVICE.NAME);
    */
    getService(serviceName: string): ITUIService;
    /**
     * 调用服务
     * @function
     * @param {CallServiceParams} options 调用服务的参数
     * @example
     * TUICore.callService({
     *   serviceName: TUIConstants.TUICall.SERVICE.NAME,
     *   method: TUIConstants.TUICall.SERVICE.METHOD.CALL,
     *   params: {
     *    callType: 1,
     *    mediaType: 2
     *   },
     *   callback: (result) => {
     *     // todo
     *   },
     * });
    */
    callService(options: CallServiceParams): void;
    /**
     * 注册扩展组件
     * @function
     * @param {string} extensionID 扩展点 ID
     * @param {ITUIExtension} extension
     * @example
     * TUICore.registerExtension(TUIConstants.TUIChat.EXTENSION.INPUT_TOOLBAR, this);
     */
    registerExtension(extensionID: string, extension: any): void;
    /**
     * 反注册扩展组件
     * @function
     * @param {string} extensionID 扩展点 ID
     * @param {ITUIExtension} extension
     * @example
     * TUICore.unregisterExtension(TUIConstants.TUIChat.EXTENSION.INPUT_TOOLBAR, this);
    */
    unregisterExtension(extensionID: string, extension: any): void;
    /**
     * 获取注册扩展组件列表
     * @function
     * @param {string} extensionID 扩展点 ID
     * @param {object} [params] 扩展点参数
     * @example
     * TUICore.getExtension(TUIConstants.TUIChat.EXTENSION.INPUT_TOOLBAR, { filterVoice: true });
    */
    getExtensionList(extensionID: string, params?: object): Array<ExtensionInfo>;
    /**
     * 注册广播监听
     * @function
     * @param {string} eventName 事件名
     * @param {string} subKey 事件的具体操作
     * @param {ITUINotification} notification 事件监听者
     * @example
     * TUICore.registerEvent(TUIConstants.TUILogin.EVENT.LOGIN_STATE_CHANGED, this);
    */
    registerEvent(eventName: string, subKey: string, notification: any): void;
    /**
     * 反注册广播监听
     * @function
     * @param {string} eventName 事件名
     * @param {string} subKey 事件的具体操作
     * @param {ITUINotification} notification 事件监听者
     * @example
     * TUICore.unregisterEvent(TUIConstants.TUILogin.EVENT.LOGIN_STATE_CHANGED, this);
    */
    unregisterEvent(eventName: string, subKey: string, notification: any): void;
    /**
     * 广播消息通知
     * @function
     * @param {string} eventName 事件名
     * @param {string} subKey 事件的具体操作
     * @param {object} [params] 业务数据
     * @example
     * TUICore.notifyEvent(TUIConstants.TUILogin.EVENT.LOGIN_STATE_CHANGED, TUIConstants.TUILogin.EVENT_SUB_KEY.USER_LOGIN_SUCCESS);
    */
    notifyEvent(eventName: string, subKey: string, params?: object): void;
}

interface GetContextResult {
    chat: ChatSDK;
    SDKAppID: number;
    userID: string;
    userSig: string;
}
/**
 * @interface TUILogin
*/
interface ITUILogin {
    /**
     * 登录 Chat SDK
     * @function
     * @param {LoginParams} options 登录参数
     * @example
     * TUILogin.login({
     *   SDKAppID: xxx,
     *   userID: 'xxx',
     *   userSig: 'xxx',
     *   useUploadPlugin: true, // 使用文件上传插件
     * });
     */
    login(options: LoginParams): Promise<any>;
    /**
     * 登出 Chat SDK
     * @function
     * @example
     * let promise = TUILogin.logout();
     *  promise.then(() => {
     *    // 登出成功后进行相关业务逻辑处理
     *  })
     */
    logout(): Promise<any>;
    /**
     * 销毁 Chat SDK 实例，SDK 会先 logout，然后断开 WebSocket 长连接，并释放资源。
     * @function
     * @example
     * let promise = TUILogin.destroy();
     */
    destroy(): Promise<any>;
    /**
     * 设置 Chat SDK 日志级别
     * @function
     * @param {number} level 日志级别
     * - 0 普通级别，日志量较多，接入时建议使用
     * - 1 release级别，SDK 输出关键信息，生产环境时建议使用
     * - 2 告警级别，SDK 只输出告警和错误级别的日志
     * - 3 错误级别，SDK 只输出错误级别的日志
     * - 4 无日志级别，SDK 将不打印任何日志
     * @example
     * TUILogin.setLogLevel(0)
     */
    setLogLevel(level: number): void;
    /**
     * 获取 TUILogin 当前上下文信息
     * @function
     * @example
     * const { chat, SDKAppID, userID, userSig } = TUILogin.getContext();
     * // chat - Chat SDK 实例
     * // SDKAppID - 即时通信应用 AppID
     * // userID - 用户 ID
     * // userSig - 用户登录前面
     */
    getContext(): GetContextResult;
}

declare const TUIConstants: {
    TUILogin: {
        EVENT: {
            LOGIN_STATE_CHANGED: string;
        };
        EVENT_SUB_KEY: {
            USER_LOGIN_SUCCESS: string;
            USER_LOGOUT_SUCCESS: string;
            USER_KICKED_OFFLINE: string;
            USER_SIG_EXPIRED: string;
        };
    };
    TUIConversation: {
        SERVICE: {
            NAME: string;
            METHOD: {
                CREATE_CONVERSATION: string;
                HIDE_CONVERSATION_HEADER: string;
            };
        };
        EXTENSION: {
            CONV_POP_MENU: {
                EXT_ID: string;
            };
            CONV_GROUP: {
                EXT_ID: string;
            };
        };
    };
    TUIChat: {
        SERVICE: {
            NAME: string;
            METHOD: {
                UPDATE_MESSAGE_LIST: string;
                CLOSE_MESSAGE_POP_MENU: string;
                SEND_CUSTOM_MESSAGE: string;
                SEND_TEXT_MESSAGE: string;
                SET_CHAT_TYPE: string;
                UPDATE_MESSAGE_INFO: string;
            };
        };
        EXTENSION: {
            INPUT_MORE: {
                EXT_ID: string;
            };
            MSG_POP_MENU: {
                EXT_ID: string;
            };
            CHAT_HEADER: {
                EXT_ID: string;
            };
        };
        TYPE: {
            C2C: string;
            GROUP: string;
            CUSTOMER_SERVICE: string;
            ROOM: string;
        };
        EVENT: {
            CHAT_STATE_CHANGED: string;
            CHAT_TYPE_CHANGED: string;
        };
        EVENT_SUB_KEY: {
            CHAT_OPENED: string;
            CHANGE_SUCCESS: string;
        };
        FEATURE: {
            DownloadFile: string;
            CopyMessage: string;
            DeleteMessage: string;
            RevokeMessage: string;
            QuoteMessage: string;
            ForwardMessage: string;
            TranslateMessage: string;
            VoiceToText: string;
            MultiSelection: string;
            EmojiReaction: string;
            InputEmoji: string;
            InputStickers: string;
            InputImage: string;
            InputVoice: string;
            InputVideo: string;
            InputFile: string;
            InputEvaluation: string;
            InputQuickReplies: string;
            InputMention: string;
            MessageSearch: string;
            ReadStatus: string;
        };
    };
    TUIGroup: {
        SERVICE: {
            NAME: string;
            METHOD: {
                CREATE_GROUP: string;
                OPEN_GROUP_MANAGEMENT: string;
                SELECT_GROUP_MEMBER: string;
            };
        };
    };
    TUIContact: {
        SERVICE: {
            NAME: string;
            METHOD: {
                SELECT_FRIEND: string;
            };
        };
        EXTENSION: {
            CONTACT_LIST: {
                EXT_ID: string;
            };
        };
    };
    TUISearch: {
        SERVICE: {
            NAME: string;
            METHOD: {
                SEARCH_GROUP: string;
                SEARCH_USER: string;
                SEARCH_FRIEND: string;
                SEARCH_GROUP_MEMBER: string;
            };
        };
        EXTENSION: {
            SEARCH_MORE: {
                EXT_ID: string;
            };
        };
    };
    TUICalling: {
        SERVICE: {
            NAME: string;
            METHOD: {
                START_CALL: string;
            };
        };
    };
    TUIRoom: {
        SERVICE: {
            NAME: string;
        };
    };
    TUIEmojiPlugin: {
        SERVICE: {
            NAME: string;
            METHOD: {
                CLOSE_EMOJI_DETAIL: string;
            };
        };
    };
    TUITranslate: {
        EVENT: {
            LANGUAGE_CHANGED: string;
        };
        EVENT_SUB_KEY: {
            CHANGE_SUCCESS: string;
        };
    };
    TUITranslatePlugin: {
        SERVICE: {
            NAME: string;
        };
    };
    TUIVoiceToTextPlugin: {
        SERVICE: {
            NAME: string;
        };
    };
    TUICustomerServicePlugin: {
        SERVICE: {
            NAME: string;
            METHOD: {
                ACTIVE_CONVERSATION: string;
                FILTER_MESSAGE: string;
            };
        };
        EXTENSION: {};
    };
    TUIPushPlugin: {
        SERVICE: {
            NAME: string;
        };
    };
    TUIChatbotPlugin: {
        SERVICE: {
            NAME: string;
        };
    };
    TUITheme: {
        EVENT: {
            THEME_CHANGED: string;
        };
        EVENT_SUB_KEY: {
            CHANGE_SUCCESS: string;
        };
    };
};

declare const tuiCore: ITUICore;
declare const tuiLogin: ITUILogin;

export { CallServiceParams, ExtensionInfo, LoginParams, TUIConstants, tuiCore as TUICore, tuiLogin as TUILogin, tuiCore as default, func };
