/// <reference types="wechat-miniprogram" />

import { AuthInfo } from '@talkwed-mito/types';
import { BaseClient } from '@talkwed-mito/core';
import { BaseOptions } from '@talkwed-mito/core';
import { BaseOptionsFieldsIntegrationType } from '@talkwed-mito/types';
import { BasePluginType } from '@talkwed-mito/types';
import { BaseTransport } from '@talkwed-mito/core';
import { Breadcrumb } from '@talkwed-mito/core';
import { DeviceInfo } from '@talkwed-mito/types';
import { EventTypes } from '@talkwed-mito/shared';
import { LogTypes } from '@talkwed-mito/types';
import { ReportDataType } from '@talkwed-mito/types';
import { TrackReportDataType } from '@talkwed-mito/types';
import { TransportDataType } from '@talkwed-mito/types';
import { WxEventTypes } from '@talkwed-mito/shared';

declare function createWxInstance(options: WxOptionsFieldsTypes, plugins?: BasePluginType[]): WxClient;

export declare const init: typeof createWxInstance;

declare type IWxPageInstance = WechatMiniprogram.Page.Instance<WechatMiniprogram.IAnyObject, WechatMiniprogram.IAnyObject>;

export declare class WxClient extends BaseClient<WxOptionsFieldsTypes, EventTypes> {
    transport: WxTransport;
    options: WxOptions;
    breadcrumb: Breadcrumb<WxOptionsFieldsTypes>;
    constructor(options?: WxOptionsFieldsTypes);
    isPluginEnable(name: WxEventTypes): boolean;
    log(data: LogTypes): void;
    trackSend(trackData: TrackReportDataType): void;
}

declare interface WxHookOptionsType {
    configReportWxRequest?(event: TransportDataType | any): Partial<WechatMiniprogram.RequestOption>;
    appOnLaunch?(options: WechatMiniprogram.App.LaunchShowOption): void;
    appOnShow?(options: WechatMiniprogram.App.LaunchShowOption): void;
    appOnHide?(): void;
    appOnPageNotFound?(data: WechatMiniprogram.OnPageNotFoundCallbackResult): void;
    pageOnLoad?(page: IWxPageInstance): void;
    pageOnShow?(page: IWxPageInstance): void;
    pageOnReady?(page: IWxPageInstance): void;
    pageOnUnload?(page: IWxPageInstance): void;
    pageOnHide?(page: IWxPageInstance): void;
    pageOnShareAppMessage?(options: WechatMiniprogram.Page.IShareAppMessageOption & IWxPageInstance): void;
    pageOnShareTimeline?(page: IWxPageInstance): void;
    pageOnTabItemTap?(options: WechatMiniprogram.Page.ITabItemTapOption & IWxPageInstance): void;
    wxNavigateToMiniProgram?(options: WechatMiniprogram.NavigateToMiniProgramOption): WechatMiniprogram.NavigateToMiniProgramOption;
    triggerWxEvent?(e: WechatMiniprogram.BaseEvent): void;
}

declare class WxOptions extends BaseOptions<WxOptionsFieldsTypes> {
    appOnLaunch: Function;
    appOnShow: Function;
    appOnHide: Function;
    pageOnLoad: Function;
    pageOnShow: Function;
    pageOnReady: Function;
    pageOnHide: Function;
    pageOnUnload: Function;
    appOnPageNotFound: Function;
    pageOnShareAppMessage: Function;
    pageOnShareTimeline: Function;
    pageOnTabItemTap: Function;
    silentRequest: boolean;
    silentConsole: boolean;
    silentDom: boolean;
    silentRoute: boolean;
    silentAppOnError: boolean;
    silentAppOnUnhandledRejection: boolean;
    silentPageOnShareAppMessage: boolean;
    silentPageOnShareTimeline: boolean;
    silentAppOnPageNotFound: boolean;
    wxNavigateToMiniProgram: Function;
    triggerWxEvent: Function;
    constructor(options: WxOptionsFieldsTypes);
    bindOptions(options: WxOptionsFieldsTypes): void;
}

declare interface WxOptionsFieldsTypes extends WxSilentOptionsType, WxHookOptionsType, BaseOptionsFieldsIntegrationType {
}

declare interface WxSilentOptionsType {
    silentRequest?: boolean;
    silentConsole?: boolean;
    silentDom?: boolean;
    silentRoute?: boolean;
    silentAppOnError?: boolean;
    silentAppOnUnhandledRejection?: boolean;
    silentAppOnPageNotFound?: boolean;
    silentPageOnShareAppMessage?: boolean;
    silentPageOnShareTimeline?: boolean;
}

declare class WxTransport extends BaseTransport<WxOptionsFieldsTypes> {
    configReportWxRequest: unknown;
    useImgUpload: boolean;
    constructor(options?: Partial<WxOptionsFieldsTypes>);
    post(data: any, url: string): void;
    sendToServer(data: any, url: string): void;
    getTransportData(data: ReportDataType): {
        authInfo: AuthInfo;
        data: ReportDataType;
        deviceInfo: DeviceInfo;
    };
    bindOptions(options?: WxOptionsFieldsTypes): void;
}

export { }
