import { getLabel } from '../plugin-common/output/label.js';
import { format as getName } from '@citation-js/name';
function getComparisonValue(obj, prop, label = prop === 'label') {
  let value = label ? getLabel(obj) : obj[prop];
  switch (prop) {
    case 'author':
    case 'editor':
      return value.map(name => name.literal || name.family || getName(name));
    case 'accessed':
    case 'issued':
      return value['date-parts'][0];
    case 'page':
      return value.split('-').map(num => parseInt(num));
    case 'edition':
    case 'issue':
    case 'volume':
      value = parseInt(value);
      return !isNaN(value) ? value : -Infinity;
    default:
      return value || -Infinity;
  }
}
function compareProp(entryA, entryB, prop, flip = /^!/.test(prop)) {
  prop = prop.replace(/^!/, '');
  const a = getComparisonValue(entryA, prop);
  const b = getComparisonValue(entryB, prop);
  return (flip ? -1 : 1) * (a > b ? 1 : a < b ? -1 : 0);
}
function getSortCallback(...props) {
  return (a, b) => {
    const keys = props.slice();
    let output = 0;
    while (!output && keys.length) {
      output = compareProp(a, b, keys.shift());
    }
    return output;
  };
}
function sort(method = [], log) {
  if (log) {
    this.save();
  }
  this.data.sort(typeof method === 'function' ? method : getSortCallback(...method, 'label'));
  return this;
}
export { sort };