import { SpeedyCard, AbbreviatedSpeedyCard } from "./cards";
export declare type SpeedyConfig = Partial<{
    allowedEmails: string[];
}>;
export declare type SpeedyError = {
    e: unknown;
    message: string;
    status?: string | number;
    roomId?: string;
};
export declare type Card = {
    type: string;
    body: unknown[];
    actions?: any[];
    $schema: string;
    version: string;
};
export declare type Message = string | number | Card | SpeedyCard;
export declare type SpeedyFile = {
    url: string;
    name: string;
    extension: string;
    contentType: string;
    bytes: number;
};
export declare type SpeedyFileUtils = SpeedyFile & {
    getData<T = unknown>(): Promise<T>;
};
export declare type MessageTypes = "card" | "file" | "text";
interface commonData {
    next: boolean;
    end: boolean;
    messageType: "card" | "file" | "text";
    id: string;
    author: {
        domain: string;
        email: string;
        id: string;
        org: string;
        name: string;
        type: "person" | "bot" | "appuser";
        profilePic: string;
    };
    msg: {
        parentId?: string;
        roomId: string;
        roomType: string;
        mentionedPeople: string[];
    };
    ctx: {
        [key: string]: string | number | boolean;
    };
}
export declare type EventTypes = "text" | "file" | "card";
export declare type AttachedData = {
    [key: string]: boolean | number | string | Record<string, any> | AttachedData;
};
interface CardData<T> extends commonData {
    messageType: MessageTypes;
    data?: T;
    file?: SpeedyFileUtils;
    text?: string;
}
interface TextData<T> extends commonData {
    messageType: MessageTypes;
    data?: T;
    file?: SpeedyFileUtils;
    text: string;
}
interface FileData<T> extends commonData {
    messageType: MessageTypes;
    data?: T;
    file: SpeedyFileUtils;
    text?: string;
}
export declare type IncomingItem<T> = TextData<T> | FileData<T> | CardData<T>;
export declare type Destination = {
    roomId: string;
} | {
    toPersonEmail: string;
} | {
    toPersonId: string;
};
export declare type NestedData = string | number | boolean | AttachedData;
export declare type $Magic<T = AttachedData> = {
    buildDataSnippet(data: any, type?: string): string;
    debug(): DebugInfo;
    send(m: Message): Promise<MessageResponse>;
    reply(message: string): Promise<MessageResponse>;
    clearScreen(c?: number): Promise<MessageResponse>;
    fillTemplate(utterances: string[], template: {
        [key: string]: string | number;
    }): string;
    buildDMLink(target: string, label: string): string;
    card(config?: Partial<AbbreviatedSpeedyCard>): SpeedyCard;
    edit(m: MessageResponse, e: string): Promise<MessageResponse>;
    pickRandom<P>(list: P[]): P;
    pickRandom<P>(min: number, max: number): number;
    pickRandom<P>(listOrMin: P[] | number, max?: number): P | number;
    sendFile: <T = unknown>(data: T, fileExtension: string) => Promise<MessageResponse>;
    getFile(url: string, opts?: {
        responseType?: "arraybuffer" | "json";
    }): Promise<{
        getData<T = unknown>(): Promise<T>;
        url: string;
        name: string;
        extension: string;
        contentType: string;
        bytes: number;
    }>;
    thread(threadData: [string | SpeedyCard, ...string[]] & {
        length: 1 | 2 | 3 | 4 | 5 | 6;
    }): any;
    buildLink(destinationURL: string, label?: string, noBold?: boolean): string;
} & IncomingItem<T>;
export declare type Middleware<T = AttachedData> = ($: $Magic<T>) => boolean | Promise<boolean>;
export declare type MessageResponse = {
    id: string;
    roomId: string;
    roomType: string;
    text: string;
    markdown?: string;
    html?: string;
    personId: string;
    personEmail: string;
    created: string;
    updated?: string;
    files?: string[];
};
export declare type DebugInfo = {
    messageType: string;
    messageId: string;
    text: string;
    hasFile: boolean;
    data?: unknown;
    author: {
        id: string;
        name: string;
        email: string;
    };
    msg: {
        parentId?: string;
        roomId: string;
        roomType: string;
        mentionedPeople: string[];
    };
};
export declare type ToMessage = {
    roomId?: string;
    parentId?: string;
    toPersonId?: string;
    toPersonEmail?: string;
    text?: string;
    markdown?: string;
    files?: string[];
    attachments?: {
        contentType?: string;
        content?: unknown;
    }[];
};
export interface Webhook {
    id: string;
    name: string;
    targetUrl: string;
    resource: string;
    event: string;
    orgId: string;
    createdBy: string;
    appId: string;
    ownedBy: string;
    status: string;
    created: string;
    secret?: string;
}
export declare type Submit_Details<T = object> = {
    id: string;
    type: string;
    messageId: string;
    inputs: T;
    personId: string;
    personEmail: string;
    roomId: string;
    created: Date | string;
};
export declare type SelfData = {
    id: string;
    emails: string[];
    phoneNumbers: any[];
    displayName: string;
    nickName: string;
    userName: string;
    avatar: string;
    orgId: string;
    created: Date;
    status: string;
    type: "person" | "bot" | "appuser";
    firstName: string;
    lastName: string;
    lastModified: Date;
    lastActivity: string;
};
export declare type DeepPartial<T> = {
    [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];
};
export declare type ENVELOPES = MessageEnvelope | AA_Envelope;
export declare type AA_Envelope = {
    id: string;
    name: string;
    targetUrl: string;
    resource: "attachmentActions";
    event: string;
    orgId: string;
    createdBy: string;
    appId: string;
    ownedBy: string;
    status: string;
    created: Date | string;
    actorId: string;
    data: {
        id: string;
        type: string;
        messageId: string;
        personId: string;
        roomId: string;
        created: Date | string;
    };
};
export declare type MessageEnvelope = {
    id: string;
    name: string;
    targetUrl: string;
    resource: "messages";
    event: string;
    orgId: string;
    createdBy: string;
    appId: string;
    ownedBy: string;
    status: string;
    created: Date | string;
    actorId: string;
    data: Message_Details;
};
export declare type File_Details = Message_Details & {
    files: string[];
} & {
    text?: string;
};
export declare type Message_Details = {
    id: string;
    roomId: string;
    roomType: string;
    text: string;
    personId: string;
    personEmail: string;
    html?: string;
    mentionedPeople?: string[];
    created: Date | string;
    files?: string[];
    parentId?: string;
};
export declare type RequestOps = {
    "content-type"?: string;
    method?: "POST" | "PUT" | "GET" | "DELETE" | "HEAD" | "PATCH";
    headers?: any;
    raw?: boolean;
    [key: string]: any;
};
export declare type CoreMakerequest<T = unknown> = (url: string, body: any, opts: RequestOps) => Promise<T> | T;
export declare type StubbedRes<T = unknown> = {
    headers: {
        get(q: string): string;
    };
    arrayBuffer<T = any>(): Promise<T>;
    text(): Promise<string>;
    json(): Promise<T>;
};
export declare type Room_Details = {
    id: string;
    title: string;
    type: string;
    isLocked: boolean;
    lastActivity: string;
    creatorId: string;
    created: string;
    ownerId: string;
    isPublic: boolean;
    isReadOnly: boolean;
};
export declare type Chunk<T> = (messageChunk: T[]) => void;
export declare type RoomConfig = {
    type: "group" | "direct";
    sortBy: "id" | "lastactivity" | "created";
};
export {};
