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

/**
 * @fileoverview
 * Class handling creation and teardown of a remoting host session.
 *
 * This abstracts a <embed> element and controls the plugin which does the
 * actual remoting work.  There should be no UI code inside this class.  It
 * should be purely thought of as a controller of sorts.
 */

'use strict';

/** @suppress {duplicate} */
var remoting = remoting || {};

/**
 * @constructor
 */
remoting.HostSession = function() {
  /** @type {remoting.HostIt2MeDispatcher} @private */
  this.hostDispatcher_ = null;
};

// Note that these values are copied directly from host_script_object.h and
// must be kept in sync.
/** @enum {number} */
remoting.HostSession.State = {
  UNKNOWN: -1,
  DISCONNECTED: 0,
  STARTING: 1,
  REQUESTED_ACCESS_CODE: 2,
  RECEIVED_ACCESS_CODE: 3,
  CONNECTED: 4,
  DISCONNECTING: 5,
  ERROR: 6,
  INVALID_DOMAIN_ERROR: 7
};

/**
 * @param {string} stateString The string representation of the host state.
 * @return {remoting.HostSession.State} The HostSession.State enum value
 *     corresponding to stateString.
 */
remoting.HostSession.State.fromString = function(stateString) {
  if (!remoting.HostSession.State.hasOwnProperty(stateString)) {
    console.error('Unexpected HostSession.State string: ', stateString);
    return remoting.HostSession.State.UNKNOWN;
  }
  return remoting.HostSession.State[stateString];
}

/**
 * Initiates a connection.
 * @param {remoting.HostIt2MeDispatcher}  hostDispatcher It2Me host dispatcher
 *     to use.
 * @param {string} email The user's email address.
 * @param {string} accessToken A valid OAuth2 access token.
 * @param {function(remoting.HostSession.State):void} onStateChanged
 *     Callback for notifications of changes to the host plugin's state.
 * @param {function(boolean):void} onNatTraversalPolicyChanged Callback
 *     for notification of changes to the NAT traversal policy.
 * @param {function(string):void} logDebugInfo Callback allowing the plugin
 *     to log messages to the debug log.
 * @param {function():void} onError Callback to invoke in case of an error.
 */
remoting.HostSession.prototype.connect =
    function(hostDispatcher, email, accessToken, onStateChanged,
             onNatTraversalPolicyChanged, logDebugInfo, onError) {
  /** @private */
  this.hostDispatcher_ = hostDispatcher;

  this.hostDispatcher_.connect(
      email, 'oauth2:' + accessToken,
      onStateChanged, onNatTraversalPolicyChanged, logDebugInfo,
      remoting.settings.XMPP_SERVER_ADDRESS,
      remoting.settings.XMPP_SERVER_USE_TLS,
      remoting.settings.DIRECTORY_BOT_JID,
      onError);
};

/**
 * Get the access code generated by the it2me host. Valid only after the
 * host state is RECEIVED_ACCESS_CODE.
 * @return {string} The access code.
 */
remoting.HostSession.prototype.getAccessCode = function() {
  return this.hostDispatcher_.getAccessCode();
};

/**
 * Get the lifetime for the access code. Valid only after the host state is
 * RECEIVED_ACCESS_CODE.
 * @return {number} The access code lifetime, in seconds.
 */
remoting.HostSession.prototype.getAccessCodeLifetime = function() {
  return this.hostDispatcher_.getAccessCodeLifetime();
};

/**
 * Get the email address of the connected client. Valid only after the plugin
 * state is CONNECTED.
 * @return {string} The client's email address.
 */
remoting.HostSession.prototype.getClient = function() {
  return this.hostDispatcher_.getClient();
};

/**
 * Disconnect the it2me session.
 * @return {void} Nothing.
 */
remoting.HostSession.prototype.disconnect = function() {
  this.hostDispatcher_.disconnect();
};
