<link rel="import" href="../../bower_components/polymer/polymer.html">
<link rel="import" href="../../bower_components/paper-styles/color.html">

<link rel="import" href="../../bower_components/neon-animation/neon-animated-pages.html">
<link rel="import" href="../../bower_components/neon-animation/neon-animatable.html">
<link rel="import" href="../../bower_components/neon-animation/neon-animations.html">

<link rel="import" href="../../bower_components/iron-ajax/iron-ajax.html">
<link rel="import" href="../../bower_components/paper-input/paper-input.html">
<link rel="import" href="../../bower_components/paper-input/paper-textarea.html">
<link rel="import" href="../../bower_components/paper-button/paper-button.html">
<link rel="import" href="../../bower_components/paper-tabs/paper-tabs.html">
<link rel="import" href="../../bower_components/paper-tabs/paper-tab.html">
<link rel="import" href="../../bower_components/iron-pages/iron-pages.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-toast/paper-toast.html">


<link rel="import" href="../items-slider-controllet/items-slider-controllet.html">
<link rel="import" href="../draggable-element-controllet/draggable-element-controllet.html">
<link rel="import" href="../treeview-controllet/treeview-controllet.html">


<dom-module id="data-sevc-controllet">
    <template>
        <link rel="stylesheet" href="../shared_js/perfect-scrollbar/css/perfect-scrollbar.min.css">

        <style is="custom-style">

            .flexchild
            {
            @apply(--layout-flex);
            }

            .flex2child
            {
            @apply(--layout-flex-2);
            }

            .avatar
            {
                display: inline-block;
                height: 2em;
                width: 2em;
                border-radius: 50%;
                background: var(--paper-blue-500);
                color: white;
                line-height: 2em;
                font-size: 1.87em;
                text-align: center;
            }

            .title
            {
                position: relative;
                top: 0.60vh;
                margin-left: 20px;
            }

            .big
            {
                font-size: 1.37em;
                color: var(--google-grey-500);
            }

            .medium
            {
                font-size: 1em;
                padding-bottom: 0.5em;
                color : #000000;
                font-weight: bold;
            }

            .small
            {
                font-size: 0.8em;
                padding-top: 10px;
                color: var(--paper-blue-500);
                font-weight: bold;
            }

            paper-input
            {
                width: 80%;
            }

            paper-dropdown-menu
            {
                text-align: left;
                margin: auto;
                width: 100%;
            }

            ::content paper-menu-button
            {
                display: block;
                width: 100%;
            }

            #visualization_slider_area
            {
                min-width: 670px;
                min-height: 180px;
            }

            #fields_mapping_area
            {
                min-width: 670px;
                min-height: 180px;
            }

            #datalet_placeholder
            {
                height: 360px;
                min-height: 360px;

            }

            .datalet_right_container
            {
                width: 100vh;
            }

            .field-mapping-card
            {
                width: 50%;
                float: left;
            }

            .toolbar_button
            {
                --iron-icon-height: 32px;
                --iron-icon-width: 32px;
            }

            #finish_button
            {
                --iron-icon-height: 32px;
                --iron-icon-width: 32px;
                color: var(--paper-blue-500);
            }

            .area_container
            {
                overflow: hidden;
                margin : 0.8em;
                padding : 0.8em;
                border-width: 1em;
                border-radius: 0.125rem;
                box-shadow: 0.125em 0.125em 0.1125em 0.125em rgba(0, 0, 0, 0.25);
            }

            #fields_placeholder{
                width: 40%;
                height: 50vh;
                position: relative;
                float: left;
                overflow: auto;
            }

            #table_fields_container{
                height: 50vh;
                width: 55%;
                position: relative;
                float: left;
                overflow: auto;
            }

            paper-tabs, paper-toolbar
            {
                background-color:  var(--paper-blue-500);
                color: #ffffff;
                box-shadow: 0px 3px 6px rgba(0, 0, 0, 0.2);
            }

            paper-toolbar paper-tabs
            {
                box-shadow: none;
                --paper-tabs-selection-bar-color : var(--google-gray-500);
            }

            paper-tabs[noink][no-bar] paper-tab.iron-selected
            {
                background-color: var(--google-gray-500);
            }

            paper-tabs[align-bottom]
            {
                box-shadow: 0px -2px 6px rgba(0, 0, 0, 0.15);
            }

            #idm_fields_main_container{
                position: relative;
                height: 50vh;
            }

            #selected_fields_main_container{
                position: relative;
                height: 50vh;
            }

            paper-menu{
                width: 100%;
            }

        </style>

        <iron-ajax
                auto
                id="data_request"
                url={{dataUrl}}
                verbose="true"
                on-response="handleResponseData"
                debounce-duration="300">
        </iron-ajax>

        <iron-ajax
                id="datales_list_request"
                auto
                url={{dataletsListUrl}}
                handle-as="json"
                on-response="handleResponseDatalets"
                debounce-duration="300">
        </iron-ajax>

        <iron-ajax
                id="selected_datalet_request"
                url={{deepUrl}}
                verbose="true"
                on-response="handleSelectedDatalet"
                debounce-duration="300">
        </iron-ajax>

        <content>

            <neon-animated-pages id="pages" selected="[[selected]]" entry-animation="[[entryAnimation]]" exit-animation="[[exitAnimation]]">

                <neon-animatable>

                    <div class="vertical justified layout">

                        <div class="horizontal layout">
                            <div class="avatar" style="margin-left:15px">1</div>
                            <div class="title flex">
                                <div id="toolbar_title" class="big">Dataset source</div>
                                <div id="toolbar_description" class="small">Copy and paste/drag and drop in the textarea the url of datasource</div>
                            </div>
                            <paper-icon-button id="NextButton" class="toolbar_button" on-click="_onNextClick" icon="chevron-right" alt="arrow-forward" title="arrow-forward"></paper-icon-button>
                        </div>

                        <div class="area_container">
                            <paper-tabs selected="{{DatasourceTabSelected}}">
                                <paper-tab>Select data source</paper-tab>
                                <paper-tab>Most popular</paper-tab>
                                <paper-tab>Search</paper-tab>
                            </paper-tabs>
                            <iron-pages selected="{{DatasourceTabSelected}}">
                                <div>
                                    <div class="card-content">
                                        <paper-dropdown-menu id="datasets-sources" label="Available datasets">
                                            <paper-menu class="dropdown-content">
                                                <template is="dom-repeat" items="{{datasets}}" as="dataset" index-as="index">
                                                    <paper-item id="{{index}}" on-tap="_datasourceSelected">{{dataset}}</paper-item>
                                                </template>
                                            </paper-menu>
                                        </paper-dropdown-menu>
                                    </div>

                                    <div><img src="static/images/or.png" style="position: relative;left: 50%;padding-top:20px"></div>

                                    <div class="card-content">
                                        <paper-textarea id="data_url" label="Dataset api data url" floatingLabel value="{{dataUrl}}" on-dragover="_handleDatasourceDragOver"></paper-textarea>
                                    </div>


                                </div>
                                <div><img src="static/images/UnderConstruction.png" style="position: relative;top: 60%;left: 25%;"></div>
                                <div><img src="static/images/UnderConstruction.png" style="position: relative;top: 60%;left: 25%;"></div>
                            </iron-pages>
                        </div>

                    </div>

                </neon-animatable>

                <neon-animatable>

                    <div class="vertical justified layout">

                        <div class="horizontal layout">
                            <paper-icon-button id="PrevButton" class="toolbar_button x-scope" on-click="_onPrevClick" icon="chevron-left" alt="arrow-back" title="arrow-back"></paper-icon-button>
                            <div class="avatar">2</div>
                            <div class="title flex">
                                <div id="toolbar_title" class="big">Dataset source</div>
                                <div id="toolbar_description" class="small">Copy and paste/drag and drop in the textarea the url of datasource</div>
                            </div>
                            <paper-icon-button id="NextButton" class="toolbar_button" on-click="_onNextClick" icon="chevron-right" alt="arrow-forward" title="arrow-forward"></paper-icon-button>
                        </div>

                        <div class="horizontal layout">

                            <div id="fields_placeholder" class="area_container flexchild" style="min-width:300px">
                                <treeview-controllet id="fields_treeview"></treeview-controllet>
                            </div>

                            <div id="table_fields_container" class="area_container flex2child">
                                <div id="table_component_place_holder"></div>
                            </div>

                        </div>

                    </div>

                </neon-animatable>

                <neon-animatable style="height:100vh">

                    <div class="vertical justified layout">

                        <div class="horizontal layout">
                            <paper-icon-button id="PrevButton" class="toolbar_button x-scope" on-click="_onPrevClick" icon="chevron-left" alt="arrow-back" title="arrow-back"></paper-icon-button>
                            <div class="avatar">3</div>
                            <div class="title flex">
                                <div id="toolbar_title" class="big">Data mapping</div>
                                <div id="toolbar_description" class="small">Select the visualization from the slider, drag and drop the selected fields in visualization parameter area, customize the visualization if you need</div>
                            </div>
                            <paper-icon-button id="finish_button" on-click="_onFinish" icon="add-circle" alt="Conforms the creation" title="finish"></paper-icon-button>
                        </div>


                        <div class="horizontal layout">

                            <div class="">
                                <div id="visualization_slider_area" class="area_container"></div>
                                <div id="fields_mapping_area" class="area_container">

                                    <div id="selected_fields_main_container" class="field-mapping-card">
                                        <div class="title">
                                            <div class="medium">Selected fields</div>
                                        </div>
                                        <div id="selected_fields_container" class="area_container"></div>
                                    </div>

                                    <div id="idm_fields_main_container" class="field-mapping-card">
                                        <div class="title">
                                            <div class="medium">Datalet fields</div>
                                        </div>
                                        <div id="datalet_idm_fields_container" class="area_container"></div>
                                    </div>
                                </div>
                            </div>

                            <div class="datalet_right_container">
                                <div class="vertical justified layout">
                                    <div id="datalet_placeholder" class=""></div>
                                </div>
                            </div>

                        </div>

                    </div>

                </neon-animatable>

            </neon-animated-pages>

            <paper-toast id="message" text=""></paper-toast>

        </content>
    </template>

    <script src="../shared_js/perfect-scrollbar/js/min/perfect-scrollbar.jquery.min.js"></script>
    <script src="../../../DEEPCLIENT/js/deepClient.js"></script>

    <script>

        var datasetsPrato = {
            names:[
                'Consuntivo entrate 2009',
                'Consuntivo entrate 2010',
                'Consuntivo entrate 2011',
                'Consuntivo entrate 2012',
                'Consuntivo entrate 2014'
            ],
            urls: [
                'http://ckan.routetopa.eu/api/action/datastore_search?resource_id=07843fc3-07e1-4c66-9be4-fed43ca4a26f&limit=10000',
                'http://ckan.routetopa.eu/api/action/datastore_search?resource_id=48a4db73-d3d4-4639-bbc2-9c797d0e6cda&limit=10000',
                'http://ckan.routetopa.eu/api/action/datastore_search?resource_id=a14cc2fb-0c24-48d7-9370-834045797d89&limit=10000',
                'http://ckan.routetopa.eu/api/action/datastore_search?resource_id=fb32fcb6-5e44-4e52-b132-01c6540ddbee&limit=10000',
                'http://ckan.routetopa.eu/api/action/datastore_search?resource_id=0cb600fc-19ad-4aaf-9794-1e6ea851840a&limit=10000'
            ]
        }

        var datasetsGroeningen = {
            names:[
                'Vestigingen register gemeente Groningen',
                'Woonruimte gemeente Groningen'
            ],
            urls: [
                'http://ckan.routetopa.eu/api/action/datastore_search?resource_id=ba554c1f-02a7-4d76-b449-fb9daa1f8bfd&limit=10000',
                'http://ckan.routetopa.eu/api/action/datastore_search?resource_id=af7b3916-4347-469a-8354-3c2d559bd92f&limit=10000'
            ]
        }

        var datasetsDublin = {
            names:[
                'SDCC Traffic Cameras',
                'Derelict Site Register',
                'Dublin City Council Commencement Notices',
                'Dublin City Council Planning Applications',
                'Dun Laoghaire-Rathdown County Council Planning Application 2008-2014',
                'Fingal Council Planning Applications for last 7 years',
                'Planning Register',
                'Fingal Development Plan 2011-2017 Record of Protected Structures'
            ],
            urls: [
                'http://ckan.routetopa.eu/api/action/datastore_search?resource_id=73e02092-85a1-434e-85fe-0c9a43aa9a52&limit=10000',
                'http://ckan.routetopa.eu/api/action/datastore_search?resource_id=fcbee83e-3d3d-4303-a568-24dd33d02adc&limit=10000',
                'http://ckan.routetopa.eu/api/action/datastore_search?resource_id=ee00de68-f2e4-482f-a003-3c0561351075&limit=10000',
                'http://ckan.routetopa.eu/api/action/datastore_search?resource_id=2f4a9d44-b52f-4c8b-a5db-d8f4a676d81e&limit=10000',
                'http://ckan.routetopa.eu/api/action/datastore_search?resource_id=c479f061-9638-489d-ac55-0c68765548ff&limit=10000',
                'http://ckan.routetopa.eu/api/action/datastore_search?resource_id=d29a477a-4734-43ef-8002-048c8640d441&limit=10000',
                'http://ckan.routetopa.eu/api/action/datastore_search?resource_id=2b23f32d-e27e-4eef-af1e-27e05103df7d&limit=10000',
                'http://ckan.routetopa.eu/api/action/datastore_search?resource_id=5ea813bc-fdf9-4edb-b3b1-0142b593d5c6&limit=10000',
            ]
        }

        var AvailableDatasets = [datasetsPrato, datasetsGroeningen, datasetsDublin]


        Polymer({

            is : 'data-sevc-controllet',

            listeners : {
                'items-slider-controllet_item-selected' : '_dataletSelected',
                'draggable-element-controllet_content-dragged' : '_fieldsMapped',
                'treeview-controllet-fileds-selected' : '_fieldsSelected'
            },

            properties : {

                entryAnimation : {
                    type  : String,
                    value : ""
                },

                exitAnimation  : {
                    type  : String,
                    value : ""
                },

                selected       : {
                    type  : Number,
                    value : 0
                },

                /**
                 * It represent the data url from CKAN api
                 *
                 * @attribute dataUrl
                 * @type string
                 * @default 'null'
                 */
                dataUrl : {
                    type : String,
                    value : "",/*"http://demo.ckan.org/api/action/datastore_search?resource_id=8324a4c9-66d6-47bf-a898-94237cc39b9f&limit=50",*/
                    observer : '_dataUrlChanged'
                },
                /**
                 * It represent the DEEP url to get information about the datalets
                 *
                 * @attribute deepUrl
                 * @type string
                 * @default 'null'
                 */
                deepUrl : {
                    type : String,
                    value : ""
                },

                organization : {
                    type : Number,
                    value : 2
                },

                datalet_query : {
                    type : String,
                    value : ""
                },

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

                selected_datalet : {
                    type : String,
                    value : ""
                },

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

                DatasourceTabSelected : {
                    type : Number,
                    value : 0
                },

                datasets :
                {
                    type : Array,
                    value : AvailableDatasets[0].names
                },

                datasets_urls :
                {
                    type : Array,
                    value :AvailableDatasets[0].urls
                }

            },

            ready : function(){

                this.datasets = AvailableDatasets[this.organization].names;
                this.datasets_urls = AvailableDatasets[this.organization].urls;

                $(this.$.fields_placeholder).perfectScrollbar();
                $(this.$.selected_fields_main_container).perfectScrollbar();
                $(this.$.idm_fields_main_container).perfectScrollbar();
                $(this.$.table_fields_container).perfectScrollbar();

            },

            /**
             * Callback to parse the data requested when dataUrl change its value
             *
             * @method handleResponseData
             */
            handleResponseData : function(e){

                this.$.fields_treeview.init(e.detail.response);

            },

            /**
             * Callback to parse the components response object
             *
             * @method handleResponseDatalets
             */
            handleResponseDatalets : function(e){
                this.datalets_list = new Array();
                for(var i=0;i < e.detail.response.length;i++){
                    var datalet_info = { name : e.detail.response[i].name ,
                                         image : e.detail.response[i].url + e.detail.response[i].name + ".png"
                    };

                    this.datalets_list.push(datalet_info);
                }

                this.$.visualization_slider_area.innerHTML = '<items-slider-controllet items=\'' + JSON.stringify(this.datalets_list) + '\'' +
                                                             '\'></items-slider-controllet>';
            },

            handleSelectedDatalet : function(e){

               var response = e.detail.response;
               this.$.datalet_idm_fields_container.innerHTML = "";

               if(response.idm.inputs.input.constructor == Object) {
                   var input = response.idm.inputs.input;
                   if(input.selection == "*") {
                       var input_selected_fields = Polymer.dom(this.$.selected_fields_container).querySelectorAll('draggable-element-controllet');
                       for (var j = 0; j < input_selected_fields.length; j++) {
                           this.$.datalet_idm_fields_container.innerHTML += '<draggable-element-controllet is-target="true" heading="Field ' + (j + 1) + '"  description="' + input.description + '" number="' + (j + 1) + '"></draggable-element-controllet><br>';
                       }
                   }
               }else{
                   for(var i =0; i < response.idm.inputs.input.length; i++){
                       var input = response.idm.inputs.input[i];
                       this.$.datalet_idm_fields_container.innerHTML += '<draggable-element-controllet is-target="true" id="' + input.name + '" heading="' + input.name + '"  description="' + input.description + '" number="' + (i + 1) + '"></draggable-element-controllet><br>';
                   }
               }

            },

            validateCurrentPass : function(next_selected_pass){

                switch(next_selected_pass){
                    case 0:
                        return true;
                    case 1:
                        if(this.$.data_url.value == ""){
                            this.$.message.text = "You have to select a dataset to access to pass 2.";
                            this.$.message.show();
                            return false;
                        }else{
                            return true;
                        }

                    case 2:
                        if(Polymer.dom(this.$.selected_fields_container).querySelectorAll('draggable-element-controllet') == 0){
                            this.$.message.text = "You have to select a set of fields to access to pass 3.";
                            this.$.message.show();
                            return false;
                        }else{
                            return true;
                        }
                }

            },

            _onPrevClick : function() {
                if(!this.validateCurrentPass(this.selected === 0 ? 0 : (this.selected - 1))) return;

                this.entryAnimation = 'slide-from-left-animation';
                this.exitAnimation  = 'slide-right-animation';
                this.selected = this.selected === 0 ? 0 : (this.selected - 1);
            },

            _onNextClick : function() {

                if(!this.validateCurrentPass(this.selected === 2 ? 2 : (this.selected + 1))) return;

                this.entryAnimation = 'slide-from-right-animation';
                this.exitAnimation  = 'slide-left-animation';
                this.selected = this.selected === 2 ? 2 : (this.selected + 1);
            },

            _datasourceSelected : function(e){

               /*if(Object.getPrototypeOf(e) !== CustomEvent.prototype) {
                  e = e[Object.keys(e)[0]];
               }*/

               this.$.data_url.value = this.datasets_urls[parseInt(e.target.id)];
            },

            _dataUrlChanged : function(newValue, oldValue){
                this.$.data_request.generateRequest();
            },

            _dataletSelected : function(e){
                this.selected_datalet = e.detail.datalet;
                this.$.selected_datalet_request.url = this.deepUrl + e.detail.datalet;
                this.$.selected_datalet_request.generateRequest();

            },

            _fieldsSelected : function(e){

                 this.$.selected_fields_container.innerHTML = "";
                 for(var i=0;i<e.detail.fields.length;i++) {
                    this.$.selected_fields_container.innerHTML += '<draggable-element-controllet identifier="' + e.detail.fields[i] +
                                                                                                 '" label="' + e.detail.fields[i].split(",")[e.detail.fields[i].split(",").length -1] +
                                                                  '"></draggable-element-controllet><br>';
                 }

                 var place_holder = (navigator.userAgent.toLowerCase().indexOf('chrome') > -1) ? this.$.table_component_place_holder : this.$.table_component_place_holder[Object.keys(this.$.table_component_place_holder)[0]];

                 var table_params ={
                     component   : "datatable-datalet",
                     params      :{
                        'data-url' : this.dataUrl
                     },
                     fields      : e.detail.fields,
                     placeHolder :  this.$.table_component_place_holder
                 };

                 ComponentService.deep_url = this.deepUrl;
                 ComponentService.getComponent(table_params);

            },

            _fieldsMapped : function(e){

                var input_mapped_fields = Polymer.dom(this.$.datalet_idm_fields_container).querySelectorAll('draggable-element-controllet[is-target=true]');
                this.selected_fields = Array();

                for (var i = 0; i < input_mapped_fields.length; i++) {
                    if (input_mapped_fields[i].value != "") {
                        this.selected_fields.push(input_mapped_fields[i].value);
                    }
                }

                var datalet_params ={
                    component   : this.selected_datalet,
                    params      :{
                        'data-url' : this.dataUrl
                    },
                    fields      : this.selected_fields,
                    placeHolder : this.$.datalet_placeholder
                };

                var datalet_finish_params ={
                    component   : this.selected_datalet,
                    params      :{
                        'data-url' : this.dataUrl
                    },
                    fields      : this.selected_fields,
                    placeHolder : this.$.datalet_created_placehorder
                };

                ComponentService.deep_url = this.deepUrl;

                ComponentService.getComponent(datalet_params);
                ComponentService.getComponent(datalet_finish_params);

            },

            _handleDatasourceDragOver : function(e){
                this.$.data_url.value = "";
            },

            _onFinish : function(e){

                var data = {
                    dataUrl : this.dataUrl,
                    fields : this.selected_fields,
                    datalet : this.selected_datalet
                }

                this.fire('data-sevc-controllet.dataletCreated', {data : data});

            }

        });

    </script>

</dom-module>