package games.strategy.triplea.attachments;
import java.util.Comparator;
import games.strategy.engine.data.UnitType;
import games.strategy.triplea.delegate.Matches;
public class UnitTypeComparator implements Comparator<UnitType> {
@Override
public int compare(final UnitType o1, final UnitType o2) {
final UnitType u1 = o1;
final UnitType u2 = o2;
final UnitAttachment ua1 = UnitAttachment.get(u1);
final UnitAttachment ua2 = UnitAttachment.get(u2);
if (ua1 == null) {
throw new IllegalStateException("No unit type attachment for unit type : " + u1.getName());
}
if (ua2 == null) {
throw new IllegalStateException("No unit type attachment for unit type : " + u2.getName());
}
if (ua1.getIsInfrastructure() && !ua2.getIsInfrastructure()) {
return 1;
}
if (ua2.getIsInfrastructure() && !ua1.getIsInfrastructure()) {
return -1;
}
if (Matches.UnitTypeIsAAforAnything.match(u1) && !Matches.UnitTypeIsAAforAnything.match(u2)) {
return 1;
}
if (!Matches.UnitTypeIsAAforAnything.match(u1) && Matches.UnitTypeIsAAforAnything.match(u2)) {
return -1;
}
if (ua1.getIsAir() && !ua2.getIsAir()) {
return 1;
}
if (ua2.getIsAir() && !ua1.getIsAir()) {
return -1;
}
if (ua1.getIsSea() && !ua2.getIsSea()) {
return 1;
}
if (ua2.getIsSea() && !ua1.getIsSea()) {
return -1;
}
if (ua1.getRawAttack() != ua2.getRawAttack()) {
return ua1.getRawAttack() - ua2.getRawAttack();
}
return u1.getName().compareTo(u2.getName());
}
}