package mekhq.gui.sorter;
import java.util.Comparator;
import java.util.UUID;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import mekhq.MekHQ;
import mekhq.campaign.Campaign;
import mekhq.campaign.personnel.Person;
import mekhq.campaign.personnel.Ranks;
/**
* A comparator for ranks written as strings with "-" sorted to the bottom always
* @author Jay Lawson
*
*/
public class RankSorter implements Comparator<String> {
private Campaign campaign;
private Pattern pattern;
private Matcher matcher;
public RankSorter(Campaign c) {
campaign = c;
c.getRanks();
pattern = Pattern.compile("id=\"([^\"]+)\""); //$NON-NLS-1$
}
@Override
public int compare(String s0, String s1) {
// get the numbers associated with each rank string, and compare
matcher = pattern.matcher(s0);
matcher.find();
String s00 = matcher.group(1);
matcher = pattern.matcher(s1);
matcher.find();
String s11 = matcher.group(1);
try {
Person p0 = campaign.getPerson(UUID.fromString(s00));
Person p1 = campaign.getPerson(UUID.fromString(s11));
// the rank orders match, try comparing the levels
if (p0.getRankNumeric() == p1.getRankNumeric()) {
// For prisoners: Sort those willing to defect "above" those who don't
if(p0.getRankNumeric() == Ranks.RANK_PRISONER) {
return Boolean.compare(p0.isWillingToDefect(), p1.isWillingToDefect());
}
// the levels match too, try comparing MD rank
if (p0.getRankLevel() == p1.getRankLevel()) {
if(p0.getManeiDominiRank() == p1.getManeiDominiRank()) {
return s0.compareTo(s1);
}
return Integer.compare(p0.getManeiDominiRank(), p1.getManeiDominiRank());
}
return Integer.compare(p0.getRankLevel(), p1.getRankLevel());
}
return Integer.compare(p0.getRankNumeric(), p1.getRankNumeric());
} catch (Exception e) {
MekHQ.logError(String.format("[DEBUG] RankSorter Exception, s0: %s, s1: %s", s00, s11)); //$NON-NLS-1$
e.printStackTrace();
return 0;
}
}
}