import * as mobx from 'mobx';
import { ObservableMap } from 'mobx';
import * as _rongcloud_engine from '@rongcloud/engine';
import { FileType, IAsyncRes, UploadMethod, ILogger, PluginContext, IConversationOption, ConversationType as ConversationType$1, RCConnectionStatus } from '@rongcloud/engine';
import { LogL, ConversationType, IAReceivedMessage, NotificationLevel, BaseMessage, ISendMessageOptions, IAsyncRes as IAsyncRes$1, GetHistoryMessageResult } from '@rongcloud/imlib-next';

/**
 * 上传信息
 * @category Interface
 */
interface IKitUploadInfo {
    file?: File;
    path?: string;
    fileSize: number;
    fileType: FileType;
    duration?: number;
    onProgress?: (progress: number) => void;
    onComplete?: (res: IAsyncRes<IKitUploadCompleteData>) => void;
}
/**
 * 上传请求数据接口
 * 用于外部调用者发起请求
 * @category Interface
 */
interface IKitUploadRequestData {
    url: string;
    headers: Record<string, string>;
    body: Record<string, string>;
    fileName: string;
    uniqueName?: string;
    contentType?: string;
    uploadMethod?: UploadMethod;
}
/**
 * @hidden
 */
interface IKitUploadResult {
    name: string;
    downloadUrl: string;
    uniqueName: string;
    size: number;
    type: string;
    /**
     * 音频时长，单位秒
     */
    duration?: number;
    length?: number;
    /**
     * 图片缩略图
     */
    thumbnail?: string;
    /**
     * 图片宽度
     */
    width?: number;
    /**
     * 图片高度
     */
    height?: number;
}
/**
 * 图片信息
 * @category Interface
 */
interface IKitImageInfo {
    /**
     * 图片缩略图的 base64 数据
     */
    thumbnail?: string;
    /**
     * 图片宽度
     */
    width?: number;
    /**
     * 图片高度
     */
    height?: number;
}
/**
 * 缩略图配置
 * @category Interface
 */
interface IKitThumbnailConfig {
    /**
     * 最大高度
     */
    maxHeight?: number;
    /**
     * 最大宽度
     */
    maxWidth?: number;
    /**
     * 图片质量
     */
    quality?: number;
    /**
     * 缩放比例
     */
    scale?: number;
}
/**
 * 上传完成返回数据信息
 * @category Interface
 */
interface IKitUploadCompleteData {
    downloadUrl: string;
}
/**
 * 上传请求协议接口
 * 由外部实现，用于执行上传请求
 * @category class
 */
declare abstract class AKitUploadRequest {
    uploadInfo: IKitUploadInfo;
    protected _abortStatus: boolean;
    protected _requestData?: IKitUploadRequestData;
    /**
     * @hidden
     */
    constructor(info: IKitUploadInfo);
    /**
     * 设置请求数据
     * @param data 上传请求数据
     */
    setRequestData(data: IKitUploadRequestData): void;
    /**
     * 执行上传请求
     * @returns 上传结果
     */
    abstract execute(): Promise<IAsyncRes<IKitUploadResult>>;
    /**
     * 取消上传请求
     */
    abort(): void;
    isAbort(): boolean;
}

/**
 * store 初始化参数
 * @category Interface
 */
interface IRCStoreInitOpts {
    /**
   * 日志输出等级，默认值 `LogL.WARN(2)`
   */
    logLevel?: LogL.DEBUG | LogL.INFO | LogL.WARN | LogL.ERROR;
    /**
     * 业务数据模块钩子，用于向 SDK 注入用户信息、群组信息等。
     */
    hooks?: IKitServiceHooks;
}
/**
 * 会话信息
 * @category Interface
 */
interface IKitConversation {
    /**
     * 根据 targetId、conversationType、channelId 生成的唯一标识
     */
    key: string;
    targetId: string;
    conversationType: ConversationType;
    channelId: string;
    name: string;
    nickName: string;
    portraitUri: string;
    draft: string;
    latestMessage: IAReceivedMessage | null;
    isTop: boolean;
    notificationLevel: NotificationLevel;
    unreadCount: number;
    updateTime: number;
    memberCount: number;
}
/**
 * @hidden
 */
type CacheType<T> = ObservableMap<string, {
    data: T;
    expires: number;
    pending: boolean;
}>;
/**
 * Profile 基础信息
 * @category Interface
 * @hidden
 */
interface IBaseProfile {
    /**
     * 唯一标识
     */
    id: string;
    /**
     * 名称
     */
    name: string;
    /**
     * 头像
     */
    portraitUri?: string;
}
/**
 * 用户信息
 * @category Interface
 */
