// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

'use strict';

lib.rtdep('lib.f');

/**
 * PreferenceManager subclass managing global NaSSH preferences.
 *
 * This is currently just an ordered list of known connection profiles.
 */
nassh.PreferenceManager = function(opt_storage) {
  var storage = opt_storage || nassh.defaultStorage;
  lib.PreferenceManager.call(this, storage, '/nassh/');

  // Wam enabled by default in "Secure Shell (dev)" only.
  var enableWam = (chrome.runtime.id == 'okddffdblfhhnmhodogpojmfkjmhinfp');

  this.defineChildren('profile-ids', function(parent, id) {
    return new nassh.ProfilePreferenceManager(parent, id);
  });
};

nassh.PreferenceManager.prototype = {
  __proto__: lib.PreferenceManager.prototype
};

nassh.PreferenceManager.prototype.createProfile = function() {
  return this.createChild('profile-ids');
};

nassh.PreferenceManager.prototype.removeProfile = function(id) {
  return this.removeChild('profile-ids', id);
};

nassh.PreferenceManager.prototype.getProfile = function(id) {
  return this.getChild('profile-ids', id);
};

/**
 * lib.PreferenceManager subclass managing per-connection preferences.
 */
nassh.ProfilePreferenceManager = function(parent, id) {
  lib.PreferenceManager.call(this, parent.storage,
                             '/nassh/profiles/' + id);

  this.id = id;

  this.definePreferences
  ([
    /**
     * The free-form description of this connection profile.
     */
    ['description', ''],

    /**
     * The username.
     */
    ['username', ''],

    /**
     * The hostname or IP address.
     */
    ['hostname', ''],

    /**
     * The port, or null to use the default port.
     */
    ['port', null],

    /**
     * The relay host, hardcoded to use nassh.GoogleRelay at the moment.
     */
    ['relay-host', ''],

    /**
     * The optional relay port.
     */
    ['relay-port', ''],

    /**
     * Options string for relay.
     * Supported values: --use-xhr and --use-ssl.
     */
    ['relay-options', ''],

    /**
     * The private key file to use as the identity for this extension.
     *
     * Must be relative to the /.ssh/ directory.
     */
    ['identity', ''],

    /**
     * The argument string to pass to the ssh executable.
     *
     * Use '--' to separate ssh arguments from the target command/arguments.
     */
    ['argstr', ''],

    /**
     * The terminal profile to use for this connection.
     */
    ['terminal-profile', ''],

    /**
     * The appid to which to pass auth-agent requests.
     */
    ['auth-agent-appid', null],
   ]);
};

nassh.ProfilePreferenceManager.prototype = {
  __proto__: lib.PreferenceManager.prototype
};

nassh.ProfilePreferenceManager.prototype.readStorage = function(opt_callback) {
  var appendOption = (str) => {
    var options = this.get('relay-options');
    if (options) {
      options += ' ' + str;
    } else {
      options = str;
    }

    this.set('relay-option', options);
  };

  var onRead = () => {
    var host = this.get('relay-host');
    if (host) {
      console.warn('Merging relay-host preference with relay-options');
      this.reset('relay-host');
      appendOption('--proxy-host=' + host);
    }

    var port = this.get('relay-port');
    if (port) {
      this.reset('relay-port');
      console.warn('Merging relay-host preference with relay-options');
      appendOption('--proxy-port=' + port);
    }

    if (opt_callback)
      opt_callback();
  };

  lib.PreferenceManager.prototype.readStorage.call(this, onRead);
};
