<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="../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">
            body {
                font-family: RobotoDraft, 'Helvetica Neue', Helvetica, Arial;
                font-size: 1em;
                margin: 0;
                padding: 1.5em;
                -webkit-tap-highlight-color: rgba(0,0,0,0);
                -webkit-touch-callout: none;
                overflow: hidden;
            }

            #pages{
                min-width: 1336px;
                max-width: 1634px;
            }

            .fields-card-content {
                padding-left: 1.5em;
            }

            .fancy .fields-title {
                /*position: absolute;
                top: 30px;
                left: 100px;
                display: inline-block;*/
                color: var(--paper-indigo-500);
            }

             .fancy-content {
                /*padding: 25px;*/
            }

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

             .fancy .title {
                /*position: absolute;
                top: 30px;
                left: 100px;*/
                display: inline-block;
                position: relative;
                top: .75em;
                left: .625em;
                color: var(--paper-indigo-500);
            }

             .fancy .big {
                font-size: 1.37em;
                padding: 0.5em 0 1em;
                color: var(--google-grey-500);
            }

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

            paper-input {
                width: 80%;
            }

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

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

            #visualization_slider_area{
                position:relative;
                float:left;
                height: 22vh;
                /*width: 50%;*/
                min-width: 670px;
                min-height: 180px;
            }

            #datalet_area{
                position:relative;
                /*height: 30em;*/
                width: 46%;
                min-height: 500px;
                min-width: 600px;
                float: right;
            }

            #fields_mapping_area{
                position:relative;
                height: auto;/*70%;*/
                /*width: 50%;*/
                float:left;
                min-width: 670px;
            }

             #visualization_customization_area{
                position:relative;
                /*height:auto;*/
                width: 46%;
                float:right;
                background-color: white;
            }

            .field-mapping-card{
                width: 50%;
                height: 50vh;
                overflow: auto;
                position: relative;
                float: left;
            }

            .horizontal-section-container .vertical-section {
                /*max-width: 130px;*/
                diplay:block;
                float: left;
            }


            .colorful {
                background: #4285f4;
                color: #fff;
            }

            .toolbar_button{
                /*height: 100%;
                display: inline-block;*/
                float: left;
                margin-top: 2em;
                --iron-icon-height: 32px;
                --iron-icon-width: 32px;
            }

            /*paper-iron-button.toolbar_button{
                height: 34px;
                width: 34px;
            }*/

            .toolbar-center{
                display: inline-block;
                position: relative;
                float: left;
                width: 90%;
            }

            .toolbar{
                width: 100%;
                height : 8em;
                vertical-align: middle;
                min-width: 975px;
            }



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

            #finish{
                position: relative;
                float: left;
                width: 100%;
                height : 20%;
                align-content: center;
            }

            #datalet_created_placehorder {
                width: 100%;
            }

            #finish_button{
                float: left;
                margin-top: 2em;
                --iron-icon-height: 64px;
                --iron-icon-width: 64px;
                color: var(--paper-blue-500);
            }

            #finish_button:hover{
                --iron-icon : "add-circle-outline"
            }

           /* #finish_button iron-icon:hover{
                icon : "add-circle";
            }

            #finish_button iron-icon{
                height: 4vh;
                width: 4vw;
            }*/

            .area_container{
                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%;
                /*max-width: 100vw;
                max-height: 50vh;*/
                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);
            }

        </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>
            <div class="toolbar">
                <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="fancy toolbar-center">
                    <div class="fancy-content">
                        <div id="toolbar_number" class="avatar">1</div>
                        <div class="title">
                            <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>
                    </div>
                </div>
                <paper-icon-button id="NextButton" class="toolbar_button x-scope" on-click="_onNextClick" icon="chevron-right" alt="arrow-forward" title="arrow-forward"></paper-icon-button>
            </div>

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

                <neon-animatable>

                    <div class="fancy 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-textarea id="data_url" label="Dataset api data url" floatingLabel value="{{dataUrl}}" on-dragover="_handleDatasourceDragOver"></paper-textarea>
                                </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>
                            <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>

                </neon-animatable>

                <neon-animatable>

                    <div class="fancy">
                        <div class="fancy-content">

                            <div id="fields_placeholder" class="area_container">
                                <treeview-controllet id="fields_treeview"></treeview-controllet>
                            </div>
                            <div id="table_fields_container" class="area_container">
                               <div id="table_component_place_holder"></div>
                            </div>
                        </div>
                    </div>

                </neon-animatable>

                <neon-animatable>

                    <div class='fancy'>
                        <div class="fancy-content">
                            <div id="visualization_slider_area" class="area_container"></div>

                            <div id="datalet_area" class="area_container">
                               <div id="datalet_placeholder"></div>
                            </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 id="visualization_customization_area">
                                <paper-icon-button id="finish_button" on-click="_onFinish" icon="add-circle" alt="Conforms the creation" title="finish"></paper-icon-button>
                            </div>

                        </div>
                    </div>

                </neon-animatable>

                <!--<neon-animatable>

                    <div class="fancy">
                        <div class="card-content area_container">
                            <div id="datalet_created_placehorder"></div>
                        </div>
                        <div class="card-content area_container">
                            <paper-icon-button id="finish_button" on-click="_onFinish" icon="add-circle-outline" alt="Conforms the creation" title="finish"></paper-icon-button>
                        </div>
                    </div>

                </neon-animatable>-->

            </neon-animated-pages>
        </content>
    </template>

    <script src="../shared_js/bootstrap-3.3.4-dist/js/bootstrap.min.js"></script>
    <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);

                var table_params ={
                    component   : "datatable-datalet",
                    params      :{
                        'data-url' : this.dataUrl
                    },
                    fields      : [],
                    placeHolder : (navigator.userAgent.toLowerCase().indexOf('chrome') > -1) ? this.$.table_component_place_holder : this.$.table_component_place_holder[Object.keys(this.$.table_component_place_holder)[0]]
                };

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

            },

            /**
             * 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);
                }

                /*var w = $(this.$.visualization_slider_area).width();
                var pages = 2;
                var numItemsPerPage = 3;*/

                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;
               //<draggable-element-controllet is-target="true" heading="Field 1"  description="This fields is used for ..." number="1"></draggable-element-controllet>
               this.$.datalet_idm_fields_container.innerHTML = "";
               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>';
               }

               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="' + (i + 1) + '"></draggable-element-controllet><br>';
                       }
                   }
               }

            },

            assignToolbar : function(){
                this.$.toolbar_number.innerHTML = (this.selected + 1);
                switch(this.selected){
                   case 0:
                       this.$.toolbar_title.innerHTML  = "Dataset source";
                       this.$.toolbar_description.innerHTML = "Copy and paste/drag and drop in the textarea the url of datasource";
                       break;
                   case 1:
                       this.$.toolbar_title.innerHTML  = "Data fields selection";
                       this.$.toolbar_description.innerHTML = "Select the fields you want to visualize";
                       break;
                   case 2:
                       this.$.toolbar_title.innerHTML  = "Data mapping";
                       this.$.toolbar_description.innerHTML = "Select the visualization from the slider, drag and drop the selected fields in visualization parameter area, customize the visualization if you need";
                       break;
                    case 3:
                        this.$.toolbar_title.innerHTML  = "Finish";
                        this.$.toolbar_description.innerHTML = "Confirms the creation of the datalet";

                        break;
               }
            },

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

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

            _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>