import {RawMessage} from "../ntqqapi/types";
import {EventType} from "./event/OB11BaseEvent";

export interface OB11User {
    user_id: number;
    nickname: string;
    remark?: string;
    sex?: OB11UserSex;
    qq_level?: number;
}

export enum OB11UserSex {
    male = "male",
    female = "female",
    unknown = "unknown"
}

export enum OB11GroupMemberRole {
    owner = "owner",
    admin = "admin",
    member = "member",
}

export interface OB11GroupMember {
    group_id: number
    user_id: number
    nickname: string
    card?: string
    sex?: OB11UserSex
    age?: number
    join_time?: number
    last_sent_time?: number
    level?: number
    qq_level?: number
    role?: OB11GroupMemberRole
    title?: string
    area?: string
    unfriendly?: boolean
    title_expire_time?: number
    card_changeable?: boolean
    // 以下为gocq字段
    shut_up_timestamp?: number
    // 以下为扩展字段
    is_robot?: boolean
}

export interface OB11Group {
    group_id: number
    group_name: string
    member_count?: number
    max_member_count?: number
}

interface OB11Sender {
    user_id: number,
    nickname: string,
    sex?: OB11UserSex,
    age?: number,
    card?: string,  // 群名片
    level?: string,  // 群等级
    role?: OB11GroupMemberRole
}

export enum OB11MessageType {
    private = "private",
    group = "group"
}

export interface OB11Message {
    target_id?: number;  // 自己发送的消息才有此字段
    self_id?: number,
    time: number,
    message_id: number,
    real_id: number,
    user_id: number,
    group_id?: number,
    message_type: "private" | "group",
    sub_type?: "friend" | "group" | "normal",
    sender: OB11Sender,
    message: OB11MessageData[] | string,
    message_format: 'array' | 'string',
    raw_message: string,
    font: number,
    post_type?: EventType,
    raw?: RawMessage
}

export interface OB11Return<DataType> {
    status: string
    retcode: number
    data: DataType
    message: string,
    echo?: any, // ws调用api才有此字段
    wording?: string,  // go-cqhttp字段,错误信息
}

export enum OB11MessageDataType {
    text = "text",
    image = "image",
    music = "music",
    video = "video",
    voice = "record",
    file = "file",
    at = "at",
    reply = "reply",
    json = "json",
    face = "face",
    node = "node",  // 合并转发消息
}

export interface OB11MessageText {
    type: OB11MessageDataType.text,
    data: {
        text: string, // 纯文本
    }
}

interface OB11MessageFileBase {
    data: {
        name?: string;
        file: string,
        url?: string;
    }
}

export interface OB11MessageImage extends OB11MessageFileBase {
    type: OB11MessageDataType.image
    data: OB11MessageFileBase['data'] & {
        summary ? : string; // 图片摘要
    }
}

export interface OB11MessageRecord extends OB11MessageFileBase {
    type: OB11MessageDataType.voice
}

export interface OB11MessageFile extends OB11MessageFileBase {
    type: OB11MessageDataType.file
}

export interface OB11MessageVideo extends OB11MessageFileBase {
    type: OB11MessageDataType.video
}

export interface OB11MessageAt {
    type: OB11MessageDataType.at
    data: {
        qq: string | "all"
    }
}

export interface OB11MessageReply {
    type: OB11MessageDataType.reply
    data: {
        id: string
    }
}

export interface OB11MessageFace {
    type: OB11MessageDataType.face
    data: {
        id: string
    }
}

export type OB11MessageMixType = OB11MessageData[] | string | OB11MessageData;

export interface OB11MessageNode {
    type: OB11MessageDataType.node
    data: {
        id?: string
        user_id?: number
        nickname: string
        content: OB11MessageMixType
    }
}

export interface OB11MessageCustomMusic{
    type: OB11MessageDataType.music
    data: {
        type: "custom"
        url: string,
        audio: string,
        title: string,
        content?: string,
        image?: string
    }
}

export type OB11MessageData =
    OB11MessageText |
    OB11MessageFace |
    OB11MessageAt | OB11MessageReply |
    OB11MessageImage | OB11MessageRecord | OB11MessageFile | OB11MessageVideo |
    OB11MessageNode | OB11MessageCustomMusic

export interface OB11PostSendMsg {
    message_type?: "private" | "group"
    user_id: string,
    group_id?: string,
    message: OB11MessageMixType;
    messages?: OB11MessageMixType;  // 兼容 go-cqhttp
}

export interface OB11Version {
    app_name: "LLOneBot"
    app_version: string
    protocol_version: "v11"
}


export interface OB11Status {
    online: boolean | null,
    good: boolean
}