import Olympus, { core } from 'olympus-r/Olympus';
import EgretBridge from 'olympus-r-egret/EgretBridge';
import DOMBridge from 'olympus-r-dom/DOMBridge';
import { EgretMediatorClass } from 'olympus-r-egret/egret/injector/Injector';
import { commonData } from 'olympus-r/engine/net/RequestData';
import { query } from 'olympus-r/engine/env/Query';
import NetMessage from 'olympus-r/engine/net/NetMessage';
import { environment } from 'olympus-r/engine/env/Environment';
import { wrapHost } from 'olympus-r/utils/URLUtil';
import SceneMessage from 'olympus-r/engine/scene/SceneMessage';
import Mediator from 'olympus-r/engine/mediator/Mediator';
import ResponseData from 'olympus-r/engine/net/ResponseData';
import { assetsManager, JSLoadMode } from 'olympus-r/engine/assets/AssetsManager';
import { environment17, EnvCode } from 'olympus-r-17plugins/env/Environment17';
import { initParams17 } from 'olympus-r-17plugins/env/InitParams17';
import Olympus17Plugin from 'olympus-r-17plugins/Olympus17Plugin';
import NetworkErrorCommand from './command/NetworkErrorCommand';
import GetServerResponseCommand from './command/GetServerResponseCommand';
import Homepage from './module/Homepage/Homepage';
import { EgretPrompt, DOMPrompt } from './component/Prompt';

initParams17.whenReady(() => {
    if (window["FastClick"]) {
        window["FastClick"].attach(document.body);
    }
    Olympus.startup({
        bridges: [
            new DOMBridge({
                container: "#rootDOM",
                promptClass: DOMPrompt,
                maskData: {
                    loadingAlpha: 0,
                },
            }),
            new EgretBridge({
                width: 720,
                height: 1280,
                pathPrefix: "egret/",
                container: "#rootEgret",
                backgroundColor: 0xffffff,
                scaleMode: egret.StageScaleMode.FIXED_NARROW,
                renderMode: 1,
                maskData: {
                    loadingAlpha: 0
                },
                promptClass: EgretPrompt,
            }),
        ],
        firstModule: Homepage,
        loadElement: "#loading",
        env: initParams17.getParam("server_type"),
        hostsDict: {
            dev: ["http://www.test.17zuoye.net"],
            test: ["https://www.test.17zuoye.net"],
            staging: ["https://www.staging.17zuoye.net"],
            prod: ["https://www.17zuoye.com"],
        },
        cdnsDict: {
            test: initParams17.getParam("cdn_list") || [initParams17.getParam("img_domain") || "https://cdn-cnc.test.17zuoye.net/"],
            staging: initParams17.getParam("cdn_list") || [initParams17.getParam("img_domain") || "https://cdn-cnc.staging.17zuoye.net/"],
            prod: initParams17.getParam("cdn_list") || [initParams17.getParam("img_domain") || "https://cdn-cnc.17zuoye.cn/"],
        },
        plugins: [
            // 设置 appName
            new Olympus17Plugin("$a-{appName}"),
        ],
        preloads: [
            "./assets/Prompt.html",
        ],
        onInited: () => {
            // 仅在test和staging环境使用Eruda
            if(environment17.envCode === EnvCode.test || environment17.envCode === EnvCode.staging)
            {
                assetsManager.loadJsFiles([{
                    url: "http://cdn.jsdelivr.net/npm/eruda",
                    mode: JSLoadMode.TAG
                }], (err?:Error)=>{
                    const eruda:any = window["eruda"];
                    eruda && eruda.init();
                });
            }
            // 给消息协议添加 session_key
            const session_key: string = initParams17.getParam("session_key");
            if (session_key) {
                commonData.session_key = session_key;
            }
            // 篡改Mediator的onGetResponses基类方法，统一判断初始化返回值是否成功
            Mediator.prototype.onGetResponses = function(responses:ResponseData[]):boolean {
                let success:boolean = true;
                responses.forEach(response=>success = success && response["success"]);
                return !success;
            };
            // 注册网络错误命令
            core.mapCommand(NetMessage.NET_ERROR, NetworkErrorCommand);
            // 注册服务器返回命令
            core.mapCommand(NetMessage.NET_RESPONSE, GetServerResponseCommand);
        },
    });
});