interface IUserProfile extends IBaseProfile {
    /**
     * 用户备注
     */
    remark?: string;
}
/**
 * 群组信息
 * @category Interface
 */
interface IGroupProfile extends IBaseProfile {
    /**
     * 群组成员数量
     */
    memberCount: number;
    /**
     * 群组备注
     */
    remark?: string;
}
/**
 * 系统信息
 * @category Interface
 */
interface ISystemProfile extends IBaseProfile {
}
/**
 * 群组成员信息
 * @category Interface
 */
interface IGroupMemberProfile {
    /**
     * 群成员昵称
     */
    groupNickname: string;
    /**
     * 用户信息
     */
    user: {
        /**
         * 用户 ID
         */
        id: string;
        /**
         * 用户昵称
         */
        nickname: string;
        /**
         * 用户头像
         */
        portraitUri?: string;
    };
}
/**
 * 数据源接口约束
 * @hidden
 */
interface IDataSource {
    getUserProfile(userIds: string[]): Promise<IUserProfile[]>;
    getGroupProfile(groupIds: string[]): Promise<IGroupProfile[]>;
    getSystemProfile(systemIds: string[]): Promise<ISystemProfile[]>;
    getGroupMembers(groupId: string): Promise<IGroupMemberProfile[]>;
}
/**
 * 用户信息回调钩子
 * @category Interface
 */
interface IKitServiceHooks {
    /**
     * 根据 userId 批量获取用户信息
     * @param userIds - 用户 ID 列表
     */
    reqUserProfiles?(userIds: string[]): Promise<IUserProfile[]>;
    /**
     * 根据 groupId 批量获取群组信息
     * @param groupIds - 群组 ID 列表
     */
    reqGroupProfiles?(groupIds: string[]): Promise<IGroupProfile[]>;
    /**
     * 批量获取系统会话信息，当会话列表中存在 ConversationType.SYSTEM 类型时，会调用此方法获取系统会话信息
     * @param targetIds - 系统会话 ID 列表
     */
    reqSystemProfiles?(targetIds: string[]): Promise<ISystemProfile[]>;
    /**
     * 根据 groupId 获取群组成员列表信息
     * @param groupId - 群组 ID
     */
    reqGroupMembers?(groupId: string): Promise<IGroupMemberProfile[]>;
}
/**
 * 消息信息
 * @category Interface
 */
interface IKitMessage extends IKitMessageCache {
    user: {
        nickname: string;
        portraitUri: string;
        groupNickname?: string;
    };
}
/**
 * @category Interface
 */
interface IKitMessageCache extends IAReceivedMessage {
    /**
     * 媒体消息本地临时路径
     */
    localTmpPath?: string;
}
/**
 * 内存态会话更新信息
 * @category Interface
 */
interface IConversationUpdate {
    /**
     * 置顶变更
     */
    isTop?: boolean;
    /**
     * 免打扰状态变更
     */
    notificationLevel?: NotificationLevel;
    /**
     * 未读数变更
     */
    unreadCount?: number;
    /**
     * 会话最后一条消息变更
     */
    latestMessage?: IAReceivedMessage | null;
    /**
     * 会话草稿变更
     */
    draft?: string;
}
/**
 * 媒体消息参数
 * @category Interface
 */
interface IKitMediaMessageOptions {
    /**
   * 会话 key
   */
    conversationKey: string;
    /**
     * 消息
     */
    message: BaseMessage;
    /**
     * 发送消息选项
     */
    sendOptions?: ISendMessageOptions;
    /**
     * 上传信息
     */
    info: IKitUploadInfo;
    /**
     * 上传请求器
     */
    request: AKitUploadRequest;
}

/**
 * 消息列表状态管理
 * @category class
 */
