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

/**
 * Javascript for local_discovery.html, served from chrome://devices/
 * This is used to show discoverable devices near the user.
 *
 * The simple object defined in this javascript file listens for
 * callbacks from the C++ code saying that a new device is available.
 */

cr.define('local_discovery', function() {
  'use strict';

  /**
   * Add a text TD to a TR.
   * @param {HTMLTableRowElement} row Row in table to be filled.
   * @param {string} text Text of TD.
   */
  function textTD(row, text) {
    var td = document.createElement('td');
    td.textContent = text;
    row.appendChild(td);
  }

  /**
   * Add a button TD to a TR.
   * @param {HTMLTableRowElement} row Row in table to be filled.
   * @param {string} text Text of button.
   * @param {function()} action Action to be taken when button is pressed.
   */
  function buttonTD(row, text, action) {
    var td = document.createElement('td');
    var button = document.createElement('button');
    button.textContent = text;
    button.addEventListener('click', action);
    td.appendChild(button);
    row.appendChild(td);
  }

  /**
   * Fill a table row from the provided information.
   * @param {HTMLTableRowElement} row Row in table to be filled.
   * @param {string} name Name of the device.
   * @param {Object} info Information about the device.
   */
  function fillRow(row, name, info) {
    textTD(row, name);
    textTD(row, info.domain);
    textTD(row, info.port);
    textTD(row, info.ip);
    textTD(row, info.lastSeen);

    if (!info.registered) {
      buttonTD(row, loadTimeData.getString('serviceRegister'),
               sendRegisterDevice.bind(null, name));
    } else {
      textTD(row, loadTimeData.getString('registered'));
    }

    buttonTD(row, loadTimeData.getString('serviceInfo'),
             sendInfoRequest.bind(null, name));
  }

  /**
   * Appends a row to the output table listing the new device.
   * @param {string} name Name of the device.
   * @param {string} info Additional info of the device, if empty device need to
   *                      be deleted.
   */
  function onServiceUpdate(name, info) {
    name = name.replace(/[\r\n]/g, '');
    var table = $('devices-table');

    for (var i = 0, row; row = table.rows[i]; i++) {
      if (row.cells[0].textContent == name) {
        if (!info) {
          // Delete service from the row.
          table.removeChild(row);
        } else {
          // Replace existing service.
          while (row.firstChild) {
            row.removeChild(row.firstChild);
          }

          fillRow(row, name, info);
          return;
        }
      }
    }

    if (!info) {
      // Service could not be found in the table.
      return;
    }

    // Row does not exist. Create it.
    var tr = document.createElement('tr');

    fillRow(tr, name, info);
    table.appendChild(tr);
  }

  /**
   * Adds a row to the logging console.
   * @param {string} msg The message to log.
   */
  function logToInfoConsole(msg) {
    var div = document.createElement('div');
    div.textContent = msg;
    $('info-console').appendChild(div);
  }

  /**
   * Register a device.
   * @param {string} device The device to register.
   */
  function sendRegisterDevice(device) {
    chrome.send('registerDevice', [device]);
    logToInfoConsole(loadTimeData.getStringF('registeringService', device));
  }

  /**
   * Announce that a registration failed.
   * @param {string} reason The error message.
   */
  function registrationFailed(reason) {
    logToInfoConsole(loadTimeData.getStringF('registrationFailed', reason));
  }

  /**
   * Request the contents of a device's /info page.
   * @param {string} device The device to query.
   */
  function sendInfoRequest(device) {
    chrome.send('info', [device]);
    logToInfoConsole(loadTimeData.getStringF('infoStarted', device));
  }

  /**
   * Announce that a registration succeeeded.
   * @param {string} id The id of the newly registered device.
   */
  function registrationSuccess(id) {
    logToInfoConsole(loadTimeData.getStringF('registrationSucceeded', id));
  }

  /**
   * Render an info item onto the info pane.
   * @param {string} name Name of the item.
   * @param {?} value Value of the item.
   * @param {function(?):string} render_type Render function for value
   *     datatype.
   * @return {HTMLElement} Rendered info item.
   */
  function renderInfoItem(name, value, render_type) {
    var container = document.createElement('div');
    container.classList.add('info-item');
    var nameElem = document.createElement('span');
    nameElem.classList.add('info-item-name');
    nameElem.textContent = name;
    container.appendChild(nameElem);
    var valueElem = document.createElement('span');
    valueElem.textContent = render_type(value);
    container.appendChild(valueElem);
    return container;
  }

  /**
   * Render and append an info item to the info pane, if it exists.
   * @param {Object} info Info response.
   * @param {string} name Name of property.
   * @param {function(?):string} render_type Render function for value.
   */
  function infoItem(info, name, render_type) {
    if (name in info) {
      $('info-pane').appendChild(renderInfoItem(name, info[name], render_type));
    }
  }

  /**
   * Render a string to an info-pane-displayable string.
   * @param {?} value Value; not guaranteed to be a string.
   * @return {string} Rendered value.
   */
  function renderTypeString(value) {
    if (typeof value != 'string') {
      return 'INVALID';
    }
    return value;
  }

  /**
   * Render a integer to an info-pane-displayable string.
   * @param {?} value Value; not guaranteed to be an integer.
   * @return {string} Rendered value.
   */
  function renderTypeInt(value) {
    if (typeof value != 'number') {
      return 'INVALID';
    }

    return value.toString();
  }

  /**
   * Render an array to an info-pane-displayable string.
   * @param {?} value Value; not guaranteed to be an array.
   * @return {string} Rendered value.
   */
  function renderTypeStringList(value) {
    if (!Array.isArray(value)) {
      return 'INVALID';
    }

    var returnValue = '';
    var valueLength = value.length;
    for (var i = 0; i < valueLength - 1; i++) {
      returnValue += value[i];
      returnValue += ', ';
    }

    if (value.length != 0) {
      returnValue += value[value.length - 1];
    }

    return returnValue;
  }

  /**
   * Render info response from JSON.
   * @param {Object} info Info response.
   */
  function renderInfo(info) {
    // Clear info
    while ($('info-pane').firstChild) {
      $('info-pane').removeChild($('info-pane').firstChild);
    }

    infoItem(info, 'x-privet-token', renderTypeString);
    infoItem(info, 'id', renderTypeString);
    infoItem(info, 'name', renderTypeString);
    infoItem(info, 'description', renderTypeString);
    infoItem(info, 'type', renderTypeStringList);
    infoItem(info, 'api', renderTypeStringList);
    infoItem(info, 'connection_state', renderTypeString);
    infoItem(info, 'device_state', renderTypeString);
    infoItem(info, 'manufacturer', renderTypeString);
    infoItem(info, 'url', renderTypeString);
    infoItem(info, 'model', renderTypeString);
    infoItem(info, 'serial_number', renderTypeString);
    infoItem(info, 'firmware', renderTypeString);
    infoItem(info, 'uptime', renderTypeInt);
    infoItem(info, 'setup_url', renderTypeString);
    infoItem(info, 'support_url', renderTypeString);
    infoItem(info, 'update_url', renderTypeString);
  }

  /**
   * Announce that an info request failed.
   * @param {string} reason The error message.
   */
  function infoFailed(reason) {
    logToInfoConsole(loadTimeData.getStringF('infoFailed', reason));
  }

  document.addEventListener('DOMContentLoaded', function() {
    chrome.send('start');
  });

  return {
    registrationSuccess: registrationSuccess,
    registrationFailed: registrationFailed,
    onServiceUpdate: onServiceUpdate,
    infoFailed: infoFailed,
    renderInfo: renderInfo
  };
});
