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

/*
 * Home action displays the Home page. Home could be status or publish view
 * depending on the state of the P2B service.
 * @fileoverview
 */

import { Logger } from 'libs/logs/logger'
import { register, trigger } from 'libs/mvc/actions'

import { publish, stopPublishing, state as publishState } from 'services/pipe-to-browser-server'

import { displayError } from 'actions/display-error'
import { addPipeViewer } from 'actions/add-pipe-viewer'

import { PublishView } from 'views/publish/view'
import { StatusView } from 'views/status/view'

import { page } from 'runtime/context'

var log = new Logger('actions/navigate-home-page');
var ACTION_NAME = 'home';

/*
 * Registers the home action
 */
export function registerNavigateHomePageAction() {
  register(ACTION_NAME, actionHandler);
}

/*
 * Triggers the home action
 */
export function navigateHomePage() {
  return trigger(ACTION_NAME);
}

/*
 * Handles the home action.
 *
 * @private
 */
function actionHandler() {
  log.debug('home action triggered');

  var mainView;

  // Show status view if already published, otherwise show publish view
  if (publishState.published) {
    showStatusView();
  } else {
    showPublishView();
  }
}

/*
 * Displays the Status view
 *
 * @private
 */
function showStatusView() {
  // Create a status view  and bind (dynamic) publish state with the view
  var statusView = new StatusView(publishState);

  // Stop when user tells us to stop the service
  statusView.onStopAction(() => {
    stopPublishing().then(function() {
      navigateHomePage();
    }).catch((e) => { displayError(e); });
  });

  // Display the status view in main content area and select the sidebar item
  page.title = 'Status';
  page.setSubPageView('home', statusView);
}

/*
 * Displays the Publish view
 *
 * @private
 */
function showPublishView() {
  // Create a publish view
  var publishView = new PublishView();

  // Publish p2b when user tells us to do so and then show status page.
  publishView.onPublishAction((publishName) => {
    publish(publishName, pipeRequestHandler).then(function() {
      showStatusView();
    }).catch((e) => { displayError(e); });
  });

  // Display the publish view in main content area and select the sidebar item
  page.title = 'Publish';
  page.setSubPageView('home', publishView);
}

/*
 * pipeRequestHandler is called by the p2b service whenever a new request comes in.
 * We simply delegate to the addPipeViewer action.
 * @param {string} name Name of the Pipe Viewer that is requested to play the stream.
 * @param {Vanadium.Stream} stream Stream of bytes from the p2b client.
 *
 * @private
 */
function pipeRequestHandler(name, stream) {
  return addPipeViewer(name, stream);
}
