import type { ReadyData, ResumedData } from '../bot/session';
import type { Guild } from '../model/guild';
import type { Channel } from '../model/channel';
import type { AudioAction } from '../model/audio';
import type { MemberWithGuildID } from '../model/member';
import type { AuditResult, Post, Reply, Thread } from '../model/forum';
import type { Message, MessageAudited, MessageReaction } from '../model/message';
import { Result } from '../utils/request';
import { SendChannelMessageParams } from '../api/channels';
import { GroupMessage, SendGroupsMessageParams } from '../api/groups';
import { UserMessage, SendUserMessageParams } from '../api/users';
export type SessionReady = ReadyData & {
    t: 'READY';
};
export type SessionResumed = ResumedData & {
    t: 'RESUMED';
};
export type GuildCreate = Guild & {
    t: 'GUILD_CREATE';
    op_user_id: string;
};
export type GuildUpdate = Guild & {
    t: 'GUILD_UPDATE';
    op_user_id: string;
};
export type GuildDelete = Guild & {
    t: 'GUILD_DELETE';
    op_user_id: string;
};
export type ChannelCreate = Channel & {
    t: 'CHANNEL_CREATE';
    op_user_id: string;
};
export type ChannelUpdate = Channel & {
    t: 'CHANNEL_UPDATE';
    op_user_id: string;
};
export type ChannelDelete = Channel & {
    t: 'CHANNEL_DELETE';
    op_user_id: string;
};
export type GuildMemberAdd = MemberWithGuildID & {
    t: 'GUILD_MEMBER_ADD';
    op_user_id: string;
};
export type GuildMemberUpdate = MemberWithGuildID & {
    t: 'GUILD_MEMBER_UPDATE';
    op_user_id: string;
};
export type GuildMemberRemove = MemberWithGuildID & {
    t: 'GUILD_MEMBER_REMOVE';
    op_user_id: string;
};
export type MessageCreate = Message & {
    /** 事件类型 */
    t: 'MESSAGE_CREATE';
    /** 快捷回复 */
    reply: (params: SendChannelMessageParams) => Promise<Result<Message>>;
};
export type MessageDelete = {
    t: 'MESSAGE_DELETE';
    [key: string]: unknown;
};
export type MessageReactionAdd = {
    t: 'MESSAGE_REACTION_ADD';
    [key: string]: unknown;
};
export type MessageReactionRemove = MessageReaction & {
    t: 'MESSAGE_REACTION_REMOVE';
};
export type DirectMessageCreate = Message & {
    /** 事件类型 */
    t: 'DIRECT_MESSAGE_CREATE';
    /** 快捷回复 */
    reply: (params: SendChannelMessageParams) => Promise<Result<Message>>;
};
export type DirectMessageDelete = {
    t: 'DIRECT_MESSAGE_DELETE';
    [key: string]: unknown;
};
export interface InteractionCreate {
    /** 事件类型 */
    t: 'INTERACTION_CREATE';
    /** 平台方事件 ID，可以用于被动消息发送 */
    id: string;
    /** 按钮事件固定是 11 */
    type: 11;
    /** 消息内容 */
    /** 消息生产时间 */
    timestamp: string;
    /** 频道的 openid */
    guild_id: string;
    /** 文字子频道的 openid */
    channel_id: string;
    /** 群聊的 openid */
    group_open_id: string;
    /** 目前只有群和单聊有该字段，1 群聊，2 单聊，后续加入 3 频道 */
    chat_type: 1 | 2 | 3;
    data: {
        resolved: {
            /** 操作按钮的 data 字段值【在发送按钮时规划】 */
            button_data: string;
            /** 操作按钮的 id 字段值【在发送按钮时规划】 */
            button_id: string;
            /** 操作的用户 openid */
            user_id: string;
            /** 操作的消息 id */
            message_id: string;
        };
    };
    /** 默认 1 */
    version: number;
    /** 机器人的 appid */
    application_id: string;
}
export type MessageAuditPass = MessageAudited & {
    t: 'MESSAGE_AUDIT_PASS';
};
export type MessageAuditReject = MessageAudited & {
    t: 'MESSAGE_AUDIT_REJECT';
};
export type AudioStart = AudioAction & {
    t: 'AUDIO_START';
};
export type AudioFinish = AudioAction & {
    t: 'AUDIO_FINISH';
};
export type AudioOnMic = AudioAction & {
    t: 'AUDIO_ON_MIC';
};
export type AudioOffMic = AudioAction & {
    t: 'AUDIO_OFF_MIC';
};
export type ForumThreadCreate = Thread & {
    t: 'FORUM_THREAD_CREATE';
};
export type ForumThreadUpdate = Thread & {
    t: 'FORUM_THREAD_UPDATE';
};
export type ForumThreadDelete = Thread & {
    t: 'FORUM_THREAD_DELETE';
};
export type ForumPostCreate = Post & {
    t: 'FORUM_POST_CREATE';
};
export type ForumPostDelete = Post & {
    t: 'FORUM_POST_DELETE';
};
export type ForumReplyCreate = Reply & {
    t: 'FORUM_REPLY_CREATE';
};
export type ForumReplyDelete = Reply & {
    t: 'FORUM_REPLY_DELETE';
};
export type ForumPublishAuditResult = AuditResult & {
    t: 'FORUM_PUBLISH_AUDIT_RESULT';
};
export type AtMessageCreate = Message & {
    /** 事件类型 */
    t: 'AT_MESSAGE_CREATE';
    /** 快捷回复 */
    reply: (params: SendChannelMessageParams) => Promise<Result<Message>>;
};
export type PublicMessageDelete = {
    t: 'PUBLIC_MESSAGE_DELETE';
    [key: string]: unknown;
};
export interface GroupAddRobot {
    /** 事件类型 */
    t: 'GROUP_ADD_ROBOT';
    /** 加入的时间戳 */
    timestamp: string;
    /** 加入群的群 openid */
    group_openid: string;
    /** 操作添加机器人进群的群成员 openid */
    op_member_openid: string;
    /** 快捷回复 */
    reply: (params: SendGroupsMessageParams) => Promise<Result<GroupMessage>>;
}
export interface GroupDelRobot {
    /** 事件类型 */
    t: 'GROUP_DEL_ROBOT';
    /** 移除的时间戳 */
    timestamp: string;
    /** 移除群的群 openid */
    group_openid: string;
    /** 操作移除机器人退群的群成员 openid */
    op_member_openid: string;
    /** 快捷回复 */
    reply: (params: SendGroupsMessageParams) => Promise<Result<GroupMessage>>;
}
export interface GroupMessageReject {
    /** 事件类型 */
    t: 'GROUP_MSG_REJECT';
    /** 操作的时间戳 */
    timestamp: string;
    /** 操作群的群 openid */
    group_openid: string;
    /** 操作群成员的 openid */
    op_member_openid: string;
}
export interface GroupMessageReceive {
    /** 事件类型 */
    t: 'GROUP_MSG_RECEIVE';
    /** 操作的时间戳 */
    timestamp: string;
    /** 操作群的群 openid */
    group_openid: string;
    /** 操作群成员的 openid */
    op_member_openid: string;
}
export interface FriendAdd {
    /** 事件类型 */
    t: 'FRIEND_ADD';
    /** 添加时间戳 */
    timestamp: string;
    /** 用户 openid */
    openid: string;
}
export interface FriendDel {
    /** 事件类型 */
    t: 'FRIEND_DEL';
    /** 删除时间戳 */
    timestamp: string;
    /** 用户 openid */
    openid: string;
}
export interface C2cMsgReject {
    /** 事件类型 */
    t: 'C2C_MSG_REJECT';
    /** 操作时间戳 */
    timestamp: string;
    /** 用户 openid */
    openid: string;
}
export interface C2cMsgReceive {
    /** 事件类型 */
    t: 'C2C_MSG_RECEIVE';
    /** 操作时间戳 */
    timestamp: string;
    /** 用户 openid */
    openid: string;
}
export interface C2cMessageCreate {
    /** 事件类型 */
    t: 'C2C_MESSAGE_CREATE';
    /** 平台方消息ID，可以用于被动消息发送 */
    id: string;
    /** 发送者 */
    author: {
        /** 用户 openid */
        user_openid: string;
    };
    /** 文本消息内容 */
    content: string;
    /** 消息生产时间 */
    timestamp: string;
    /** 富媒体文件附件 */
    attachments: object[];
    /** 快捷回复 */
    reply: (params: SendUserMessageParams) => Promise<Result<UserMessage>>;
}
export interface GroupAtMessageCreate {
    /** 事件类型 */
    t: 'GROUP_AT_MESSAGE_CREATE';
    /** 平台方消息ID，可以用于被动消息发送 */
    id: string;
    /** 发送者 */
    author: {
        id: string;
        /** 用户 openid */
        member_openid: string;
    };
    /** 消息内容 */
    content: string;
    /** 消息生产时间 */
    timestamp: string;
    /** 群聊的 openid */
    group_openid: string;
    /** 富媒体文件附件 */
    attachments: object[];
    /** 快捷回复 */
    reply: (params: SendGroupsMessageParams) => Promise<Result<GroupMessage>>;
}
export interface ClientEvent {
    /** 当机器人加入新 guild 时 */
    'guild.create': (event: GuildCreate) => void;
    /** 当 guild 资料发生变更时 */
    'guild.update': (event: GuildUpdate) => void;
    /** 当机器人退出 guild 时 */
    'guild.delete': (event: GuildDelete) => void;
    /** 当 channel 被创建时 */
    'channel.create': (event: ChannelCreate) => void;
    /** 当 channel 被更新时 */
    'channel.update': (event: ChannelUpdate) => void;
    /** 当 channel 被删除时 */
    'channel.delete': (event: ChannelDelete) => void;
    /** 当成员加入时 */
    'guild.member.add': (event: GuildMemberAdd) => void;
    /** 当成员资料变更时 */
    'guild.member.update': (event: GuildMemberUpdate) => void;
    /** 当成员被移除时 */
    'guild.member.remove': (event: GuildMemberRemove) => void;
    /** **仅私域**，发送消息事件，代表频道内的全部消息，而不只是 at 机器人的消息。内容与 AT_MESSAGE_CREATE 相同 */
    'message.create': (event: MessageCreate) => void;
    /** **仅私域**，删除（撤回）消息事件 */
    'message.delete': (event: MessageDelete) => void;
    /** 为消息添加表情表态 */
    'message.reaction.add': (event: MessageReactionAdd) => void;
    /** 为消息删除表情表态 */
    'message.reaction.remove': (event: MessageReactionRemove) => void;
    /** 当收到用户发给机器人的私信消息时 */
    'direct.message.create': (event: DirectMessageCreate) => void;
    /** 删除（撤回）消息事件 */
    'direct.message.delete': (event: DirectMessageDelete) => void;
    /** 用户点击了消息体的回调按钮 */
    'interaction.create': (event: InteractionCreate) => void;
    /** 消息审核通过 */
    'message.audit.pass': (event: MessageAuditPass) => void;
    /** 消息审核不通过 */
    'message.audit.reject': (event: MessageAuditReject) => void;
    /** **仅私域**，当用户创建主题时 */
    'forum.thread.create': (event: ForumThreadCreate) => void;
    /** **仅私域**，当用户更新主题时 */
    'forum.thread.update': (event: ForumThreadUpdate) => void;
    /** **仅私域**，当用户删除主题时 */
    'forum.thread.delete': (event: ForumThreadDelete) => void;
    /** **仅私域**，当用户创建帖子时 */
    'forum.post.create': (event: ForumPostCreate) => void;
    /** **仅私域**，当用户删除帖子时 */
    'forum.post.delete': (event: ForumPostDelete) => void;
    /** **仅私域**，当用户回复评论时 */
    'forum.reply.create': (event: ForumReplyCreate) => void;
    /** **仅私域**，当用户回复评论时 */
    'forum.reply.delete': (event: ForumReplyDelete) => void;
    /** **仅私域**，当用户发表审核通过时 */
    'forum.publish.audit.result': (event: ForumPublishAuditResult) => void;
    /** 音频开始播放时 */
    'audio.start': (event: AudioStart) => void;
    /** 音频播放结束时 */
    'audio.finish': (event: AudioFinish) => void;
    /** 上麦时 */
    'audio.on.mic': (event: AudioOnMic) => void;
    /** 下麦时 */
    'audio.off.mic': (event: AudioOffMic) => void;
    /** **仅公域**，当收到 at 机器人的消息时 */
    'at.message.create': (event: AtMessageCreate) => void;
    /** **仅公域**，当频道的消息被删除时 */
    'public.message.delete': (event: PublicMessageDelete) => void;
    /** 机器人被添加到群聊 */
    'group.add.robot': (event: GroupAddRobot) => void;
    /** 机器人被移出群聊 */
    'group.del.robot': (event: GroupDelRobot) => void;
    /** 群管理员主动在机器人资料页操作关闭通知 */
    'group.msg.reject': (event: GroupMessageReject) => void;
    /** 群管理员主动在机器人资料页操作开启通知 */
    'group.msg.receive': (event: GroupMessageReceive) => void;
    /** 用户在群聊 at 机器人发送消息 */
    'group.at.message.create': (event: GroupAtMessageCreate) => void;
    /** 用户添加机器人'好友'到消息列表 */
    'friend.add': (event: FriendAdd) => void;
    /** 用户删除机器人'好友' */
    'friend.del': (event: FriendDel) => void;
    /** 用户在机器人资料卡手动关闭 "主动消息" 推送 */
    'c2c.msg.reject': (event: C2cMsgReject) => void;
    /** 用户在机器人资料卡手动开启 "主动消息" 推送开关 */
    'c2c.msg.receive': (event: C2cMsgReceive) => void;
    /** 用户在单聊发送消息给机器人 */
    'c2c.message.create': (event: C2cMessageCreate) => void;
    /** 连接会话通信 */
    'session.ready': (event: SessionReady) => void;
    /** 重连会话 */
    'session.resumed': (event: SessionResumed) => void;
}
