
import { Params, ParamSet } from '../json';

/**
 * Add some params to a ParamSet.
 *
 * @param paramset - Key-value pairs where keys are strings and values are arrays of strings.
 * @param params - Key-value pairs where both keys and values are strings.
 * @param ignored - List of keys to ignore.
 */
export function add(paramset: ParamSet, params: Params, ignored: string[] = []): void {
  Object.keys(params).forEach((key) => {
    if (ignored.includes(key)) {
      return;
    }
    const value = params[key];
    const values = paramset[key] || [];
    if (!values.includes(value)) {
      values.push(value);
      paramset[key] = values;
    }
  });
}

/**
 * Determines if the params given match the ParamSet.
 *
 * @param paramset - Key-value pairs where keys are strings and values are arrays of strings
 *   or regexes (see skbug.com/9587).
 * @param params - Key-value pairs where both keys and values are strings.
 *
 * @return True if every key in ParamSet is present in 'params' and
 *   the value seen in params is in the ParamSet values or it matches one of
 *   the regexes.
 */
export function match(paramset: ParamSet, params: Params): boolean {
  const keys = Object.keys(paramset);
  for (let i = 0; i < keys.length; i++) {
    const key = keys[i];
    if (paramset[key]!.includes(params[key])) {
      continue;
    }
    const values = paramset[key] || [];
    let valMatched = false;
    for (let j = 0; j < values.length; j++) {
      const re = new RegExp(`^${values[j]}$`);
      if (re.test(params[key])) {
        valMatched = true;
        break;
      }
    }
    if (!valMatched) {
      return false;
    }
  }
  return true;
}
