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

(function(cloudStack) {
  cloudStack.sections['global-settings'] = {
    title: 'label.menu.global.settings',
    id: 'global-settings',
    sectionSelect: {
      label: 'label.select-view'
    },
    sections: {
      globalSettings: {
        type: 'select',
        title: 'label.menu.global.settings',
        listView: {
          label: 'label.menu.global.settings',
          actions: {
            edit: {
              label: 'label.change.value',
              action: function(args) {    
								var data = {
								  name: args.data.jsonObj.name,
									value: args.data.value
								};								
                $.ajax({
                  url: createURL('updateConfiguration'),
                  data: data,                  
                  success: function(json) {                
                    var item = json.updateconfigurationresponse.configuration;
                    if(item.category == "Usage")
                      cloudStack.dialog.notice({ message: _l('message.restart.mgmt.usage.server') });
                    else
                      cloudStack.dialog.notice({ message: _l('message.restart.mgmt.server') });	
                    args.response.success({data: item});
                  },
                  error: function(json) {                
                    args.response.error(parseXMLHttpResponse(json));
                  }
                });
              }
            }
          },
          fields: {
            name: { label: 'label.name', id: true },
            description: { label: 'label.description' },
            value: { label: 'label.value', editable: true }
          },
          dataProvider: function(args) {
            var data = {
              page: args.page,
              pagesize: pageSize
            };

            if (args.filterBy.search.value) {
              data.name = args.filterBy.search.value;
            }

            $.ajax({
              url: createURL('listConfigurations'),
              data: data,
              dataType: "json",
              async: true,
              success: function(json) {
                var items = json.listconfigurationsresponse.configuration;
                args.response.success({ data: items });
              }
            });
          }
        }
      },

      ldapConfiguration:{
         type:'select',
         title:'LDAP Configuration',
         listView:{
            id:'ldap',
            label:'LDAP Configuration', 
            fields:{
                hostname: {label: 'Hostname'},
                queryfilter: {label: 'Query Filter'},
                searchbase: {label: 'Search Base'},
                port: {label: 'LDAP Port'},
                ssl: {
                  label: 'SSL'

                  }

             },
              dataProvider:function(args){
                   var data = {};
                   listViewDataProvider(args, data);
                    $.ajax({
              url: createURL('ldapConfig&listall=true'),   //Need a list LDAP configuration API call which needs to be implemented
              data: data,
                success: function(json) {
                var items = json.ldapconfigresponse.ldapconfig;
                args.response.success({data:items});
                   },
                   error: function(data) {
                args.response.error(parseXMLHttpResponse(data));
                  }
               });
           },

          detailView: {
            name: 'label.details',
              actions: {

              // Remove LDAP
              remove: {
                label: 'Remove LDAP',
                messages: {
                  notification: function(args) {
                    return 'LDAP Configuration Deleted';
                  },
                  confirm: function() {
                    return 'Are you sure you want to delete the LDAP configuration?';
                  }
                },
                action: function(args) {

                  $.ajax({
                       url:createURL("ldapRemove"),
                       success:function(json){

                  args.response.success();

                       }

                       });
                    $(window).trigger('cloudStack.fullRefresh');

                }
              }
          },

           tabs:{

               details: {
                title: 'LDAP Configuration Details',
                fields: [
                  {
                    hostname: { label: 'Hostname' },
                    description: { label: 'label.description' },
                    ssl : { label: 'SSL'}
                  }
                ],
                dataProvider: function(args) {
                                                                        $.ajax({
                                                                                url: createURL("ldapConfig&listAll=true" ),
                                                                                dataType: "json",
                                                                                async: true,
                                                                                success: function(json) {
                                                                                        var item = json.ldapconfigresponse.ldapconfig;
                                                                                        args.response.success({data: item});
                                                                                }
                                                                        });                                                                                                       
                                                                }
             
                                                        }

            }
       }, 

          actions: {
               add:{

               label: 'Configure LDAP',
 
               messages: {
                confirm: function(args) {
                  return 'Do you really want to configure LDAP ? ';
                },
                notification: function(args) {
                  return 'LDAP configured';
                }
              },
         
              createForm: {
                    
                    title: 'Configure LDAP',
                    fields:{
                        name:{label: 'Bind DN' , validation: {required:true} },
                        password: {label: 'Bind Password', validation: {required: true },isPassword:true },
                        hostname: {label:'Hostname' , validation:{required:true}},
                        queryfilter: {label:'Query Filter' , validation: {required:true} , docID:'helpLdapQueryFilter'},
                        searchbase: {label:'SearchBase',validation:{required:true}},
                        ssl:  {
                               label:'SSL' ,
                               isBoolean:true,
                               isChecked:false
                                
                            },
                        port: {  label: 'Port' , defaultValue: '389' },
                        truststore:{ label:'Trust Store' , isHidden:true , dependsOn:'ssl',validation:{required:true} },
                        truststorepassword:{ label:'Trust Store Password' ,isHidden:true , dependsOn:'ssl', validation:{required:true}}
                        
                     }
 

              },
            

                action:function(args) {
                     var array = [];
                      array.push("&binddn=" + todb(args.data.name));
                      array.push("&bindpass=" + todb(args.data.password));
                      array.push("&hostname=" + todb(args.data.hostname));
                      array.push("&searchbase=" +todb(args.data.searchbase));
                      array.push("&queryfilter=" +todb(args.data.queryfilter));
                      array.push("&port=" +todb(args.data.port));

                      if(args.$form.find('.form-item[rel=ssl]').find('input[type=checkbox]').is(':Checked')== true)  {

                            array.push("&ssl=true");
                            if(args.data.truststore != "")
                            array.push("&truststore=" +todb(args.data.truststore));

                            if(args.data.truststorepassword !="")
                            array.push("&truststorepass=" +todb(args.data.truststorepassword));

                        }

                      else
                        array.push("&ssl=false");

                  $.ajax({
                    url: createURL("ldapConfig" + array.join("")),
                    dataType: "json",
                    async: true,
                    success: function(json) {
                       var items = json.ldapconfigresponse.ldapconfig;
                       args.response.success({
                                   data: items
                             });

                      },

                   error:function(json){
                      args.response.error(parseXMLHttpResponse(json));

                     }


                     });


                }
             }

           }

 

          }



       },
      hypervisorCapabilities: {
        type: 'select',
        title: 'label.hypervisor.capabilities',
        listView: {
          id: 'hypervisorCapabilities',
          label: 'label.hypervisor.capabilities',
          fields: {
            hypervisor: { label: 'label.hypervisor' },
            hypervisorversion: { label: 'label.hypervisor.version' },
            maxguestslimit: { label: 'label.max.guest.limit' }
          },
          dataProvider: function(args) {					  
						var data = {};
						listViewDataProvider(args, data);					
										  
            $.ajax({
              url: createURL('listHypervisorCapabilities'),
              data: data,              
              success: function(json) {
                var items = json.listhypervisorcapabilitiesresponse.hypervisorCapabilities;
                args.response.success({data:items});
              },
              error: function(data) {
                args.response.error(parseXMLHttpResponse(data));
              }
            });
          },

          detailView: {
            name: 'label.details',
            actions: {
              edit: {
                label: 'label.edit',
                action: function(args) {
                  var data = {
									  id: args.context.hypervisorCapabilities[0].id,
										maxguestslimit: args.data.maxguestslimit
									};
                  
                  $.ajax({
                    url: createURL('updateHypervisorCapabilities'),
                    data: data,
                    success: function(json) {
                      var item = json.updatehypervisorcapabilitiesresponse['null'];
                      args.response.success({data: item});
                    },
                    error: function(data) {
                      args.response.error(parseXMLHttpResponse(data));
                    }
                  });
                }
              }
            },

            tabs: {
              details: {
                title: 'label.details',
                fields: [
                  {
                    id: { label: 'label.id' },
                    hypervisor: { label: 'label.hypervisor' },
                    hypervisorversion: { label: 'label.hypervisor.version' },
                    maxguestslimit: {
                      label: 'label.max.guest.limit',
                      isEditable: true
                    }
                  }
                ],
                dataProvider: function(args) {
                  args.response.success(
                    {
                      data:args.context.hypervisorCapabilities[0]
                    }
                  );
                }
              }
            }
          }
        }
      }
    }
  };
})(cloudStack);
