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

App.Authentication = DS.Model.extend({
  method:DS.attr('boolean'), // use LDAP
  primaryServer:DS.attr('string'),
  secondaryServer:DS.attr('string'),
  useSsl:DS.attr('boolean'),
  bindMethod:DS.attr('boolean'), // use credentials
  bindUser:DS.attr('string'),
  password:DS.attr('string'),
  passwordRetype:DS.attr('string'),
  searchBaseDn:DS.attr('string'),
  usernameAttribute:DS.attr('string')
});

App.Authentication.FIXTURES = [
  {
    id:1,
    method:0,
    primary_server:"",
    secondary_server:"",
    use_ssl:false,
    bind_method:0,
    bind_user:"",
    password:"",
    password_retype:"",
    search_base_dn:"",
    username_attribute:""
  }
]

App.AuthenticationForm = App.Form.extend({
  testResult:false,
  fieldsOptions:[
    { name:"method", displayName:"", isRequired:false, displayType:"select",
      values:[
        {value:0, label:Em.I18n.t("admin.authentication.form.method.database")},
        {value:1, label:Em.I18n.t("admin.authentication.form.method.ldap")}
      ]
    },
    { name:"primaryServer", displayName:Em.I18n.t("admin.authentication.form.primaryServer"), /*validator:'ipaddress',*/
      isRequired:function () {
        return this.get('form.field.method.value');
      }.property('form.field.method.value')
    },
    { name:"secondaryServer", displayName:Em.I18n.t("admin.authentication.form.secondaryServer"), /*validator:'ipaddress',*/ isRequired:false},
    { name:"useSsl", displayName:Em.I18n.t("admin.authentication.form.useSsl"), displayType:"checkbox", isRequired:false },
    { name:"bindMethod", displayName:'', displayType:"select", isRequired:false,
      values:[
        {value:0, label:Em.I18n.t("admin.authentication.form.bind.anonymously")},
        {value:1, label:Em.I18n.t("admin.authentication.form.bind.useCrenedtials")}
      ]},
    { name:"bindUser", displayName:Em.I18n.t('admin.authentication.form.bindUserDN'), isRequired:function () {
      return this.get('form.field.bindMethod.value');
    }.property('form.field.bindMethod.value')},
    { name:"password", displayName:Em.I18n.t('form.password'), displayType:"password",
      isRequired:function () {
        return this.get('form.field.bindMethod.value');
      }.property('form.field.bindMethod.value') },
    { name:"passwordRetype", displayName:Em.I18n.t('form.passwordRetype'), displayType:"password",
      validator: "passwordRetype",
      isRequired:function () {
        return this.get('form.field.bindMethod.value');
      }.property('form.field.bindMethod.value')},
    { name:"searchBaseDn", displayName:Em.I18n.t('admin.authentication.form.searchBaseDN'),
      isRequired:function () {
        return this.get('form.field.method.value');
      }.property('form.field.method.value')
    },
    { name:"usernameAttribute", displayName:Em.I18n.t('admin.authentication.form.usernameAttribute'),
      isRequired:function () {
        return this.get('form.field.method.value');
      }.property('form.field.method.value')
    },

    { name:"userDN", displayName:Em.I18n.t('admin.authentication.form.userDN') },
    { name:"userPassword", displayName:Em.I18n.t('admin.authentication.form.password'), displayType:'password'}
  ],
  fields:[],
  testConfiguration:function () {
    console.warn('Configuration test is randomized');
    this.set('testResult', parseInt(Math.random() * 2));
    return true;
  },
  testConfigurationMessage:function () {
    return this.get('testResult') ? Em.I18n.t('admin.authentication.form.test.success') : Em.I18n.t('admin.authentication.form.test.fail');
  }.property('testResult'),
  testConfigurationClass:function () {
    return this.get('testResult') ? "text-success" : "text-error";
  }.property('testConfigurationMessage')
})
;