// 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 v2.0 which accompanies this distribution, and is available at //
// https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html                                                         //
///////////////////////////////////////////////////////////////////////////////////////////////////////
function CViewModel_Clients(p_viewmodel, p_options) {
    "use strict";

    /** constructor */
    
    var v_options = p_options;
    var base = new CViewModel_TableForLargeData(p_viewmodel, p_options);
    
    var v_flexAligner = new CViewModel_FlexAligner();
    
    var v_tableData = {
        "table": []
    };
    var v_header = [];
    var v_viewmodels = [];
    var v_firstSeparatorExists;
    
    /** public functions - interface for parent */ 

    this.setSelectionToControl = base.setSelectionToControl;
    this.setReponseDataPath = base.setReponseDataPath;
    this.setBinder = base.setBinder;
	
	/** public functions - interface for views */ 

    this.getViewmodelBundle = function() {
        var newTableData = base.getTable();
        var newHeader = base.getHeader();
        
        // in the check we use both v_tableData and newTableData
        var fullRefresh = checkIfFullRefreshNeeded(newTableData);
        v_tableData = newTableData;
        v_header = newHeader;
        updateViewmodels();
        
        return {
            "viewmodels": v_viewmodels,
            "fullRefresh": fullRefresh,
            "firstSeparatorExists": v_firstSeparatorExists
        };
    };
    
    this.getRange = base.getRange;
    this.getPosition = base.getPosition;
    this.setPosition = base.setPosition;
    this.getViewportSize = base.getViewportSize;
    this.isStreaming = base.isStreaming;

    /** private functions */
    
    function checkIfFullRefreshNeeded(newTableData) {
        if ((newTableData.separators == undefined && v_tableData.separators == undefined) || 
            (newTableData.separators != undefined && v_tableData.separators != undefined && newTableData.separators.length == v_tableData.separators.length)) {
            
            if (newTableData.separators != undefined && v_tableData.separators != undefined) {
                var columnIndexThatContainsTheSize = v_options.numberOfElementsInFirstAligner + v_options.numberOfElementsInSecondAligner;
                var limitForFirstSeparatorExistance;
                if (newTableData.separators.length > 1) {
                    limitForFirstSeparatorExistance = newTableData.separators[1].index;
                } else {
                    limitForFirstSeparatorExistance = newTableData.table.length;
                }
                var firstSeparatorExists = true;
                if (base.getPosition() != 0) {
                    for (var i = 0; i < limitForFirstSeparatorExistance; ++i) {
                        if (parseInt(newTableData.table[i][columnIndexThatContainsTheSize].val) != limitForFirstSeparatorExistance) {
                            firstSeparatorExists = false;
                            break;
                        }
                    }
                }
                if (firstSeparatorExists != v_firstSeparatorExists) {
                    v_firstSeparatorExists = firstSeparatorExists;
                    return true;
                } else {
                    return false;
                }
            } else {
                return false;
            }
        } else {
            return true;
        }
    }
    
    function updateViewmodels() {
        // create or delete viewmodels so we have the correct number of them
        var numberOfAdditionalViewmodels = v_tableData.separators.length - v_viewmodels.length;
        if (numberOfAdditionalViewmodels > 0) {
            for (var i = 0; i < numberOfAdditionalViewmodels; ++i) {
                v_viewmodels.push({
                    "aligner1": new AlignerViewmodel(),
                    "aligner2": new AlignerViewmodel(),
                    "table": new TableViewmodel()
                });
            }
        } else if (numberOfAdditionalViewmodels < 0) {
            for (var i = 0; i > numberOfAdditionalViewmodels; --i) {
                v_viewmodels.pop();
            }
        }
        
        // update the viewmodels, we now know that v_viewmodels.length == v_tableData.separators.length
        v_tableData.separators.push({"index": v_tableData.table.length}); // a small trick so we avoid conditions below
        for (var i = 0; i < v_viewmodels.length; ++i) {
            v_viewmodels[i].aligner1.setData(v_tableData.separators[i].index, 0, v_options.numberOfElementsInFirstAligner);
            v_viewmodels[i].aligner2.setData(v_tableData.separators[i].index, v_options.numberOfElementsInFirstAligner, v_options.numberOfElementsInSecondAligner);
            v_viewmodels[i].table.setData(v_tableData.separators[i].index, v_options.numberOfElementsInFirstAligner + v_options.numberOfElementsInSecondAligner + 1, v_tableData.separators[i + 1].index - v_tableData.separators[i].index);
        }
        v_tableData.separators.pop();
    }
    
    /** private Classes */
    
    // The mocked viewmodel for ElementRelay used in the element aligners
    function AlignerViewmodel() {
        var v_row;
        var v_col;
        var v_columnCount;
        
        this.setData = function(p_row, p_col, p_columnCount) {
            v_row = p_row;
            v_col = p_col;
            v_columnCount = p_columnCount;
        };
        
        this.select = function() {};
        
        this.getListWithElementInfo = function() {
            var list = [];
            for (var i = 0; i < v_columnCount; ++i) {
                list.push({
                    "element": v_header[v_col + i].heading,
                    "val": v_tableData.table[v_row][v_col + i].val,
                    "isWritable": v_tableData.table[v_row][v_col + i].isWritable,
                });
            }
            return {
                "values": list,
                "selections": []
            }
        };
        
        this.getList = function() {
            var list = [];
            for (var i = 0; i < v_columnCount; ++i) {
                list.push([
                    [v_tableData.table[v_row][v_col + i].val, undefined, v_tableData.table[v_row][v_col + i].isWritable]
                ]);
            }
            return list;
        };
        
        this.setValue = function(dataPathIndex, value) {
            base.setValue(v_row, v_col + dataPathIndex, value);
        };
        
        this.getChildPercentagesFromFlex = v_flexAligner.getChildPercentagesFromFlex;
    }
    
    // The mocked viewmodel for DynamicTable used in the tables
    function TableViewmodel() {
        var v_row;
        var v_col;
        var v_rowCount;
        
        this.setData = function(p_row, p_col, p_rowCount) {
            v_row = p_row;
            v_col = p_col;
            v_rowCount = p_rowCount;
        };
        
        this.select = function() {};
        
        this.getHeader = function() {
            var header = mcopy(v_header.slice(v_col));
            for (var i = 0; i < header.length; ++i) {
                header[i].elementIndex = i;
            }
            return header;
        };
        
        this.getName = function() {
            return v_header[v_col].heading;
        };
        
        this.getTable = function() {
            var tableData = [];
            for (var i = 0; i < v_rowCount; ++i) {
                tableData.push(v_tableData.table[v_row + i].slice(v_col));
            }
            return {"table": tableData};
        };
        
        this.setValue = function(row, col, value) {
            base.setValue(v_row + row, v_col + col, value);
        };
        
        this.getChildPercentagesFromFlex = v_flexAligner.getChildPercentagesFromFlex;
    }
}

