<link rel="import" href="../../bower_components/polymer/polymer.html" />

<link rel="import" href="../../bower_components/paper-material/paper-material.html" />

<link rel="import" href="../../bower_components/paper-dropdown-menu/paper-dropdown-menu.html">
<link rel="import" href="../../bower_components/paper-menu/paper-menu.html">
<link rel="import" href="../../bower_components/paper-item/paper-item.html">

<link rel="import" href="../../bower_components/paper-icon-button/paper-icon-button.html">
<link rel="import" href="../../bower_components/iron-icons/iron-icons.html">
<link rel="import" href="../../bower_components/iron-icon/iron-icon.html">

<dom-module id="select-datalet-inputs">

    <template>

        <style is="custom-style">
            :host {
            --paper-dropdown-menu-icon: {
                 color: #2196F3;
             };
            }

            #inputs_container {
                font-family: 'Roboto', 'Helvetica Neue', Helvetica, Arial, sans-serif;
                font-size: 16px;

                height: 100%;
                width: 258px;
            }

            .inputs{
                position: relative;
            }

            .input_header {
                height: 32px;
                padding-top: 16px;
                text-align: center;
                font-weight: 700;
                background-color: #B6B6B6;
            }

            #expert_container {
                display: none;
            }

            #expert_header {
                height: 32px;
                padding-top: 16px;
                margin-top: 8px;
                text-align: center;
                font-weight: 700;
                color: #00BCD4;
                cursor: pointer;

                display: none;
            }

            .info_button {
                position: absolute;
                top: 18px;
                right: 0px;
            }

            paper-dropdown-menu {
                height: 48px;
                width: 210px;;
                padding-left: 8px;
                padding-bottom: 8px;
                --paper-input-container-focus-color: #2196F3;
            }

            paper-item.iron-selected {
                background-color: #2196F3;
                color: #FFFFFF;
            }

            paper-icon-button {
                color: #2196F3;
                --paper-icon-button-ink-color: #2196F3;
                margin: 0px;
            }
        </style>

        <paper-material id="inputs_container" elevation="5">

            <div class="input_header"><span id="inputs"></span></div>

            <template is="dom-repeat" items="{{inputs}}" index-as="ddl_index">
                <div class="inputs">
                    <paper-dropdown-menu id={{ddl_index}} label={{_getLabelName(item.name)}}>
                        <paper-menu class="dropdown-content">
                            <template is="dom-repeat" items={{fields}}>
                                <paper-item id={{index}} on-tap="_addInput">{{_fieldName(item)}}</paper-item>
                            </template>
                        </paper-menu>
                    </paper-dropdown-menu>
                    <div class="info_button">
                        <paper-icon-button id="{{ddl_index}}" on-click="_setOrders" icon="unfold-more" title=""></paper-icon-button>
                    </div>
                </div>
            </template>

            <div id="expert_header" on-click="_showExpertMode"><span id="groupBy"></span></div>

            <div id="expert_container">

                <div class="inputs">
                    <paper-dropdown-menu id="group_by" disabled>
                        <paper-menu class="dropdown-content">
                            <template is="dom-repeat" items={{groupableFields}}>
                                <paper-item id={{index}} on-tap="_setAggregatorsFields">{{_fieldName(item)}}</paper-item>
                            </template>
                        </paper-menu>
                    </paper-dropdown-menu>
                </div>

                <template is="dom-repeat" items="{{aggregateFields}}" as="field">
                    <div class="inputs">
                        <paper-dropdown-menu id="calculate_{{index}}" label="{{_calculateLabel()}}">
                            <paper-menu class="dropdown-content">
                                <template is="dom-repeat" items="{{functions}}">
                                    <paper-item id={{index}} on-tap="_setAggregators">{{_operationName(index)}} : {{_fieldName(field)}}</paper-item>
                                </template>
                            </paper-menu>
                        </paper-dropdown-menu>
                    </div>
                </template>

            </div>

        </paper-material>


    </template>

    <script>

        Polymer({

            is : 'select-datalet-inputs',

            properties : {

                //INPUT
                fields : {type : Array, value : []},

                //OUTPUT
                selectedFields : {type : Array, value : []},
                aggregators : {type : Array, value : []},
                orders : {type : Array, value : []},

                expert : {
                    type  : Boolean,
                    value : false
                },

                functions : {
                    type  : Array,
                    value : ["COUNT", "SUM", "MIN", "MAX", "AVG", "FIRST", "LAST"]
                },

                inputs : {
                    type : Array,
                    value : []
                },

                groupableFields : {
                    type : Array,
                    value : []
                },

                aggregateFields : {
                    type : Array,
                    value : []
                }

            },

            ready : function() {
                $(this.$.inputs_container).perfectScrollbar();
            },

            attached : function() {
                this._translate();
            },

            _preselectInputs : function(fields, aggregators, orders) {
                aggregators = JSON.parse(aggregators);
                orders = JSON.parse(orders);

                this.selectedFields = this._copy(fields);

                var ddls = this.$.inputs_container.querySelectorAll("paper-dropdown-menu");

                for (var i = 0; i < fields.length; i++)
                   $(ddls[i]).find("paper-menu")[0].select(i+1);

                if(orders.length > 0) {
                    this.orders = this._copy(orders);//wrong
                }

                if(aggregators.length > 0) {

                    this.$.group_by.removeAttribute("disabled");
                    this._showExpertMode();

                    var groupableFields = [];
                    for (var i = 0; i < this.selectedFields.length; i++) {
                        if(this.selectedFields[i])
                            groupableFields.push(this.selectedFields[i]);
                    }
                    this.groupableFields = this._copy(groupableFields);
                    this.aggregateFields = [];

                    var index = this.groupableFields.indexOf(aggregators[0].field);

                    this.async(function () {
                        var menu = $(this.$.group_by).find("paper-menu")[0];
                        menu.select(index);
                    }, 0);

                    var aggregateFields = [];
                    for (var i = 0; i < this.groupableFields.length; i++) {
                        if (i != index && this.groupableFields[i])
                            aggregateFields.push(this.groupableFields[i]);
                    }
                    this.aggregateFields = this._copy(aggregateFields);

                    this.async(function() {
                        var ddls = document.getElementsByTagName("paper-dropdown-menu");
                        var j = 1;
                        for (var i = 0; i < ddls.length; i++){
                            var id = ddls[i].id;
                            if(id.indexOf("calculate") > -1) {
                                var ii = this.functions.indexOf(aggregators[j].operation);
                                j++;
                                $(ddls[i]).find("paper-menu")[0].select(-1);
                                $(ddls[i]).find("paper-menu")[0].select(ii);
                            }
                        }

//                        this._setAggregators();
                        this.aggregators = this._copy(aggregators);

                        this.fireReady();
                    }, 0);
                }
                else
                    this.fireReady();
            },

            getSelectedFields : function () {
                return this.selectedFields.filter(function(field){ return field != "" });
            },

            getAggregators : function () {
                return this.aggregators;
            },

            getOrders : function () {
                return this.orders;
            },

            setFields : function(fields) {
                var temp = this._copy(fields);
                temp.unshift("");

                if (JSON.stringify(this.fields) != JSON.stringify(temp)) {
                    this.fields = this._copy(temp);
                    this.$.expert_header.style.display = "block";
                    this._reset();
                }
            },

            setInputs : function(inputs) {
                var temp =  this._copy(inputs);
                if (inputs.constructor != Array && inputs.name == "GEOJSON") {
                    temp = [];
                    temp.push(inputs);
                }
                else if (inputs.constructor != Array) {//table --> 1 input
                    var name = inputs.name;
                    var description = inputs.description;
                    var selection = inputs.selection;
                    temp = [];
                    for (var i = 1; i < this.fields.length; i++)
                        temp.push({name: name + " " + i, description: description, selection: selection});
                }
                else if (inputs.length > 2 && inputs[2].selection == "*") {//map --> multiple baloon content
                    name = inputs[2].name;
                    description = inputs[2].description;
                    selection = inputs[2].selection;
                    temp = [inputs[0], inputs[1]];
                    temp.push({name: name + " 1", description: description, selection: selection});
                    for (var i = 4; i < this.fields.length; i++)
                        temp.push({name: name + " " +(i-2), description: description, selection: selection});
                }
//                else if (inputs.length > 4 && inputs[4].selection == "+") {//bubble --> multiple bubble content
//                    name = inputs[4].name;
//                    description = inputs[4].description;
//                    selection = inputs[4].selection;
//                    temp = [inputs[0], inputs[1], inputs[2], inputs[3]];
//                    temp.push({name: name + " 1", description: description, selection: selection});
//                    for (var i = 6; i < this.fields.length; i++)
//                        temp.push({name: name + " " + (i-4), description: description, selection: selection});
//                }

                else if (inputs.length == 2 && inputs[1].selection == "*") {//
                    name = inputs[1].name;
                    description = inputs[1].description;
                    selection = inputs[1].selection;
                    temp = [inputs[0]];
                    temp.push({name: name + " 1", description: description, selection: selection});
                    for (var i = 3; i < this.fields.length; i++)
                        temp.push({name: name + " " +(i-1), description: description, selection: selection});
                }

                this.inputs = this._copy(temp);

                this.selectedFields = new Array(temp.length);

                this.selectedFields2 = new Array(temp.length);
            },

            fireReady : function() {
                if(this._isReady())
                    this.fire('select_visualization_inputs_ready', {isReady: true});
                else
                    this.fire('select_visualization_inputs_ready', {isReady: false});
            },

            _isReady : function() {
                var fire = true;
                for (var i = 0; i < this.selectedFields.length; i++) {
                    if (!this.selectedFields[i] && this.inputs[i].selection != "+" && this.inputs[i].selection != "*" && this.inputs[i].selection != "?")
                        return false;
                    if(this.inputs[i].selection == "+")
                        fire = false;
                }

                if(!fire) {
                    for (var i = 0; i < this.selectedFields.length; i++) {
                        if (this.selectedFields[i] && this.inputs[i].selection == "+") {
                            fire = true;
                            break;
                        }
                    }
                }

                return fire;
            },

            _reset : function() {
                //this.fields = []; --> setFields
                //this.inputs = []; --> setInputs
                this.selectedFields = [];
                this.aggregators = [];
                //this.orders = []; --> _resetOrders
                this._resetOrders();
                this.expert = true;
                this._showExpertMode();//expert --> false
                this.groupableFields = [];
                this.aggregateFields = [];

                this.async(function () {
                    //reset ddl
                    var ddls = this.$.inputs_container.getElementsByTagName("paper-dropdown-menu");
                    for (var i = 0; i < ddls.length; i++)
                        $(ddls[i]).find("paper-menu")[0].select(-1);
                    this.$.group_by.setAttribute("disabled", "");
                    //reset orders
                    this._resetOrders();
                }, 1);
            },

            _translate : function(){
                this.$.inputs.innerHTML = ln["inputs_" + ln["localization"]];
                this.$.groupBy.innerHTML = ln["expertGroupBy_" + ln["localization"]];

                this.$.group_by.setAttribute("label", ln["groupBy_" + ln["localization"]]);
            },

            _showExpertMode : function() {
                if(!this.expert) {
                    this.$.expert_header.style.color = "#000000";
                    this.$.expert_header.style.background = "#B6B6B6";
                    this.$.expert_container.style.display = "block";
                }
                else {
                    this.$.expert_header.style.color = "#00BCD4";
                    this.$.expert_header.style.background = "#FFFFFF";
                    this.$.expert_container.style.display = "none";
                }

                this.expert = !this.expert;
            },

            getFields : function () {
                return this.selectedFields2;
            },

            _addInput : function(e){
                var selectedFields = this._copy(this.selectedFields);

                var ddl_index = $(e.target).parents("paper-dropdown-menu")[0].id;

                var index = e.target.id;
                selectedFields[ddl_index] = this.fields[index];

                this.selectedFields = this._copy(selectedFields);

//                console.log(this.inputs[ddl_index].name);
                this.selectedFields2[ddl_index] = {field: this.fields[index], input: this.inputs[ddl_index].name};

                if(!this._isReady()) {
                    this.$.group_by.setAttribute("disabled", "");

                    this.groupableFields = [];
                    this.aggregateFields = [];
                }
                else {
                    this.$.group_by.removeAttribute("disabled");

                    var groupableFields = [];
                    for (var i = 0; i < this.selectedFields.length; i++) {
                        if(this.selectedFields[i])
                            groupableFields.push(this.selectedFields[i]);
                    }
                    this.groupableFields = this._copy(groupableFields);
                    this.aggregateFields = [];

                    this.async(function () {
                        var menu = $(this.$.group_by).find("paper-menu")[0];
                        menu.select(-1);
                    }, 0);
                }
                this._setAggregators();
            },

            _setAggregatorsFields : function(e){
                var index = e.target.id;
                var aggregateFields = [];
                for (var i = 0; i < this.groupableFields.length; i++) {
                    if (i != index && this.groupableFields[i])
                        aggregateFields.push(this.groupableFields[i]);
                }
                this.aggregateFields = this._copy(aggregateFields);

                this.async(function() {
                    var ddls = document.getElementsByTagName("paper-dropdown-menu");
                    for (var i = 0; i < ddls.length; i++){
                        var id = ddls[i].id;
                        if(id.indexOf("calculate") > -1) {
                            $(ddls[i]).find("paper-menu")[0].select(-1);
                            $(ddls[i]).find("paper-menu")[0].select(0);
                        }
                    }

                    this._setAggregators();
                }, 0);
            },

            _setAggregators : function(){
                this.async(function() {
                    this.aggregators = [];

                    this._resetOrders();

                    var gb_menu = $(this.$.group_by).find("paper-menu")[0];
                    var groupByField = this.groupableFields[gb_menu.selected];
                    if(groupByField) {
                        this.aggregators.push({"field": groupByField, "operation": "GROUP BY"});
                        for (var i = 0; i < this.aggregateFields.length; i++){
                            var c_menu = $("#calculate_"+i).find("paper-menu")[0];
                            var operationIndex = c_menu.selectedItem.id;
                            this.aggregators.push({"field": this.aggregateFields[i], "operation": this.functions[operationIndex]})
                        }
                    }

                    this.fireReady();
                }, 1);
            },

            _setOrders : function(e){
                var t = e.target;
                if(t.tagName.indexOf("IRON-ICON") > -1)
                    t = $(e.target).parents("paper-icon-button")[0];

                var icon = t.getAttribute("icon");
                var id = t.getAttribute("id");
                var field = this.selectedFields[id];

                if(icon.indexOf("unfold-more") > -1){
                    t.setAttribute("icon", "expand-less");
                    t.setAttribute("title", ln["sortAscending_" + ln["localization"]]);
                    var orders = this.orders.filter(function (el) { return el.field !== field; });
                    orders.unshift({"field": field, "operation": "ASC"});
                    this.orders = this._copy(orders);
                }
                else if(icon.indexOf("expand-less") > -1){
                    t.setAttribute("icon", "expand-more");
                    t.setAttribute("title", ln["sortDescending_" + ln["localization"]]);
                    var orders = this.orders.filter(function (el) { return el.field !== field; });
                    orders.unshift({"field": field, "operation": "DESC"});
                    this.orders = this._copy(orders);
                }
                else if(icon.indexOf("expand-more") > -1){
                    t.setAttribute("icon", "unfold-more");
                    t.setAttribute("title", ln["unsort_" + ln["localization"]]);
                    var orders = this.orders.filter(function (el) { return el.field !== field; });
                    this.orders = this._copy(orders);
                }

                this.fireReady();
            },

            _resetOrders : function(){
                var icons = this.$.inputs_container.querySelectorAll("paper-icon-button");
                for (var i = 0; i < icons.length; i++){
                    icons[i].setAttribute("icon", "unfold-more");
                    icons[i].setAttribute("title", ln["unsort_" + ln["localization"]]);
                }
                this.orders = [];
            },

            _fieldName : function(field) {
                return field.substring(field.lastIndexOf(",")+1, field.length);
            },

            _getLabelName: function(key) {
                if(key.indexOf("Column") > -1) {
                    return ln["Column" + "_" +ln["localization"]] + key.slice(-2);
                }
                if(key.indexOf("Level") > -1) {
                    return ln["Level" + "_" +ln["localization"]] + key.slice(-2);
                }
                if(key.indexOf("BalloonContent") > -1) {
                    return ln["BalloonContent" + "_" +ln["localization"]] + key.slice(-2);
                }
//                if(key.indexOf("BubbleContent") > -1) {
//                    return ln["BubbleContent" + "_" +ln["localization"]] + key.slice(-2);
//                }
                if(key.indexOf("NumericYAxis") > -1) {
                    return ln["NumericYAxis" + "_" +ln["localization"]] + key.slice(-2);
                }

                return ln[key + "_" +ln["localization"]];
            },

            _operationName: function(index) {
                var key = this.functions[index];
                return ln[key + "_" +ln["localization"]];
            },

            _calculateLabel: function() {
                return ln["calculate" + "_" +ln["localization"]];
            },

            _copy : function(o) {
                var out, v, key;
                out = Array.isArray(o) ? new Array(o.length) : {};
                for (key in o) {
                    v = o[key];
                    out[key] = (typeof v === "object") ? this._copy(v) : v;
                }
                return out;
            }

        });

    </script>

</dom-module>