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

/**
 * @typedef {{
 *     id: string,
 *     title: string,
 *     sortable: boolean,
 *     weight: (number|undefined),
 *     sortingFunction: (!function(!Media.EventNode, !Media.EventNode):number|undefined),
 * }}
 */
Media.EventDisplayColumnConfig;

/**
 * @typedef {{
 *     name: string,
 *     value: string,
 *     timestamp: (number|string|undefined)
 * }}
 */
Media.Event;

/**
 * @unrestricted
 */
Media.EventNode = class extends DataGrid.SortableDataGridNode {
  /**
   * @param {!Media.Event} event
   */
  constructor(event) {
    super(event, false);
  }

  /**
   * @override
   * @param {string} columnId
   * @return {!Element}
   */
  createCell(columnId) {
    const cell = this.createTD(columnId);
    const cellData = /** @type string */ (this.data[columnId]);
    cell.createTextChild(cellData);
    return cell;
  }

  /**
   * @override
   * @return {number}
   */
  nodeSelfHeight() {
    return 20;
  }
};

/**
 * @unrestricted
 */
Media.EventDisplayTable = class extends UI.VBox {
  /**
   * @param {!Array.<!Media.EventDisplayColumnConfig>} headerDescriptors
   * @param {?string=} uniqueColumn
   * @param {?string=} defaultSortingColumnId
   */
  constructor(headerDescriptors, uniqueColumn, defaultSortingColumnId) {
    super();

    // Set up element styles.
    this.registerRequiredCSS('media/eventDisplayTable.css');
    this.contentElement.classList.add('event-display-table-contents-table-container');

    this._uniqueColumnEntryKey = uniqueColumn;
    this._uniqueColumnMap = new Map();

    this._dataGrid = this._createDataGrid(headerDescriptors, defaultSortingColumnId);
    this._dataGrid.setStriped(true);
    this._dataGrid.asWidget().show(this.contentElement);
  }

  /**
   * @param {!Array.<!Media.EventDisplayColumnConfig>} headers
   * @param {?string|undefined} default_sort
   * @return !DataGrid.SortableDataGrid
   */
  _createDataGrid(headers, default_sort) {
    const gridColumnDescs = [];
    const sortFunctionMap = new Map();
    for (const headerDesc of headers) {
      gridColumnDescs.push(Media.EventDisplayTable._convertToGridDescriptor(headerDesc));
      if (headerDesc.sortable) {
        sortFunctionMap.set(headerDesc.id, headerDesc.sortingFunction);
        if (!default_sort) {
          default_sort = headerDesc.id;
        }
      }
    }

    const datagrid = new DataGrid.SortableDataGrid(gridColumnDescs);
    if (default_sort) {
      datagrid.sortNodes(sortFunctionMap.get(default_sort), !datagrid.isSortOrderAscending());

      function sortGrid() {
        const comparator = sortFunctionMap.get(datagrid.sortColumnId());
        datagrid.sortNodes(comparator, !datagrid.isSortOrderAscending());
      }

      datagrid.addEventListener(DataGrid.DataGrid.Events.SortingChanged, sortGrid);
    }
    datagrid.asWidget().contentElement.classList.add('no-border-top-datagrid');
    return datagrid;
  }

  /**
   * @param {!Array.<!Media.Event>} events
   */
  addEvents(events) {
    for (const event of events) {
      this.addEvent(event);
    }
  }

  /**
   * @param {!Media.Event} event
   */
  addEvent(event) {
    if (this._uniqueColumnEntryKey) {
      const eventValue = event[this._uniqueColumnEntryKey];
      if (this._uniqueColumnMap.has(eventValue)) {
        this._uniqueColumnMap.get(eventValue).data = event;
        return;
      }
    }
    const node = new Media.EventNode(event);
    this._dataGrid.rootNode().insertChildOrdered(node);
    if (this._uniqueColumnEntryKey) {
      this._uniqueColumnMap.set(event[this._uniqueColumnEntryKey], node);
    }
  }

  /**
   * @param {!Media.EventDisplayColumnConfig} columnConfig
   * @return {!DataGrid.DataGrid.ColumnDescriptor}
   */
  static _convertToGridDescriptor(columnConfig) {
    return /** @type {!DataGrid.DataGrid.ColumnDescriptor} */ ({
      id: columnConfig.id,
      title: columnConfig.title,
      sortable: columnConfig.sortable,
      weight: columnConfig.weight || 0,
      sort: DataGrid.DataGrid.Order.Ascending
    });
  }
};
