"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
Object.defineProperty(exports, "__esModule", { value: true });
window._conchInfo = { version: '2.1.3.1' };
var _inline = !conchConfig.localizable;
console.log('======================================================  ');
console.log('             LAYA CONCH            ');
console.log('     runtimeversion:' + conchConfig.getRuntimeVersion());
console.log('          jsversion:' + window._conchInfo.version);
console.log('             isplug:' + conchConfig.getIsPlug());
console.log('======================================================');
function log(m) {
    console.log(m);
}
if (conchConfig.getOS() == "Conch-ios") {
    require('promise');
}
function loadLib(url) {
    var script = document.createElement("script");
    if (url.indexOf("laya.physics3D.js") >= 0) {
        url = url.replace("laya.physics3D.js", "laya.physics3D.runtime.js");
    }
    script.src = url;
    script.onerror = function () {
        if (window["onLayaInitError"]) {
            window["onLayaInitError"]("Load script error");
        }
    };
    document.head.appendChild(script);
}
window['loadLib'] = loadLib;
const asyncs = require("async");
function initFreeType() {
    return __awaiter(this, void 0, void 0, function* () {
        var sOS = conchConfig.getOS();
        var bRet = false;
        var sTempFontPath = conch.getCachePath() + "/runtimeFont/";
        if (!fs_exists(sTempFontPath)) {
            fs_mkdir(sTempFontPath);
        }
        sTempFontPath += "layabox.ttf";
        bRet = _conchTextCanvas.initFreeTypeDefaultFontFromFile(sTempFontPath);
        if (bRet == false) {
            var assetFontData = conch.readFileFromAsset('font/layabox.ttf', 'raw');
            if (assetFontData) {
                fs_writeFileSync(sTempFontPath, assetFontData);
                bRet = _conchTextCanvas.initFreeTypeDefaultFontFromFile(sTempFontPath);
            }
        }
        if (!bRet) {
            if (sOS == "Conch-window") {
                bRet = _conchTextCanvas.initFreeTypeDefaultFontFromFile("C:/Windows/Fonts/simhei.ttf");
            }
            else if (sOS == "Conch-android") {
                var fSystemVersion = navigator.sv;
                if (fSystemVersion >= 2.0 && fSystemVersion < 5.0) {
                    bRet = _conchTextCanvas.initFreeTypeDefaultFontFromFile("/system/fonts/DFHEIA5A.ttf");
                    if (bRet == false) {
                        bRet = _conchTextCanvas.initFreeTypeDefaultFontFromFile("/system/fonts/DroidSansFallback.ttf");
                    }
                }
                else if (fSystemVersion >= 5.0 && fSystemVersion < 6.0) {
                    var vDefaultStrings = [];
                    vDefaultStrings.push("/system/fonts/NotoSansHans-Regular.otf");
                    vDefaultStrings.push("/system/fonts/Roboto-Regular.ttf");
                    bRet = _conchTextCanvas.initFreeTypeDefaultFontFromFile(vDefaultStrings.join('|'));
                }
                else if (fSystemVersion >= 6.0 && fSystemVersion < 7.0) {
                    var vDefaultStrings = [];
                    vDefaultStrings.push("/system/fonts/NotoSansSC-Regular.otf");
                    vDefaultStrings.push("/system/fonts/Roboto-Regular.ttf");
                    bRet = _conchTextCanvas.initFreeTypeDefaultFontFromFile(vDefaultStrings.join('|'));
                }
                else if (fSystemVersion >= 7.0 && fSystemVersion < 8.0) {
                    bRet = false;
                }
            }
            else if (sOS == "Conch-ios") {
                bRet = _conchTextCanvas.initFreeTypeDefaultFontFromFile("");
            }
        }
        if (bRet == false) {
            log('字体初始化失败，从网络下载字体...');
            var data = (yield asyncs.downloadSync(location.fullpath + '/font/simhei.ttf', true, null));
            if (!data) {
                data = (yield asyncs.downloadSync('http://runtime.layabox.com/font/simhei.ttf', true, null));
            }
            if (!data) {
                alert('下载字体失败。 ');
                return;
            }
            fs_writeFileSync(sTempFontPath, data);
            bRet = _conchTextCanvas.initFreeTypeDefaultFontFromFile(sTempFontPath);
        }
        if (!bRet) {
            log('字体初始化失败。');
        }
    });
}
function setOrientation(s) {
    var nameToVal = {
        landscape: 0, portrait: 1, user: 2, behind: 3, sensor: 4, nosensor: 5, sensor_landscape: 6, sensorLandscape: 6,
        sensor_portrait: 7, sensorPortrait: 7, reverse_landscape: 8, reverseLandscape: 8, reverse_portrait: 9, reversePortrait: 9, full_sensor: 10, fullSensor: 10,
    };
    var nOri = (function (name) {
        try {
            var n = nameToVal[name];
            return n || 0;
        }
        catch (e) {
            return 0;
        }
    })(s);
    conchConfig.setScreenOrientation(nOri);
    ;
}
Object.defineProperty(window, 'screenOrientation', {
    get: function () {
        return window.___screenOri;
    },
    set: function (v) {
        window.___screenOri = v;
        setOrientation(v);
    }
});
function startApp(data) {
    var jsonobj = null;
    try {
        jsonobj = JSON.parse(data);
    }
    catch (e) {
        console.log("Error:start page parse error! \n " + data);
        return;
    }
    jsonobj.scripts.forEach((v) => {
        var t = document.createElement("script");
        t["src"] = v;
        t.onerror = function () {
            if (window["onLayaInitError"]) {
                window["onLayaInitError"]("Load script error");
            }
        };
        document.head.appendChild(t);
    });
    if (jsonobj.screenOrientation)
        setOrientation(jsonobj.screenOrientation);
    else if (jsonobj.screenorientation)
        setOrientation(jsonobj.screenorientation);
    else
        setOrientation("sensor_landscape");
    document.createElement("script").text = "window.onload&&window.onload()";
}
function loadApp(url) {
    return __awaiter(this, void 0, void 0, function* () {
        var urllen = url.length;
        if (urllen < 2)
            return;
        url = url.trim();
        if (url.substring(urllen - 1) === '/')
            url = url + 'runtime.json';
        url = url.replace(/.html$/i, '.json');
        if (url.indexOf('http://stand.alone.version') == 0)
            _inline = false;
        if (!_inline) {
            url = 'http://stand.alone.version/index.js';
        }
        console.log("loadApp:" + url);
        if (history.length <= 0) {
            history._push(url);
        }
        if (url.length < 2)
            return;
        location.setHref(url);
        var urlpath = location.fullpath + '/';
        var cache = window.appcache = new AppCache(urlpath);
        document.loadCookie();
        yield initFreeType();
        try {
            require("config");
        }
        catch (e) {
        }
        var isDccOk = true;
        function updateDcc() {
            return __awaiter(this, void 0, void 0, function* () {
                cache.setResourceID('appurl', urlpath);
                var curassets = cache.getResourceID('netassetsid');
                var assetsidStr = (yield asyncs.downloadSync(urlpath + 'update/assetsid.txt?rand=' + Math.random() * Date.now(), false, null));
                console.log("assetsid old:" + curassets + "  new:" + assetsidStr);
                if (!assetsidStr) {
                    if (curassets && curassets != "") {
                        if (window["onLayaInitError"]) {
                            isDccOk = false;
                            window["onLayaInitError"]("Update DCC get assetsid error");
                        }
                    }
                }
                else {
                    if (curassets != assetsidStr) {
                        log('need update;');
                        var txtdcc = '';
                        var bindcc = yield asyncs.downloadSync(urlpath + 'update/filetable.bin?' + assetsidStr, true, null);
                        if (!bindcc || !(bindcc instanceof ArrayBuffer)) {
                            txtdcc = (yield asyncs.downloadSync(urlpath + 'update/filetable.txt?' + assetsidStr, false, null));
                        }
                        else {
                            if (bindcc.byteLength % 8 != 0) {
                                log('下载的的filetable.bin的长度不对。是不是错了。');
                            }
                            else {
                                var v = new Uint32Array(bindcc);
                                if (v[0] != 0xffeeddcc || v[1] != 1) {
                                    log('dcc.bin file err!');
                                }
                                else {
                                    if (v[2] == 0x00ffffff) {
                                        var stp = (4 + 8) / 2;
                                        var md5int = v.slice(4, 12);
                                        var md5char = new Uint8Array(md5int.buffer);
                                        var so = String.fromCharCode.apply(null, md5char);
                                        console.log('--------------------------------------------');
                                        console.log('so=' + so);
                                        console.log('netid=' + assetsidStr);
                                        if (so == assetsidStr) {
                                            for (var ii = stp, isz = v.length / 2; ii < isz; ii++)
                                                txtdcc += v[ii * 2].toString(16) + ' ' + v[ii * 2 + 1].toString(16) + '\n';
                                        }
                                    }
                                    else {
                                        console.log('----------------old format');
                                        for (var ii = 1, isz = v.length / 2; ii < isz; ii++)
                                            txtdcc += v[ii * 2].toString(16) + ' ' + v[ii * 2 + 1].toString(16) + '\n';
                                    }
                                }
                            }
                        }
                        if (txtdcc && txtdcc.length > 0) {
                            cache.saveFileTable(txtdcc);
                            window.appcache = cache = new AppCache(urlpath);
                            cache.setResourceID('netassetsid', assetsidStr);
                        }
                        else {
                            if (window["onLayaInitError"]) {
                                isDccOk = false;
                                window["onLayaInitError"]("Update DCC get filetable error");
                            }
                        }
                    }
                }
            });
        }
        if (_inline) {
            yield updateDcc();
            if (!isDccOk) {
                console.log("init dcc fail");
                return;
            }
        }
        var data = yield asyncs.loadText(url);
        for (var n = 0; n < 3 && !data; n++) {
            data = yield asyncs.loadText(url);
        }
        if (!data) {
            if (window["loadingView"]) {
                window["loadingView"].setFontColor("#FF0000");
                window["loadingView"].setTips(['网络异常，请检查您的网络或与开发商联系。']);
            }
            data = cache.loadCachedURL(url);
            if (!data || data.length <= 0)
                if (window["onLayaInitError"]) {
                    window["onLayaInitError"]("Load start url error");
                }
            return;
        }
        console.log("");
        var qpos = url.indexOf('?');
        if (qpos < 0)
            qpos = url.length;
        if (url.substr(qpos - 3, 3) === '.js') {
            window.eval(data + `
        //@ sourceURL=${url}
        `);
            document.createElement("script").text = "window.onload&&window.onload()";
        }
        else {
            startApp(data);
        }
        if (window["loadingView"] && window["loadingView"].loadingAutoClose) {
            window["loadingView"].hideLoadingView();
        }
    });
}
window.document.addEventListener('keydown', function (e) {
    switch (e.keyCode) {
        case 116:
            reloadJS(true);
            break;
        case 117:
            history.back();
            break;
        case 118:
            break;
        case 119:
            break;
        case 120:
            gc();
            break;
    }
});
window.loadConchUrl = loadApp;
window['updateByZip'] = function (url, onEvent, onEnd) {
    let cachePath = conch.getCachePath();
    let localfile = cachePath + url.substr(url.lastIndexOf('/'));
    downloadBigFile(url, localfile, (total, now, speed) => {
        onEvent('downloading', Math.floor((now / total) * 100), null);
        return false;
    }, (curlret, httpret) => {
        if (curlret != 0 || httpret < 200 || httpret >= 300) {
            onEvent('downloadError');
        }
        else {
            onEvent('downloadOK');
            let zip = new ZipFile();
            if (zip.setSrc(localfile)) {
                zip.forEach((id, name, dir, sz) => {
                    if (!dir) {
                        let buf = zip.readFile(id);
                        let fid = window.appcache.hashstr('/' + name);
                        if (window.appcache.updateFile(fid, 0, buf, false)) {
                            onEvent('updating', null, name);
                        }
                        else {
                            onEvent("updateError", null, name);
                        }
                    }
                });
                zip.close();
                if (onEnd)
                    onEnd(localfile);
            }
            else {
                console.log("set zip src error!");
                onEvent('unknownError');
            }
        }
    }, 10, 100000000);
};
loadApp(conch.presetUrl || "http://nativetest.layabox.com/layaplayer2.0.1/index.js");
