// Copyright (c) 2000-2017 Ericsson Telecom AB                                                       //
// All rights reserved. This program and the accompanying materials are made available under the     //
// terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at //
// http://www.eclipse.org/legal/epl-v10.html                                                         //
///////////////////////////////////////////////////////////////////////////////////////////////////////
function GuiEditor_Model(p_webAppModel, p_framework, p_extension) {
    "use strict";

    var v_baseModel = p_webAppModel;
    var v_setupModel = v_baseModel.getSetupModel();
    var v_framework = p_framework;
    var v_dsRestAPI;

    if (v_baseModel.getAppConfig().lastEditedApp != undefined && window["DsRestAPI"] != undefined) {
        v_dsRestAPI = new DsRestAPI(p_extension);
    } else {
        v_dsRestAPI = {"getHelp": function(callback) {callback(true, {"sources" : []});}};
    }

    ///////////////////// SETUP HANDLING /////////////////////

    this.newSetup = function() {
        v_setupModel.newSetup();
        changeLastEdited(undefined);
        var setup = v_setupModel.getSetup();
        fillDesktopSettings(setup);
        return setup;
    };

    this.deleteSetup = function(name, callback) {
        function setupDeleted(ok) {
            var config = v_baseModel.getAppConfig();
            if (ok && config.lastEditedSetup == name) {
                changeLastEdited(undefined);
            }
            callback(ok)
        }
        v_setupModel.deleteSetup(name, setupDeleted);
    };

    this.switchSetup = function(p_setupName, p_setupLoaded) {
        function setupLoaded(ok, setup, setupName) {
            fillDesktopSettings(setup);
            if (ok) {
                changeLastEdited(setupName);
            }
            p_setupLoaded(ok, setup, setupName);
        }
        v_setupModel.loadSetup(p_setupName, setupLoaded, true);
    };

    this.saveSetup = v_setupModel.saveSetup;

    this.saveSetupAs = function(setupName, callback) {
        function setupSaved(ok) {
            if (ok) {
                changeLastEdited(setupName);
            }
            callback(ok);
        }

        v_setupModel.saveSetupAs(setupName, setupSaved);
    };

    this.listSetups = v_setupModel.listSetups;

    this.setupExists = function(setupName, callback) {
        v_setupModel.setupExists(setupName, callback);
    };

    function fillDesktopSettings(setup) {
        var desktopData = setup.desktop.getData();
        if (desktopData["ViewmodelEditors"] == undefined) {
            desktopData["ViewmodelEditors"] = [];
        }
        if (desktopData["ViewEditors"] == undefined) {
            desktopData["ViewEditors"] = [];
        }
        if (desktopData["Imports"] == undefined) {
            desktopData["Imports"] = [];
        }
        if (desktopData["HtmlEditor"] == undefined) {
            desktopData["HtmlEditor"] = {};
        }
        if (desktopData["RequestEditor"] == undefined) {
            desktopData["RequestEditor"] = {};
        }
    }

    function changeLastEdited(lastEdited) {
        var config = v_baseModel.getAppConfig();
        config.lastEditedSetup = lastEdited;
        v_baseModel.saveAppConfig(config);

        if (lastEdited != undefined) {
            v_framework.setAppParam("DsRestAPI Console", "customization", config.lastEditedApp);
            v_framework.setAppParam("DsRestAPI Console", "setup", config.lastEditedSetup);

            var mainConfig = v_baseModel.getMainConfig();
            for (var i = 0; i < mainConfig.availableApps.length; ++i) {
                if (mainConfig.availableApps[i].directory == "WebApplications/CustomizableApp" && mainConfig.availableApps[i].params.customization == config.lastEditedApp) {
                    v_framework.setAppParam(mainConfig.availableApps[i].name, "setup", config.lastEditedSetup);
                }
            }
        }
    }

    this.globalSetupSearch = v_setupModel.globalSetupSearch;

    this.exportChartRequest = function(callback) {
        var exporter = new ChartRequestCreator(v_baseModel.getFileHandler(), callback);
        exporter.run();
    };

    this.getSetup = v_setupModel.getSetup;

    ///////////////////// EDITOR MODEL HANDLING /////////////////////

    this.createViewModelEditor_Model = function(className, modelCreated, customData) {
        if (customData == undefined) {
            customData = {};
        } else {
            customData = mcopy(customData);
        }
        var data = {
            "class": className,
            "customData": customData,
            "dataPathStrList": [],
            "dataPathList": [],
            "selectionToControlPathStrList": [],
            "selectionToControlPathList": []
        };
        var setup = v_setupModel.getSetup();
        setup.viewmodels.getData().push(data);
        var dekstopData = {};
        setup.desktop.getData()["ViewmodelEditors"].push(dekstopData);
        modelCreated(new GuiEditor_ViewModelEditor_Model(data), dekstopData);
    };

    this.deleteViewModelEditor_Model = function(index) {
        var setup = v_setupModel.getSetup();
        setup.viewmodels.getData().splice(index, 1);
        setup.desktop.getData()["ViewmodelEditors"].splice(index, 1);
    };

    this.createViewEditor_Model = function(className, modelCreated, customData) {
        if (customData == undefined) {
            customData = {};
        } else {
            customData = mcopy(customData);
        }
        var data = {
            "class": className,
            "customData": customData,
            "viewModelIndexes": []
        };
        var setup = v_setupModel.getSetup();
        setup.views.getData().push(data);
        var dekstopData = {};
        setup.desktop.getData()["ViewEditors"].push(dekstopData);
        modelCreated(new GuiEditor_ViewEditor_Model(data), dekstopData);
    };

    this.deleteViewEditor_Model = function(index) {
        var setup = v_setupModel.getSetup();
        v_setupModel.getSetup().views.getData().splice(index, 1);
        setup.desktop.getData()["ViewEditors"].splice(index, 1);
    };

    this.createImport_Model = function(setupName, modelCreated) {
        var data = {
            "setupName": setupName
        };
        var setup = v_setupModel.getSetup();
        setup.imports.getData().push(data);
        var dekstopData = {};
        setup.desktop.getData()["Imports"].push(dekstopData);
        modelCreated(new GuiEditor_Imports_Model(data), dekstopData);
    };

    this.deleteImport_Model = function(index) {
        var setup = v_setupModel.getSetup();
        v_setupModel.getSetup().imports.getData().splice(index, 1);
        setup.desktop.getData()["Imports"].splice(index, 1);
    };

    this.getEditorModels = function(modelsCreated) {
        var setup = v_setupModel.getSetup();
        var data = {
            "viewmodel": {
                "models": [],
                "desktopData": []
            },
            "view": {
                "models": [],
                "desktopData": []
            },
            "imports": {
                "models": [],
                "desktopData": []
            }
        }

        var viewmodelInstances = setup.viewmodels.getData();
        if (setup.desktop.getData()["ViewmodelEditors"] == undefined) {
            setup.desktop.getData()["ViewmodelEditors"] = [];
        }
        data.viewmodel.desktopData = setup.desktop.getData()["ViewmodelEditors"];
        for (var i = 0; i < viewmodelInstances.length; ++i) {
            data.viewmodel.models.push(new GuiEditor_ViewModelEditor_Model(viewmodelInstances[i]));
            if (data.viewmodel.desktopData[i] == undefined) {
                data.viewmodel.desktopData[i] = {};
            }
        }

        var viewInstances = setup.views.getData();
        if (setup.desktop.getData()["ViewEditors"] == undefined) {
            setup.desktop.getData()["ViewEditors"] = [];
        }
        data.view.desktopData = setup.desktop.getData()["ViewEditors"];
        for (var j = 0; j < viewInstances.length; ++j) {
            data.view.models.push(new GuiEditor_ViewEditor_Model(viewInstances[j]));
            if (data.view.desktopData[j] == undefined) {
                data.view.desktopData[j] = {};
            }
        }

        var imports = setup.imports.getData();
        if (setup.desktop.getData()["Imports"] == undefined) {
            setup.desktop.getData()["Imports"] = [];
        }
        data.imports.desktopData = setup.desktop.getData()["Imports"];
        for (var j = 0; j < imports.length; ++j) {
            data.imports.models.push(new GuiEditor_Imports_Model(imports[j]));
            if (data.imports.desktopData[j] == undefined) {
                data.imports.desktopData[j] = {};
            }
        }

        modelsCreated(data);
    };

    ///////////////////// RESOURCE HANDLING /////////////////////

    this.viewExists = function(viewName, callback) {
        function filesArrived(views) {
            callback(views.indexOf(viewName) != -1);
        }

        this.listCustomViews(filesArrived);
    };

    this.viewmodelExists = function(viewmodelName, callback) {
        function filesArrived(viewmodels) {
            callback(viewmodels.indexOf(viewmodelName) != -1);
        }

        this.listCustomViewmodels(filesArrived);
    };

    function listJavascriptResources(locations, callback) {
        new MultipleDirectoryListTask(locations, v_baseModel.getFileHandler()).taskOperation(function(ok, resources) {
            callback(resources.jsfiles);
        });
    }

    this.listViews = function(callback) {
        listJavascriptResources([
                "WebApplicationFramework/Views",
                "WebApplications/CustomizableApp/Views",
                v_baseModel.getAppConfig().lastEditedApp + "/Views"
            ], callback
        );
    };

    this.listCustomViews = function(callback) {
        function filesArrived(views) {
            var result = [];
            for (var i = 0; i < views.length; ++i) {
                var fileName = views[i].fileName;
                if (fileName.endsWith(".js") || fileName.endsWith(".css") || fileName.endsWith(".html")) {
                    result.push(fileName.substring(fileName.lastIndexOf("/") + 1, fileName.lastIndexOf(".")));
                }
            }
            result = uniq(result);
            result.sort();
            callback(result);
        }
        v_baseModel.getFileHandler().getDirectory(v_baseModel.getAppConfig().lastEditedApp + "/Views", filesArrived);
    };

    this.listViewmodels = function(callback) {
        listJavascriptResources([
                "WebApplicationFramework/ViewModels",
                "WebApplications/CustomizableApp/ViewModels",
                v_baseModel.getAppConfig().lastEditedApp + "/ViewModels"
            ], callback
        );
    };

    this.listCustomViewmodels = function(callback) {
        function filesArrived(viewmodels) {
            var result = [];
            for (var i = 0; i < viewmodels.length; ++i) {
                var fileName = viewmodels[i].fileName;
                if (fileName.endsWith(".js")) {
                    result.push(fileName.substring(fileName.lastIndexOf("/") + 1));
                }
            }
            result.sort();
            callback(result);
        }
        v_baseModel.getFileHandler().getDirectory(v_baseModel.getAppConfig().lastEditedApp + "/ViewModels", filesArrived);
    };

    this.getViewUrl = function(name) {
        return v_baseModel.getAppConfig().lastEditedApp + "/Views/" + name;
    };

    this.getViewmodelUrl = function(name) {
        return v_baseModel.getAppConfig().lastEditedApp + "/ViewModels/" + name;
    };

    this.deleteFile = function(file, callback) {
        v_baseModel.getFileHandler().delDirectory(file, callback);
    };

    ///////////////////// CONFIG HANDLING /////////////////////

    this.getAppConfig = v_baseModel.getAppConfig;

    this.setEditedApp = function(app, callback) {
        var config = v_baseModel.getAppConfig();
        config.lastEditedApp = app;
        v_setupModel.setSetupDirectory(app + "/Setups");
        v_baseModel.saveAppConfig();
        new JsImportFromConfigTask(app + '/AppConfig.json', v_baseModel.getFileHandler()).taskOperation(function(ok, extension) {
            if (window["DsRestAPI"] != undefined) {
                v_dsRestAPI = new DsRestAPI(extension);
            }
            callback(true);
        });
    };

    this.listEditableApps = function(callback) {
        var result = [];
        var mainConfig = v_baseModel.getMainConfig();
        for (var i = 0; i < mainConfig.availableApps.length; ++i) {
            if (mainConfig.availableApps[i].directory == "WebApplications/CustomizableApp" && mainConfig.availableApps[i].params.customization != undefined) {
                result.push(mainConfig.availableApps[i].params.customization);
            }
        }
        callback(result);
    };

    this.listEditableConfigs = function(callback) {
        var result = [{
            "config": "CustomizableContent/MainConfig.json",
            "schema": "CustomizableContent/MainConfigSchema.json"
        }];
        function filesArrived(data) {
            for (var i = 0; i < data.length; ++i) {
                if (data[i].contentType.endsWith("d")) {
                    result.push({
                        "config": data[i].fileName + "/AppConfig.json",
                        "schema": data[i].fileName + "/AppConfigSchema.json"
                    });
                }
            }
            callback(result);
        }
        v_baseModel.getFileHandler().getDirectory("CustomizableContent", filesArrived);
    };

    ///////////////////// USEFUL FUNCTIONS FOR VIEWMODELS /////////////////////

    this.getDesktopDataForRequestEditor = function() {
        return v_setupModel.getSetup().desktop.getData()["RequestEditor"];
    };

    function compareOptions(option1, option2) {
        if (option1.text < option2.text) {
            return -1;
        } else if (option1.text > option2.text) {
            return 1;
        } else {
            return 0;
        }
    }

    this.sortOptions = function(options) {
        options.sort(compareOptions);
    };

    this.getDsRestAPI = function() {
        return v_dsRestAPI;
    };

    this.getFileHandler = v_baseModel.getFileHandler;
}

