angular.module('webui.ctrls.props', [
  'webui.services.utils', 'webui.services.settings', 'webui.services.deps',
  'webui.services.rpc', 'webui.services.configuration',
])
.controller('StarredPropsCtrl', ['$scope', '$_', '$utils', '$rpc', '$globalSettings', '$fileSettings', '$starredProps',
  function(scope, _, utils, rpc, gsettings, fsettings, starredProps) {
  scope._props = [];
  scope.dirty = true;
  scope.properties = [];
  scope.getProps = function() {
    var props = utils.getCookie('aria2props');
    if (!props || !props.indexOf) props = starredProps; // default properties starred in the global configuration file

    return props;
  };

  scope.enabled = function() {
    for (var i = 0; i < scope.properties.length; i++) {
      if (scope.properties[i]._val != scope.properties[i].val) return true;
    }

    return false;
  }

  scope.save = function() {
    var sets = {};
    var found = false;
    for (var i = 0; i < scope.properties.length; i++) {
      if (scope.properties[i]._val != scope.properties[i].val) {
        sets[scope.properties[i].name] = scope.properties[i].val;
        found = true;
      }
    }

    if (found) {
      rpc.once('changeGlobalOption', [sets]);
    }
  }

  rpc.subscribe('getGlobalOption', [], function(data) {
    var vals = data[0];
    var props = scope.getProps();
    var arr = [];

    for (var i = 0; i < props.length; i++) {
      var set = {};
      if (props[i] in gsettings) {
        set = gsettings[props[i]];
        if (props[i] in vals) {
          set.val = vals[props[i]];
        }
        set.name = props[i];
        arr.push(set);
      }
      else if (props[i] in fsettings) {
        set = fsettings[props[i]];
        if (props[i] in vals) {
          set.val = vals[props[i]];
        }
        set.name = props[i];
        arr.push(set);
      }
      else if (props[i] in vals) {
        arr.push({name: props[i], val: vals[props[i]]});
      }
    }


    utils.mergeMap(arr, scope.properties, function(prop, nprop) {
      nprop = nprop || {};
      nprop.name = prop.name;
      nprop.options = prop.options;
      if (nprop._val == nprop.val || nprop.val == prop.val) {
        nprop._val = prop.val;
        nprop.val = prop.val;
      }
      else {
        nprop._val = prop.val;
      }
      nprop.desc = prop.desc;
      return nprop;
    });
  });
}]);