package haven;
import java.util.Comparator;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class WItemComparator implements Comparator<WItem> {
static final Pattern count_patt = Pattern.compile("([0-9]*\\.?[0-9]+)");
public static final Comparator<WItem> cmp_stats_asc = new WItemComparator();
public static final Comparator<WItem> cmp_stats_desc = new WItemComparator(){
@Override
public int compare(WItem o1, WItem o2) {
return super.compare(o2, o1);
}
};
public static final Comparator<WItem> sort = new Comparator<WItem>() {
@Override
public int compare(WItem o1, WItem o2) {
String n1 = o1.item.name();
String n2 = o2.item.name();
try {
if(n1 == null || n2 == null) {
throw new Loading();
}
int k = n1.compareTo(n2);
if(k == 0) {
n1 = o1.item.resname();
n2 = o2.item.resname();
if(n1 == null || n2 == null) {
throw new Loading();
}
k = n1.compareTo(n2);
if(k == 0) {
return cmp_stats_desc.compare(o1, o2);
}
return k;
}
return k;
}catch(Resource.Loading e){
throw new Loading();
}
}
};
@Override
public int compare(WItem o1, WItem o2) {
int carats = carats(o1, o2);
if(carats == 0) {
int alchemy = alchemy(o1, o2);
if(alchemy == 0){
return number(o1, o2);
} else {
return alchemy;
}
} else {
return carats;
}
}
protected int alchemy(WItem o1, WItem o2) {
Alchemy a = o1.alch.get();
double q1 = (a == null) ? 0 : a.purity();
a = o2.alch.get();
double q2 = (a == null) ? 0 : a.purity();
if(q1 == q2) {
return 0;
} else if(q1 > q2) {
return 1;
} else {
return -1;
}
}
protected int carats(WItem o1, WItem o2) {
Float c1 = (o1 != null && o1.carats != null)?o1.carats.get():null;
Float c2 = (o2 != null && o2.carats != null)?o2.carats.get():null;
if(c1 == null){c1 = 0f;}
if(c2 == null){c2 = 0f;}
if(c1 > c2){
return 1;
} else if(c2 > c1){
return -1;
} else {
return 0;
}
}
protected int number(WItem o1, WItem o2) {
float n1 = getCount(o1);
float n2 = getCount(o2);
if(n1 > n2){
return 1;
} else if(n2 > n1){
return -1;
} else {
return 0;
}
}
protected float getCount(WItem wItem) {
float num = wItem.item.num;
try {
if (num < 0) {
GItem.NumberInfo ninf = ItemInfo.find(GItem.NumberInfo.class, wItem.item.info());
if (ninf != null) {
num = ninf.itemnum();
} else {
String snum = ItemInfo.getCount(wItem.item.info());
if (snum != null) {
Matcher m = count_patt.matcher(snum);
if (m.find()) {
num = Float.parseFloat(m.group(1));
}
}
}
}
} catch(Exception ignore){}
return num;
}
}