/**
 * 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.
 */

var App = require('app');
var validator = require('utils/validator');

App.User = DS.Model.extend({
  userName:DS.attr('string'),
  id:function(){
    return this.get('userName');
  }.property('userName'),
  roles:DS.attr('string'),
  isLdap:DS.attr('boolean'),
  type: function(){
    if(this.get('isLdap')){
      return 'LDAP';
    }
    return 'Local';
  }.property('isLdap'),
  auditItems:DS.hasMany('App.ServiceAudit'),
  admin: DS.attr('boolean')
});

App.EditUserForm = App.Form.extend({
  className:App.User,
  object:function () {
    return App.router.get('mainAdminUserEditController.content');
  }.property('App.router.mainAdminUserEditController.content'),

  fieldsOptions:[
    { name:"userName", displayName:"Username" },
    { name:"old_password", displayName:"Current Password", displayType:"password", isRequired: false },
    { name:"new_password", displayName:"New Password", displayType:"password",  isRequired: false },
    { name:"new_passwordRetype", displayName:"Retype New Password", displayType:"password", isRequired: false },
    { name:"admin", displayName:"Admin", displayType:"checkbox", isRequired:false },
    { name:"roles", displayName:"Role", isRequired:false, isHidden:true },
    { name:"isLdap", displayName:"Type", isRequired:false, isHidden:true }
  ],
  fields:[],
  disableUsername:function () {
    this.getField("userName").set("disabled", "disabled");
  }.observes('object'),
  disableAdminCheckbox:function () {
    var object = this.get('object');
    if (object) {
      if ((object.get('userName') == App.get('router').getLoginName()) || App.supports.ldapGroupMapping && object.get("isLdap")) {
        this.getField("admin").set("disabled", true);
      } else {
        this.getField("admin").set("disabled", false);
      }
    }
  }.observes('object'),

  isValid:function () {

    var isValid = this._super();
    var thisForm = this;

    var newPass = this.get('field.new_password');
    var oldPass = this.get('field.old_password');
    var passRetype = this.get('field.new_passwordRetype');

    if (!validator.empty(newPass.get('value'))) {
      if(validator.empty(oldPass.get('value'))){
        oldPass.set('errorMessage', this.t('admin.users.editError.requiredField'));
        isValid = false;
      }
      if (newPass.get('value') != passRetype.get('value')) {
        passRetype.set('errorMessage', this.t('admin.users.createError.passwordValidation'));
        isValid = false;
      }
    }

    return isValid;
  },

  save: function () {
    var object = this.get('object');
    var formValues = {};
    $.each(this.get('fields'), function () {
      formValues[this.get('name')] = this.get('value');
    });

    $.each(formValues, function (k, v) {
      object.set(k, v);
    });

    //App.store.commit();
    this.set('result', 1);

    return true;
  }
});
App.CreateUserForm = App.Form.extend({
  className:App.User,
  object:function () {
    return App.router.get('mainAdminUserCreateController.content');
  }.property('App.router.mainAdminUserCreateController.content'),

  fieldsOptions:[
    { name:"userName", displayName:"Username", toLowerCase: function(){var v = this.get('value'); this.set('value', v.toLowerCase())}.observes('value') },
    { name:"password", displayName:"Password", displayType:"password", isRequired: true },
    { name:"passwordRetype", displayName:"Retype Password", displayType:"password", validator:"passwordRetype", isRequired: true },
    { name:"admin", displayName:"Admin", displayType:"checkbox", isRequired:false },
    { name:"roles", displayName:"Role", isRequired:false, isHidden:true }
  ],
  fields:[],

  isValid:function () {
    var isValid = this._super();

    var passField = this.get('field.password');
    var passRetype = this.get('field.passwordRetype');

    if (!validator.empty(passField.get('value'))) {
      if (passField.get('value') != passRetype.get('value')) {
        passRetype.set('errorMessage', this.t('admin.users.createError.passwordValidation'));
        isValid = false;
      }
    }

    if (isValid) {
      var users = App.User.find();
      var userNameField = this.getField('userName');
      var userName = userNameField.get('value');

      if (!validator.isValidUserName(userName)) {
        userNameField.set('errorMessage', this.t('users.userName.validationFail'));
        isValid = false;
      }

      if (users.mapProperty('userName').contains(userName)) {
        userNameField.set('errorMessage', this.t('admin.users.createError.userNameExists'));
        return isValid = false;
      }
    }

    return isValid;
  },

  save: function () {

    var object = this.get('object');
    var formValues = {};
    $.each(this.get('fields'), function () {
      formValues[Ember.String.decamelize(this.get('name'))] = this.get('value');
    });

    if (this.get('className')) {
      App.store.load(this.get('className'), (new Date()).getTime(), formValues);
    }
    else {
      console.log("Please define class name for your form " + this.constructor);
    }

    this.set('result', 1);

    return true;
  }
});
App.User.FIXTURES = [];

