// Copyright 2017 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 {Iterable<T>}
 * @template T
 */
export default class ListModel extends Common.Object {
  /**
   * @param {!Array<T>=} items
   */
  constructor(items) {
    super();
    this._items = items || [];
  }

  /**
   * @return {!Iterator<T>}
   */
  [Symbol.iterator]() {
    return this._items[Symbol.iterator]();
  }

  /**
   * @return {number}
   */
  get length() {
    return this._items.length;
  }

  /**
   * @param {number} index
   * @return {T}
   */
  at(index) {
    return this._items[index];
  }

  /**
   * @param {function(T):boolean} callback
   * @return {boolean}
   */
  every(callback) {
    return this._items.every(callback);
  }

  /**
   * @param {function(T):boolean} callback
   * @return {!Array<T>}
   */
  filter(callback) {
    return this._items.filter(callback);
  }

  /**
   * @param {function(T):boolean} callback
   * @return {T|undefined}
   */
  find(callback) {
    return this._items.find(callback);
  }

  /**
   * @param {function(T):boolean} callback
   * @return {number}
   */
  findIndex(callback) {
    return this._items.findIndex(callback);
  }

  /**
   * @param {T} value
   * @param {number=} fromIndex
   * @return {number}
   */
  indexOf(value, fromIndex) {
    return this._items.indexOf(value, fromIndex);
  }

  /**
   * @param {number} index
   * @param {T} value
   */
  insert(index, value) {
    this._items.splice(index, 0, value);
    this._replaced(index, [], 1);
  }

  /**
   * @param {T} value
   * @param {function(T, T):number} comparator
   */
  insertWithComparator(value, comparator) {
    this.insert(this._items.lowerBound(value, comparator), value);
  }

  /**
   * @param {string=} separator
   * @return {string}
   */
  join(separator) {
    return this._items.join(separator);
  }

  /**
   * @param {number} index
   * @return {T}
   */
  remove(index) {
    const result = this._items[index];
    this._items.splice(index, 1);
    this._replaced(index, [result], 0);
    return result;
  }

  /**
   * @param {number} index
   * @param {T} value
   * @return {T}
   */
  replace(index, value) {
    const oldValue = this._items[index];
    this._items[index] = value;
    this._replaced(index, [oldValue], 1);
    return oldValue;
  }

  /**
   * @param {number} from
   * @param {number} to
   * @param {!Array<T>} items
   * @return {!Array<T>} removed
   */
  replaceRange(from, to, items) {
    let removed;
    if (items.length < 10000) {
      removed = this._items.splice(from, to - from, ...items);
    } else {
      removed = this._items.slice(from, to);
      // Splice may fail with too many arguments.
      const before = this._items.slice(0, from);
      const after = this._items.slice(to);
      this._items = [].concat(before, items, after);
    }
    this._replaced(from, removed, items.length);
    return removed;
  }

  /**
   * @param {!Array<T>} items
   * @return {!Array<T>}
   */
  replaceAll(items) {
    const oldItems = this._items.slice();
    this._items = items;
    this._replaced(0, oldItems, items.length);
    return oldItems;
  }

  /**
   * @param {number=} from
   * @param {number=} to
   * @return {!Array<T>}
   */
  slice(from, to) {
    return this._items.slice(from, to);
  }

  /**
   * @param {function(T):boolean} callback
   * @return {boolean}
   */
  some(callback) {
    return this._items.some(callback);
  }

  /**
   * @param {number} index
   * @param {!Array<T>} removed
   * @param {number} inserted
   */
  _replaced(index, removed, inserted) {
    this.dispatchEventToListeners(Events.ItemsReplaced, {index: index, removed: removed, inserted: inserted});
  }
}

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

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

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

/** @constructor */
UI.ListModel = ListModel;

/** @enum {symbol} */
UI.ListModel.Events = Events;