CViewModel_Clients.getHelp = function() {
    return "Viewmodel for the clients tab. Will return a list whose elements contain 3 viewmodels: 2 for aligners and one for a table.\n" + 
        "A data connection for the possible size of the tables must precede the connection representing the 'iterator' of the table.";
};

CViewModel_Clients.providesInterface = function() {
    return ["getViewmodelBundle", "getRange", "getPosition", "setPosition", "getViewportSize", "isStreaming"];
};

CViewModel_Clients.getCustomDataSchema = function() {
    var outerTableSchema = CViewModel_TableForLargeData.getCustomDataSchema();
    
    outerTableSchema.title = "Custom data for CViewModel_Clients";
    outerTableSchema.properties["numberOfElementsInFirstAligner"] = {
        "type": "integer"
    };
    outerTableSchema.properties["numberOfElementsInSecondAligner"] = {
        "type": "integer"
    };
    // Why does outerTableSchema.properties.name = undefined not work???
    delete outerTableSchema.properties.name;
    
    if (outerTableSchema.required == undefined) {
        outerTableSchema.required = []
    }
    outerTableSchema.required.splice(0, 0, "separateBy", "numberOfElementsInFirstAligner", "numberOfElementsInSecondAligner");
    
    return outerTableSchema;
};

CViewModel_Clients.expectsConnection = function() {
    return CViewModel_TableForLargeData.expectsConnection();
};

//# sourceURL=CustomizableApp\ViewModels\ViewModel_Clients.js