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

/**
 * @implements {UI.SoftDropDown.Delegate<!Protocol.WebAudio.BaseAudioContext>}
 */
export class AudioContextSelector extends Common.Object {
  constructor() {
    super();

    /** @type {string} */
    this._placeholderText = ls`(no recordings)`;

    /** @type {!UI.ListModel<!Protocol.WebAudio.BaseAudioContext>} */
    this._items = new UI.ListModel();

    /** @type {!UI.SoftDropDown<!Protocol.WebAudio.BaseAudioContext>} */
    this._dropDown = new UI.SoftDropDown(this._items, this);
    this._dropDown.setPlaceholderText(this._placeholderText);

    this._toolbarItem = new UI.ToolbarItem(this._dropDown.element);
    this._toolbarItem.setEnabled(false);
    this._toolbarItem.setTitle(ls`Audio context: ${this._placeholderText}`);
    this._items.addEventListener(UI.ListModel.Events.ItemsReplaced, this._onListItemReplaced, this);
    this._toolbarItem.element.classList.add('toolbar-has-dropdown');

    /** @type {?Protocol.WebAudio.BaseAudioContext} */
    this._selectedContext = null;
  }

  _onListItemReplaced() {
    const hasItems = !!this._items.length;
    this._toolbarItem.setEnabled(hasItems);
    if (!hasItems) {
      this._toolbarItem.setTitle(ls`Audio context: ${this._placeholderText}`);
    }
  }

  /**
   * @param {!Common.Event} event
   */
  contextCreated(event) {
    const context = /** @type {!Protocol.WebAudio.BaseAudioContext} */ (event.data);
    this._items.insert(this._items.length, context);

    // Select if this is the first item.
    if (this._items.length === 1) {
      this._dropDown.selectItem(context);
    }
  }

  /**
   * @param {!Common.Event} event
   */
  contextDestroyed(event) {
    const contextId = /** @type {!Protocol.WebAudio.GraphObjectId} */ (event.data);
    const contextIndex = this._items.findIndex(context => context.contextId === contextId);
    if (contextIndex > -1) {
      this._items.remove(contextIndex);
    }
  }

  /**
   * @param {!Common.Event} event
   */
  contextChanged(event) {
    const changedContext = /** @type {!Protocol.WebAudio.BaseAudioContext} */ (event.data);
    const contextIndex = this._items.findIndex(context => context.contextId === changedContext.contextId);
    if (contextIndex > -1) {
      this._items.replace(contextIndex, changedContext);

      // If the changed context is currently selected by user. Re-select it
      // because the actual element is replaced with a new one.
      if (this._selectedContext && this._selectedContext.contextId === changedContext.contextId) {
        this._dropDown.selectItem(changedContext);
      }
    }
  }

  /**
   * @override
   * @param {!Protocol.WebAudio.BaseAudioContext} item
   * @return {!Element}
   */
  createElementForItem(item) {
    const element = createElementWithClass('div');
    const shadowRoot = UI.createShadowRootWithCoreStyles(element, 'web_audio/audioContextSelector.css');
    const title = shadowRoot.createChild('div', 'title');
    title.createTextChild(this.titleFor(item).trimEndWithMaxLength(100));
    return element;
  }

  /**
   * @return {?Protocol.WebAudio.BaseAudioContext}
   */
  selectedContext() {
    if (!this._selectedContext) {
      return null;
    }

    return this._selectedContext;
  }

  /**
   * @override
   * @param {?Protocol.WebAudio.BaseAudioContext} from
   * @param {?Protocol.WebAudio.BaseAudioContext} to
   * @param {?Element} fromElement
   * @param {?Element} toElement
   */
  highlightedItemChanged(from, to, fromElement, toElement) {
    if (fromElement) {
      fromElement.classList.remove('highlighted');
    }
    if (toElement) {
      toElement.classList.add('highlighted');
    }
  }

  /**
   * @override
   * @param {!Protocol.WebAudio.BaseAudioContext} item
   * @return {boolean}
   */
  isItemSelectable(item) {
    return true;
  }

  /**
   * @override
   * @param {?Protocol.WebAudio.BaseAudioContext} item
   */
  itemSelected(item) {
    if (!item) {
      return;
    }

    // It's possible that no context is selected yet.
    if (!this._selectedContext || this._selectedContext.contextId !== item.contextId) {
      this._selectedContext = item;
      this._toolbarItem.setTitle(ls`Audio context: ${this.titleFor(item)}`);
    }

    this.dispatchEventToListeners(WebAudio.AudioContextSelector.Events.ContextSelected, item);
  }

  reset() {
    this._items.replaceAll([]);
  }

  /**
   * @override
   * @param {!Protocol.WebAudio.BaseAudioContext} context
   * @return {string}
   */
  titleFor(context) {
    return `${context.contextType} (${context.contextId.substr(-6)})`;
  }

  /**
   * @return {!UI.ToolbarItem}
   */
  toolbarItem() {
    return this._toolbarItem;
  }
}

/** @enum {symbol} */
export const Events = {
  ContextSelected: Symbol('ContextSelected')
};

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

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

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

/** @enum {symbol} */
WebAudio.AudioContextSelector.Events = Events;
