export enum RoleType {
    teacher = 1, // 老师
    student = 2, // 学生
    fireman = 3, // 监课
    parent = 6, // 家长
}

export interface IDebugOption {
    debugEengineJson?: string;
    debugVFPath?: string;
    debugGuiPath?: string;
    debugPlayerPath?: string;
    showFPS?: boolean;
    debug?: boolean;
    showConsole?: boolean;
}
export interface IPlatform {
    /**
     * 教室ID
     * @example 参考值 jz79cd78bf33074f15ba740b14d84ab973
     */
    roomid?: string;
    /**
     * 用户id
     * @example 参考值 6311800
     */
    userid?: number;
    /**
     * 角色类型
     */
    role?: RoleType;
    /**
     * 使用方
     * 本地调试: debug
     * 编辑器预览：editorPreview
     * 声网：
     * 百家云：
     */
    from?: string;
}
export interface IVFOptions extends IDebugOption {
    version: string;
    container: HTMLElement;
    id?: string;
    scaleMode?: 'showAll' | 'noScale' | 'cover' | 'contain';
    wmode?: string;
    bgcolor?: string;
    src?: string | object;
    vfvars?: any;
    /**
     * 平台信息
     */
    platform: IPlatform;
    /**
     * 帧率
     */
    frameRate?: number;
    width?: number;
    height?: number;
    /**
     * 以时间或帧方式执行动画
     */
    realFPS?: boolean;
    /**
     * 动态数据
     */
    conversionData?: any;
    /**
     * 内置插件
     */
    plugs?: any[];
    /**
     * loading动画位置
     */
    // eslint-disable-next-line max-len
    loading?: { position: any; image?: any };
    /**
     * 分辨率 devicePixelRatio
     */
    resolution?: number;
    /**
     * 强制使用Canvas 渲染
     */
    forceCanvas?: boolean;
    /**
     * 需要强制降级的设备
     * 示例：degradeDevice = [{name:"iPad2",version:8.2,format:png,scale:80}]
     */
    degradeDevice?: { name: string; version?: number; format?: string; scale?: number }[];
    /**
     * 是否使用播放器
     */
    usePlayer: boolean;
}

export interface ISceneAPI {
    /**
     * 初始化完成时回调
     * @param err
     */
    onInit(): void;
    /**
     * 准备工作完成时回调 （资源加载完成）
     */
    onReady(): void;
    /**
     * 场景加载
     */
    onSceneLoad(msg: vf.IEvent): void;
    /**
     * 场景加载进度
     */
    onSceneLoadProgress(msg: vf.IEvent): void;
    /**
     * 场景加载完成时回调
     */
    onSceneCreate(msg: vf.IEvent): void;

    /**
     * 切换场景
     * @param transition
     */
    switchToNextScene(transition?: any): void;
    /**
     * 切换场景
     * @param transition
     */
    switchToPrevScene(transition?: any): void;
    /**
     * 切换场景
     * @param transition
     */
    switchToSceneId(sceneId: string, transition?: any): void;
    /**
     * 切换场景
     * @param transition
     */
    switchToSceneIndex(index: number, transition?: any): void;
    /**
     * 暂停
     */
    pause(): void;
    /**
     * 恢复
     */
    resume(): void;
    /**
     * 重置
     */
    reset(): void;
}

/**
 * 外部函数
 */
export interface APICommand {
    app?: vf.Application;

    stage?: vf.gui.Stage;
    /**
     * 播放（播放地址|播放数据|恢复播放）
     * @param src
     */
    play(src?: any): void;
    /**
     * 卸载
     * @param boolean
     */
    dispose(boolean?: boolean): void;
    /**
     * 设置消息
     * @param msg
     */
    message(msg: vf.IEvent): void;

    /**
     * 日志与错误时的回调
     * @param err
     */
    onError(evt: vf.IEvent): void;
    /**
     * 信令或其他消息回调
     */
    onMessage(msg: vf.IEvent): void;
    /**
     * 卸载时触发
     */
    onDispose(): void;
}

export type IAppOnType = 'showLoading' | 'hideLoading' | 'inputLog';
export interface IApp extends APICommand {
    app?: vf.Application;
    stage?: vf.gui.Stage;
    on(type: IAppOnType, fn: any, context: any): any;
    off(type: IAppOnType, fn: any, context: any): any;
}

export interface IPlayer extends IApp, ISceneAPI {
    //
}

declare module '@vf.js/launcher' {

    export type VFApp = IApp;

    export type VFPlayer = IPlayer;

    export type VFOptions = IVFOptions;

    export function createVF(options: VFOptions, completeCall: (player: IPlayer | VFApp) => void): void;

    export function deleteVF(): void;
}

