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

export class ContextDetailBuilder {
  /**
   * @param {!Protocol.WebAudio.BaseAudioContext} context
   */
  constructor(context) {
    this._fragment = createDocumentFragment();
    this._container = createElementWithClass('div', 'context-detail-container');
    this._fragment.appendChild(this._container);
    this._build(context);
  }

  /**
   * @param {!Protocol.WebAudio.BaseAudioContext} context
   */
  _build(context) {
    const title = context.contextType === 'realtime' ? ls`AudioContext` : ls`OfflineAudioContext`;
    this._addTitle(title, context.contextId);
    this._addEntry(ls`State`, context.contextState);
    this._addEntry(ls`Sample Rate`, context.sampleRate, 'Hz');
    if (context.contextType === 'realtime') {
      this._addEntry(ls`Callback Buffer Size`, context.callbackBufferSize, 'frames');
    }
    this._addEntry(ls`Max Output Channels`, context.maxOutputChannelCount, 'ch');
  }

  /**
   * @param {string} title
   * @param {string} subtitle
   */
  _addTitle(title, subtitle) {
    this._container.appendChild(UI.html`
      <div class="context-detail-header">
        <div class="context-detail-title">${title}</div>
        <div class="context-detail-subtitle">${subtitle}</div>
      </div>
    `);
  }

  /**
   * @param {string} entry
   * @param {(string|number)} value
   * @param {string=} unit
   */
  _addEntry(entry, value, unit) {
    const valueWithUnit = value + (unit ? ` ${unit}` : '');
    this._container.appendChild(UI.html`
      <div class="context-detail-row">
        <div class="context-detail-row-entry">${entry}</div>
        <div class="context-detail-row-value">${valueWithUnit}</div>
      </div>
    `);
  }

  /**
   * @return {!DocumentFragment}
   */
  getFragment() {
    return this._fragment;
  }
}

export class AudioContextSummaryBuilder {
  /**
   * @param {!Protocol.WebAudio.GraphObjectId} contextId
   * @param {!Protocol.WebAudio.ContextRealtimeData} contextRealtimeData
   */
  constructor(contextId, contextRealtimeData) {
    const time = contextRealtimeData.currentTime.toFixed(3);
    const mean = (contextRealtimeData.callbackIntervalMean * 1000).toFixed(3);
    const stddev = (Math.sqrt(contextRealtimeData.callbackIntervalVariance) * 1000).toFixed(3);
    const capacity = (contextRealtimeData.renderCapacity * 100).toFixed(3);
    this._fragment = createDocumentFragment();
    this._fragment.appendChild(UI.html`
      <div class="context-summary-container">
        <span>${ls`Current Time`}: ${time} s</span>
        <span>\u2758</span>
        <span>${ls`Callback Interval`}: μ = ${mean} ms, σ = ${stddev} ms</span>
        <span>\u2758</span>
        <span>${ls`Render Capacity`}: ${capacity} %</span>
      </div>
    `);
  }

  /**
   * @return {!DocumentFragment}
   */
  getFragment() {
    return this._fragment;
  }
}

/* Legacy exported object */
self.WebAudio = self.WebAudio || {};

/* Legacy exported object */
WebAudio = WebAudio || {};

/**
 * @constructor
 */
WebAudio.ContextDetailBuilder = ContextDetailBuilder;

/**
 * @constructor
 */
WebAudio.AudioContextSummaryBuilder = AudioContextSummaryBuilder;
