/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

define(['require',
    'backbone',
    'hbs!tmpl/search/save/SaveModalLayoutView_tmpl',
    'utils/Utils',
    'modules/Modal',
    'utils/UrlLinks',
    'platform',
    'models/VSearch',
    'utils/CommonViewFunction',
    'utils/Messages'
], function(require, Backbone, SaveModalLayoutViewTmpl, Utils, Modal, UrlLinks, platform, VSearch, CommonViewFunction, Messages) {


    var SaveModalLayoutView = Backbone.Marionette.LayoutView.extend({
        _viewName: 'SaveModalLayoutView',
        template: SaveModalLayoutViewTmpl,
        regions: {},
        ui: {
            saveAsName: "[data-id='saveAsName']"
        },
        templateHelpers: function() {
            return {
                selectedModel: this.selectedModel ? this.selectedModel.toJSON() : null
            };
        },
        events: function() {
            var events = {};
            return events;
        },
        initialize: function(options) {
            var that = this;
            _.extend(this, _.pick(options, 'selectedModel', 'collection', 'getValue', 'isBasic', 'saveObj'));

            this.model = new VSearch();
            if (this.saveObj) {
                this.onCreateButton();
            } else {
                var modal = new Modal({
                    title: (this.selectedModel ? 'Update' : 'Create') + ' your favorite search ' + (this.selectedModel ? 'name' : ''),
                    content: this,
                    cancelText: "Cancel",
                    okCloses: false,
                    okText: this.selectedModel ? 'Update' : 'Create',
                    allowCancel: true
                }).open();
                modal.$el.find('button.ok').attr("disabled", "true");
                this.ui.saveAsName.on('keyup', function(e) {
                    modal.$el.find('button.ok').removeAttr("disabled");
                });
                this.ui.saveAsName.on('keyup', function(e) {
                    if ((e.keyCode == 8 || e.keyCode == 32 || e.keyCode == 46) && e.currentTarget.value.trim() == "") {
                        modal.$el.find('button.ok').attr("disabled", "true");
                    }
                });
                modal.on('ok', function() {
                    modal.$el.find('button.ok').attr("disabled", "true");
                    that.onCreateButton(modal);
                });
                modal.on('closeModal', function() {
                    modal.trigger('cancel');
                });
            }
        },
        onCreateButton: function(modal) {
            var that = this,
                obj = { name: this.ui.saveAsName.val ? this.ui.saveAsName.val() : null };
            if (this.selectedModel) {
                // Update Name only.
                var saveObj = this.selectedModel.toJSON();
                saveObj.name = obj.name;
            } else {
                obj.value = this.getValue();
                if (this.saveObj) {
                    // Save search Filter
                    _.extend(obj, this.saveObj);
                }
                var saveObj = CommonViewFunction.generateObjectForSaveSearchApi(obj);
                if (this.isBasic) {
                    saveObj['searchType'] = "BASIC";
                } else {
                    saveObj['searchType'] = "ADVANCED";
                }
            }
            this.model.urlRoot = UrlLinks.saveSearchApiUrl();
            this.model.save(saveObj, {
                type: (saveObj.guid ? 'PUT' : 'POST'),
                success: function(model, data) {
                    if (that.collection) {
                        if (saveObj.guid) {
                            var collectionRef = that.collection.find({ guid: data.guid });
                            if (collectionRef) {
                                collectionRef.set(data);
                            }
                            Utils.notifySuccess({
                                content: obj.name + Messages.editSuccessMessage
                            });
                        } else {
                            that.collection.add(data);
                            Utils.notifySuccess({
                                content: obj.name + Messages.addSuccessMessage
                            });
                        }
                    }

                }
            });
            if (modal) {
                modal.trigger('cancel');
            }
        }
    });
    return SaveModalLayoutView;
});