declare class RCKitMessageStore {
    #private;
    private readonly _logger;
    private rootStore;
    private _context;
    /**
     * @hidden
     */
    constructor(_logger: ILogger, rootStore: RCKitStore, _context: PluginContext);
    getMessages(conversationKey: string): IKitMessage[];
    /**
     * 获取历史消息
     * @param conversationKey 会话ID
     * @param endTime 结束时间戳, 精确到 ms
     * @param lastMsgUId 上次查询的最后一条消息的 messageUId, 第一次不填
     * @param limit 查询的数量, 默认 20
     * @returns
     */
    getHistoryMsgList(conversationKey: string, endTime: number, lastMsgUId?: string, limit?: number): Promise<IAsyncRes$1<GetHistoryMessageResult>>;
    /**
     * 从消息队列尾部插入一条消息，如果缓存中不存在消息所在会话，则不做任何操作
     * @param message 消息对象
     * @param isTrim 是否需要移除超出队列缓存上限部分，默认为 true
     */
    insertMessage(message: IKitMessageCache, isTrim?: boolean, isLog?: boolean): IKitMessageCache;
    /**
     * 更新缓存中的消息，如果缓存中不存在则不做任何操作
     * @param message 消息对象
     * @returns
     */
    updateCatchedMessage(message: IKitMessageCache): void;
    /**
     * 移除一条缓存中的消息
     * @param message 消息对象
     */
    removeCatchedMessage(message: Pick<IAReceivedMessage, 'conversationType' | 'targetId' | 'channelId' | 'messageUId' | 'messageId'>): void;
    /**
     * 撤回消息
     * @param message 消息对象
     */
    recallMessage(message: IAReceivedMessage): Promise<_rongcloud_engine.RCResult<IAReceivedMessage>>;
    /**
     * 发送消息
     * @param message 消息实例
     */
    sendMessage(conversationKey: string, message: BaseMessage, options: ISendMessageOptions): Promise<IAsyncRes$1<IAReceivedMessage>>;
    /**
     * 发送媒体消息
     */
    sendMediaMessage(mediaOptions: IKitMediaMessageOptions): Promise<IAsyncRes$1<IAReceivedMessage>>;
    /**
     * 转发消息
     * @param conversationKey 会话ID
     * @param message 消息列表
     */
    forwardMessage(conversationKey: string, message: IAReceivedMessage): Promise<{
        code: number;
        data?: IAReceivedMessage | undefined;
    }>;
    /**
     * 取消指定消息的上传请求
     * @param messageId 消息ID
     */
    cancelSendMediaMessage(messageId: number): void;
    /**
     * 获取选中的消息
     */
    getSelectedMessages(): IKitMessage[];
    /**
     * 设置选中的消息
     * @param messages 消息列表
     */
    setSelectedMessages(messages: IKitMessage[]): void;
    /**
     * 清理超出缓存上限的消息
     * @param conversationKey 会话ID
     * @hidden
     */
    clearExcessMessage(conversationKey: string): void;
    destroy(): void;
    /**
     * 清理内存数据
     */
    clearMemoryData(): void;
}

/**
 * 会话管理模块
 * @category class
 */
declare class RCKitConversationStore {
    #private;
    private _kitStore;
    /**
     * 当前打开的会话信息
     */
    openedConversation: IKitConversation | null;
    /**
     * 内存太缓存会话列表
     */
    conversations: IKitConversation[];
    /**
     * @hidden
     */
    constructor(_kitStore: RCKitStore, _logger: ILogger);
    /**
     * 获取更多会话（分页）
     *
     * 根据会话对象获取更多会话，若传入 null 则获取首页
     * @param conversation 类型为 IKitConversation 的会话对象
     * @param count 获取数量
     * @returns 会话列表
     */
    getConversations(conversation?: IKitConversation | null, count?: number): {
        hasMore: boolean;
        code: _rongcloud_engine.ErrorCode;
        list: IKitConversation[];
        isFirstScreen: boolean;
    } | undefined;
    /**
     * 打开会话
     *
     * 传递 null 为清空当前选中会话
     * @param conversation 会话对象
     */
    openConversation(conversation: IKitConversation | null): void;
    /**
     * 创建会话缓存数据对象，若已存在则直接返回
     * @param conversation 会话对象
     */
    createCachedConversation(conversation: IConversationOption): IKitConversation;
    /**
     * 删除会话
     * 可通过 trans2ConversationKey 生成会话 key
     * @param conversationKey 会话 key
     */
    removeConversation(conversationKey: string): void;
    /**
     * 更新会话缓存数据
     * @param conversationKey 会话 key
     * @param data 会话更新数据
     */
    updateCacheConversation(conversationKey: string, data: IConversationUpdate): void;
    /**
     * 获取所有会话的未读消息总数
     */
    getTotalUnreadCount(): number;
    /**
     * 清除会话未读消息
     * 可通过 trans2ConversationKey 生成会话 key
     * @param conversationKey 会话 key
     */
    clearUnreadCount(conversationKey: string): Promise<void>;
    /**
     * 清理内存数据
     */
    clearMemoryData(): void;
    /**
     * 销毁
     */
    destroy(): void;
}

/**
 * 群组成员缓存
 * @category class
 */