function ChartRequestCreator(p_fileHandler, p_callback) {
    var v_fileHandler = p_fileHandler;
    var v_callback = p_callback;

    // setup name -> setup params or null
    var v_setupsToCheckForCharts = {};
    var v_setupsImported = {};
    var v_showOtherSetups = false;
    var v_setupList;

    var v_chartRequest = [];

    var v_setupLoader = new CSetup_Model(v_fileHandler);
    var v_chartSaver = new JsonLoader("CustomizableContent/CustomizableApp/TimelineRequest.json", v_fileHandler, v_chartRequest);

    this.run = function() {
        function setupsListed(setups) {
            v_setupList = setups;
            var tasks = [];
            for (var i = 0; i < setups.length; ++i) {
                tasks.push(new CheckSetupForSetupTabsTask(setups[i]));
            }
            var taskList = new SyncTaskList(tasks, setupsCollected);
            taskList.taskOperation();
        }

        v_setupLoader.listSetups(setupsListed);
    };

    function CheckSetupForSetupTabsTask(p_setupName) {
        var v_setupName = p_setupName;
        this.taskOperation = function(callback) {
            function setupLoaded(ok, setup, setupName) {
                if (ok) {
                    checkSetupForSetupTabs(setup.viewmodels.getData(), setup.imports.getData());
                    callback(true);
                } else {
                    callback(false, "Could not load setup: " + setupName);
                }
            }

            v_setupLoader.loadSetup(v_setupName, setupLoaded, true);
        }
    }

    function checkSetupForSetupTabs(viewmodels, imports) {
        for (var i = 0; i < viewmodels.length; ++i) {
            if (viewmodels[i].class == "CViewModel_SetupTabs" && viewmodels[i].customData.hierarchy != undefined) {
                collectSetups(viewmodels[i].customData.hierarchy.menuElements);
            }
            if (viewmodels[i].class == "CViewModel_SetupTabs" && viewmodels[i].customData.displayOtherSetups == true) {
                v_showOtherSetups = true;
            }
        }

        for (var i = 0; i < imports.length; ++i) {
            v_setupsImported[imports[i].setupName] = true;
        }
    }

    function collectSetups(menuElements) {
        if (menuElements != undefined) {
            for (var i = 0; i < menuElements.length; ++i) {
                if (menuElements[i].setupName != undefined) {
                    if (menuElements[i].setupParams != undefined) {
                        v_setupsToCheckForCharts[menuElements[i].setupName] = menuElements[i].setupParams;
                    } else {
                        v_setupsToCheckForCharts[menuElements[i].setupName] = null;
                    }
                }
                collectSetups(menuElements[i].menuElements);
            }
        }
    }

    function setupsCollected() {
        if (v_showOtherSetups) {
            for (var i = 0; i < v_setupList.length; ++i) {
                if (!v_setupsImported.hasOwnProperty(v_setupList[i]) && !v_setupsToCheckForCharts.hasOwnProperty(v_setupList[i])) {
                    v_setupsToCheckForCharts[v_setupList[i]] = null;
                }
            }
        }

        var tasks = [];
        for (var setup in v_setupsToCheckForCharts) {
            tasks.push(new FindChartsTask(setup, v_setupsToCheckForCharts[setup]));
        }
        var taskList = new SyncTaskList(tasks, chartsFound);
        taskList.taskOperation();
    }

    function FindChartsTask(p_setupName, p_setupParams) {
        var v_setupName = p_setupName;
        var v_setupParams = p_setupParams;
        this.taskOperation = function(callback) {
            function setupLoaded(ok, setup, setupName) {
                if (ok) {
                    findCharts(setup.viewmodels.getData(), setup.request.getData(), setup.request.getData(), []);
                    callback(true);
                } else {
                    callback(false, "Could not load setup: " + setupName);
                }
            }

            v_setupLoader.loadSetup(v_setupName, setupLoaded, false, true);
        }
    }

    function findCharts(viewmodels, request, requests, path) {
        if (requests != undefined) {
            for (var i = 0; i < requests.length; ++i) {
                path.push(i);
                cleanRequestUp(requests[i], viewmodels, path);
                if (requests[i].getData.timeline != undefined) {
                    addChartRequest(mcopy(request), path);
                }

                findCharts(viewmodels, request, requests[i].getData.children, path);
                path.pop();
            }
        }
    }

    function cleanRequestUp(request, viewmodels, path) {
        request.getData.filter = undefined;
        request.getData.rangeFilter = undefined;

        var selectionIsChanged = false;
        for (var i = 0; i < viewmodels.length; ++i) {
            for (var j = 0; j < viewmodels[i].selectionToControlPathList.length; ++j) {
                if (pathEquals(path, viewmodels[i].selectionToControlPathList[j])) {
                    selectionIsChanged = true;
                }
            }
        }

        if (selectionIsChanged) {
            request.getData.selection = undefined;
        }
    }

    function pathEquals(path1, path2) {
        if (path1.length == path2.length) {
            for (var i = 0; i < path1.length; ++i) {
                if (path1[i] != path2[i]) {
                    return false;
                }
            }
            return true;
        } else {
            return false;
        }
    }

    function addChartRequest(request, path) {
        var requestList = [request.splice(path[0], 1)[0]];
        var currentRequest = requestList[0];
        for (var i = 1; i < path.length; ++i) {
            requestList[i] = currentRequest.getData.children.splice(path[i], 1)[0];
            currentRequest = requestList[i];
        }
        for (var i = 0; i < requestList.length - 1; ++i) {
            requestList[i].getData.children = [];
        }

        v_chartRequest.push(createRequestFromList(requestList));
    }

    function createRequestFromList(requestList) {
        var PATTERN = /%Parent(\d+)%/g;

        var used = [];
        var toCheck = [requestList.length - 1];

        while (toCheck.length > 0) {
            var index = toCheck.shift();
            used[index] = true;

            var pattern = new RegExp(PATTERN);
            var str = JSON.stringify(requestList[index]);
            var match = pattern.exec(str);
            while (match != undefined) {
                var parentid = parseInt(match[1], 10);
                if (parentid < index) {
                    toCheck.push(parentid);
                }
                match = pattern.exec(str);
            }
        }

        var newRequest;
        var prev;
        var k = 0;
        for (var i = 0; i < used.length; ++i) {
            if (used[i] != undefined) {
                for (var j = i + 1; j < requestList.length; ++j) {
                    var string = JSON.stringify(requestList[j]);
                    string = string.replace("%Parent" + i + "::idx%", "%Parent" + k + "::idx%");
                    string = string.replace("%Parent" + i + "%", "%Parent" + k + "%");
                    requestList[j] = JSON.parse(string);
                }

                if (prev == undefined) {
                    newRequest = requestList[i];
                    prev = newRequest;
                } else {
                    prev.getData.children = [requestList[i]];
                }
                prev = requestList[i];
                ++k;
            }
        }

        return newRequest;
    }

    function chartsFound() {
        v_chartSaver.save();
        v_callback();
    }
}

//# sourceURL=GuiEditor\Models\Model.js
