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

export default class FilterSuggestionBuilder {
  /**
   * @param {!Array<string>} keys
   * @param {function(string, !Array<string>)=} valueSorter
   */
  constructor(keys, valueSorter) {
    this._keys = keys;
    this._valueSorter = valueSorter || ((key, result) => result.sort());
    /** @type {!Map<string, !Set<string>>} */
    this._valuesMap = new Map();
  }

  /**
   * @param {string} expression
   * @param {string} prefix
   * @param {boolean=} force
   * @return {!Promise<!UI.SuggestBox.Suggestions>}
   */
  completions(expression, prefix, force) {
    if (!prefix && !force) {
      return Promise.resolve([]);
    }

    const negative = prefix.startsWith('-');
    if (negative) {
      prefix = prefix.substring(1);
    }
    const modifier = negative ? '-' : '';
    const valueDelimiterIndex = prefix.indexOf(':');

    const suggestions = [];
    if (valueDelimiterIndex === -1) {
      const matcher = new RegExp('^' + prefix.escapeForRegExp(), 'i');
      for (const key of this._keys) {
        if (matcher.test(key)) {
          suggestions.push({text: modifier + key + ':'});
        }
      }
    } else {
      const key = prefix.substring(0, valueDelimiterIndex).toLowerCase();
      const value = prefix.substring(valueDelimiterIndex + 1);
      const matcher = new RegExp('^' + value.escapeForRegExp(), 'i');
      const values = Array.from(this._valuesMap.get(key) || new Set());
      this._valueSorter(key, values);
      for (const item of values) {
        if (matcher.test(item) && (item !== value)) {
          suggestions.push({text: modifier + key + ':' + item});
        }
      }
    }
    return Promise.resolve(suggestions);
  }

  /**
   * @param {string} key
   * @param {?string=} value
   */
  addItem(key, value) {
    if (!value) {
      return;
    }

    if (!this._valuesMap.get(key)) {
      this._valuesMap.set(key, /** @type {!Set<string>} */ (new Set()));
    }
    this._valuesMap.get(key).add(value);
  }

  clear() {
    this._valuesMap.clear();
  }
}

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

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

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