declare class GroupMembersCache {
    #private;
    private logger;
    private dataSource;
    /**
     * @hidden
     */
    constructor(logger: ILogger, dataSource: IDataSource);
    /**
     * 初始化群组成员信息
     * @param groupId 群组 ID
     * @hidden
     */
    initGroupMembers(groupId: string): Promise<void>;
    /**
     * 获取群组成员信息
     * @param groupId 群组 ID
     */
    getGroupMembers(groupId: string): IGroupMemberProfile[];
    /**
     * 获取群组成员信息
     * @param groupId 群组 ID
     * @param userId 用户 ID
     */
    getGroupMember(groupId: string, userId: string): IGroupMemberProfile | undefined;
    /**
     * 获取群组成员信息 map
     * @param groupId 群组 ID
     * @hidden
     */
    getGroupMemberMap(groupId: string): Map<string, IGroupMemberProfile>;
    /**
     * 清理内存数据
     */
    clearMemoryData(): void;
}

/**
 * 用户数据模块
 * @category class
 */
declare class AppDataModule {
    #private;
    private logger;
    groupMembersCache: GroupMembersCache;
    /**
     * @hidden
     */
    constructor(logger: ILogger, hooks?: IKitServiceHooks);
    /**
     * 获取用户信息
     * @param userId - 用户 ID
     * @returns 用户信息
     */
    getUserProfile(userId: string): IUserProfile | undefined;
    /**
     * 获取群组信息
     * @param groupId - 群组 ID
     * @returns 群组信息
     */
    getGroupProfile(groupId: string): IGroupProfile | undefined;
    /**
     * 获取系统信息
     * @param systemId - 系统 ID
     * @returns 系统信息
     */
    getSystemProfile(systemId: string): ISystemProfile | undefined;
    /**
     * 获取本地用户信息
     * @param userId - 用户 ID
     * @returns 用户信息
     */
    getUserInfo(userId: string): IUserProfile | undefined;
    /**
     * @hidden
     */
    getUsersCache(): CacheType<IUserProfile>;
    /**
     * @hidden
     */
    getGroupsCache(): CacheType<IGroupProfile>;
    /**
     * @hidden
     */
    getSystemsCache(): CacheType<ISystemProfile>;
    /**
     * 更新用户信息
     * @param userId - 用户 ID
     * @param profile - 用户信息
     */
    updateUserProfile(userId: string, profile: IUserProfile): void;
    /**
     * 更新群组信息
     * @param groupId - 群组 ID
     * @param profile - 群组信息
     */
    updateGroupProfile(groupId: string, profile: IGroupProfile): void;
    /**
     * 更新系统信息
     * @param systemId - 系统 ID
     * @param profile - 系统信息
     */
    updateSystemProfile(systemId: string, profile: ISystemProfile): void;
    /**
     * 获取会话信息
     * @param id - 会话 ID
     * @param type - 类型
     * @returns 会话信息
     */
    getProfileSync(id: string, type: ConversationType$1): Promise<IUserProfile | IGroupProfile | ISystemProfile | undefined>;
    /**
     * 清理内存数据
     */
    clearMemoryData(): void;
}

/**
 * @category class
 */
declare class RCKitStore {
    private _context;
    private readonly _logger;
    private _option;
    /**
     * 消息状态管理器
     */
    messageStore: RCKitMessageStore;
    /**
     * 会话状态管理器
     */
    conversationStore: RCKitConversationStore;
    /**
     * 用户数据模块
     */
    appData: AppDataModule;
    /**
     * 当前用户 Id
     */
    currentUserId: string;
    /**
     * 当前连接状态
     */
    connectStatus: mobx.IObservableValue<RCConnectionStatus>;
    /**
     * @hidden
     */
    constructor(_context: PluginContext, _logger: ILogger, _option: IRCStoreInitOpts);
    private _onConnected;
    private _onDisconnected;
    private _onSuspend;
    private _onConnecting;
    /**
     * 销毁
     */
    destroy(): void;
    /**
     * 清理内存数据
     */
    clearMemoryData(): void;
}

/**
 * kit store 初始化
 * @param option 初始化参数
 * @category function
 */
declare const RCKitStoreInstaller: (option: IRCStoreInitOpts) => RCKitStore | null;

/**
 * 根据会话 targetId、conversationType、channelId 生成的唯一标识
 * @category function
 */
declare const trans2ConversationKey: (conversation: IConversationOption) => string;

export { AKitUploadRequest, AppDataModule, CacheType, GroupMembersCache, IBaseProfile, IConversationUpdate, IDataSource, IGroupMemberProfile, IGroupProfile, IKitConversation, IKitImageInfo, IKitMediaMessageOptions, IKitMessage, IKitMessageCache, IKitServiceHooks, IKitThumbnailConfig, IKitUploadCompleteData, IKitUploadInfo, IKitUploadRequestData, IKitUploadResult, IRCStoreInitOpts, ISystemProfile, IUserProfile, RCKitConversationStore, RCKitMessageStore, RCKitStore, RCKitStoreInstaller, trans2ConversationKey };
