/* This file is a part of @mdn/browser-compat-data
 * See LICENSE file for more information. */

/**
 * Sort a list of features based upon a specific order:
 * 1. '__compat'
 * 2. Alphanumerical features starting with an uppercase letter (without symbols aside from - or _)
 * 3. 'secure_context_required'
 * 4. 'worker_support'
 * 5. Alphanumerical features starting with a lowercase letter (without symbols aside from - or _)
 * 6. All other features
 * @param a - The name of the first object to perform comparison with
 * @param b - The name of the second object to perform comparison with
 * @returns Result of localeCompare
 */
const compareFeatures = (a: string, b: string): number => {
  if (a == '__compat') {
    return -1;
  }
  if (b == '__compat') {
    return 1;
  }

  const capsWordA = /^[A-Z](\w|-)*$/.test(a);
  const capsWordB = /^[A-Z](\w|-)*$/.test(b);
  const wordA = /^[a-zA-Z](\w|-)*$/.test(a);
  const wordB = /^[a-zA-Z](\w|-)*$/.test(b);

  if (wordA || wordB) {
    if (capsWordA || capsWordB) {
      if (capsWordA && capsWordB) {
        return a.localeCompare(b, 'en');
      }
      if (capsWordA) {
        return -1;
      }
      if (capsWordB) {
        return 1;
      }
    }

    if (a == 'secure_context_required') {
      return -1;
    }
    if (b == 'secure_context_required') {
      return 1;
    }

    if (a == 'worker_support') {
      return -1;
    }
    if (b == 'worker_support') {
      return 1;
    }

    if (wordA && wordB) {
      return a.localeCompare(b, 'en');
    }
    if (wordA) {
      return -1;
    }
    return 1;
  }
  return a.localeCompare(b, 'en');
};

export default compareFeatures;
