Source: priceCheckOptions.js

export const ORDER_FILTER_KEYS = [
  'rank',
  'rankLt',
  'charges',
  'chargesLt',
  'amberStars',
  'amberStarsLt',
  'cyanStars',
  'cyanStarsLt',
  'subtype',
];

/**
 * @param {unknown} value - Rank value from query options
 * @returns {number|undefined}
 */
export function parseRankValue(value) {
  if (value === undefined || value === '') return undefined;
  const rank = Number(value);
  if (!Number.isInteger(rank) || rank < 0) return undefined;
  return rank;
}

/**
 * Resolve which mod ranks to price-check. `[undefined]` means no rank filter.
 * @param {Record<string, unknown>} [options={}] - Price check options
 * @returns {Array<number|undefined>}
 */
export function normalizePriceCheckRanks(options = {}) {
  if (Array.isArray(options.ranks) && options.ranks.length) {
    const parsed = options.ranks.map(parseRankValue).filter((rank) => rank !== undefined);
    if (parsed.length) {
      return [...new Set(parsed)].sort((a, b) => a - b);
    }
  }

  const single = parseRankValue(options.rank);
  if (single !== undefined) return [single];

  return [undefined];
}

/**
 * @param {Record<string, unknown>} [options={}] - Price check options
 * @returns {Record<string, unknown>}
 */
export function extractOrderFilters(options = {}) {
  /** @type {Record<string, unknown>} */
  const filters = {};

  ORDER_FILTER_KEYS.forEach((key) => {
    if (options[key] !== undefined) filters[key] = options[key];
  });

  return filters;
}

/**
 * @param {{ name: string }} summary - Market summary to label
 * @param {Record<string, unknown>} filters - Active order filters
 * @returns {{ name: string }}
 */
export function labelSummaryForFilters(summary, filters) {
  if (filters.rank !== undefined) {
    summary.name = `${summary.name} (R${filters.rank})`;
  } else if (filters.rankLt !== undefined) {
    summary.name = `${summary.name} (<R${filters.rankLt})`;
  }

  return summary;
}