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

/**
 * Debug information about an active copresence directive.
 * @typedef {{
 *   type: string,
 *   medium: string,
 *   duration: string
 * }}
 */
var Directive;

/**
 * Debug information about a recent copresence token.
 * @typedef {{
 *   id: string,
 *   statuses: string,
 *   medium: string,
 *   time: string
 * }}
 */
var Token;

/**
 * Callback to refresh the list of directives.
 * @param {Array<Directive>} directives
 */
function refreshDirectives(directives) {
  var table = $('directives-table').tBodies[0];

  // Fix the directives table to have the correct number of rows.
  while (table.rows.length < directives.length)
    table.insertRow();
  while (table.rows.length > directives.length)
    table.deleteRow();

  // Populate the directives into the table.
  directives.forEach(function(directive, index) {
    var row = table.rows.item(index);
    while (row.cells.length < 3)
      row.insertCell();

    row.cells.item(0).textContent = directive.type;
    row.cells.item(1).textContent = directive.medium;
    row.cells.item(2).textContent = directive.duration;
  });
}

/**
 * Callback to add or update transmitted tokens.
 * @param {Token} token
 */
function updateTransmittedToken(token) {
  updateTokenTable($('transmitted-tokens-table'), token);
}

/**
 * Callback to add or update received tokens.
 * @param {Token} token
 */
function updateReceivedToken(token) {
  updateTokenTable($('received-tokens-table'), token);
}

/**
 * Callback to clear out the token tables.
 */
function clearTokens() {
  clearTable($('transmitted-tokens-table'));
  clearTable($('received-tokens-table'));
}

/**
 * Add or update a token in the specified table.
 * @param {HTMLTableElement} table
 * @param {Token} token
 */
function updateTokenTable(table, token) {
  var rows = table.tBodies[0].rows;

  var index;
  for (index = 0; index < rows.length; index++) {
    var row = rows.item(index);
    if (row.cells[0].textContent == token.id) {
      updateTokenRow(row, token);
      break;
    }
  }

  if (index == rows.length)
    updateTokenRow(table.tBodies[0].insertRow(), token);
}

/**
 * Update a token on the specified row.
 * @param {HTMLTableRowElement} row
 * @param {Token} token
 */
function updateTokenRow(row, token) {
  while (row.cells.length < 4)
    row.insertCell();
  row.className = token.statuses;

  row.cells[0].textContent = token.id;
  row.cells[1].textContent =
      token.statuses.replace('confirmed', '(Confirmed)');
  row.cells[2].textContent = token.medium;
  row.cells[3].textContent = token.time;
}

/**
 * Delete all the rows in a table.
 * @param {HTMLTableElement} table
 */
function clearTable(table) {
  var body = table.tBodies[0];
  while (body.rows.length > 0)
    body.deleteRow();
}

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

  $('reset-button').addEventListener('click', function() {
    if (confirm(loadTimeData.getString('confirm_delete')))
      chrome.send('clearCopresenceState');
  });
});