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

/**
 * @unrestricted
 */
Media.MediaPlayerPropertiesRenderer = class extends Media.EventDisplayTable {
  constructor() {
    super(
        [
          {
            id: 'name',
            title: 'Property Name',
            sortable: true,
            weight: 2,
            sortingFunction: DataGrid.SortableDataGrid.StringComparator.bind(null, 'name')
          },
          {id: 'value', title: 'Value', sortable: false, weight: 7}
        ],
        'name');
  }

  /**
   * @param {string} playerID
   * @param {!Array.<!Media.Event>} changes
   * @param {!Media.MediaModel.MediaChangeTypeKeys} change_type
   */
  renderChanges(playerID, changes, change_type) {
    this.addEvents(changes);
  }
};

/**
 * @unrestricted
 */
Media.MediaPlayerEventTableRenderer = class extends Media.EventDisplayTable {
  constructor() {
    super([
      {
        id: 'timestamp',
        title: 'Timestamp',
        weight: 1,
        sortable: true,
        sortingFunction: DataGrid.SortableDataGrid.NumericComparator.bind(null, 'timestamp')
      },
      {id: 'name', title: 'Event Name', weight: 2, sortable: false},
      {id: 'value', title: 'Value', weight: 7, sortable: false}
    ]);

    this._firstEventTime = 0;
  }

  /**
   * @param {string} playerID
   * @param {!Array.<!Media.Event>} changes
   * @param {!Media.MediaModel.MediaChangeTypeKeys} change_type
   */
  renderChanges(playerID, changes, change_type) {
    if (this._firstEventTime === 0 && changes.length > 0) {
      this._firstEventTime = changes[0].timestamp;
    }

    this.addEvents(changes.map(this._subtractFirstEventTime.bind(this, this._firstEventTime)));
  }

  /**
   * @param {number|string|undefined} first_event_time
   * @param {!Media.Event} event
   */
  _subtractFirstEventTime(first_event_time, event) {
    event.timestamp = (event.timestamp - first_event_time).toFixed(3);
    return event;
  }
};
