package topasin.compare;
import java.text.DecimalFormat;
import topasin.util.AsinDetail;
import topasin.util.AsinFields;
import topasin.util.TopAsinContext;
import topasin.util.TopAsinUtil;
/**
* compare top asin use (total unhealthy * cost used for calculations)
*
* @author mengzang
*
*/
public final strictfp class StandardOIHComparable implements AsinComparable {
private static int TOTAL_UNHEALTH_QTY = AsinFields.TotalUnhealthyQuantity.getIndex();
private static int COST4REPORT = AsinFields.CostUsedForReporting.getIndex();
public static void initStandardOIHComparable() {
AsinDetail.addNeededFields(AsinFields.TotalUnhealthyQuantity.getName(),
AsinFields.CostUsedForReporting.getName());
}
private double compareValueOrig = TopAsinSelectionOptionHelper.NULL_VALUE;
private double compareValueNew = TopAsinSelectionOptionHelper.NULL_VALUE;
@Override
public void fillCompareFields(AsinDetail asinDetail, int source) {
if (TopAsinContext.ORIG_SOURCE == source) {
compareValueOrig = asinDetail.getDoubleFieldValue(TOTAL_UNHEALTH_QTY)
* asinDetail.getDoubleFieldValue(COST4REPORT);
} else if (TopAsinContext.NEW_SOURCE == source) {
compareValueNew = asinDetail.getDoubleFieldValue(TOTAL_UNHEALTH_QTY)
* asinDetail.getDoubleFieldValue(COST4REPORT);
}
}
@Override
public boolean isValidAsinForTopAsin() {
return TopAsinSelectionOptionHelper.applyTopAsinSelectionOption(compareValueOrig, compareValueNew);
}
private double getCompareDiff() {
double diff = 0;
boolean hasNew = compareValueNew > TopAsinSelectionOptionHelper.INVALID_VALUE;
boolean hasOrig = compareValueOrig > TopAsinSelectionOptionHelper.INVALID_VALUE;
if (hasNew == true && hasOrig == true) {
// in both
diff = compareValueNew - compareValueOrig;
} else if (hasNew == true && hasOrig == false) {
// only in new
diff = compareValueNew - 0;
} else if (hasNew == false && hasOrig == true) {
// only in orig
diff = 0 - compareValueOrig;
}
return diff;
}
private double getCompareDiffAbs() {
return Math.abs(getCompareDiff());
}
@Override
public int compareForTopAsin(AsinComparable asin) {
return compareDiff((StandardOIHComparable) asin);
}
/**
* desc order
*/
@Override
public int compareForOutputSort(AsinComparable asin) {
return -1 * compareDiff((StandardOIHComparable) asin);
}
private int compareDiff(StandardOIHComparable asin) {
if (asin == null) {
return 1;
}
return TopAsinUtil.moneyCompare(getCompareDiffAbs(), asin.getCompareDiffAbs());
}
@Override
public String getCompareDiffDisplayValue() {
return getFormattedDouble(getCompareDiff());
}
@Override
public String getCompareOrigDisplayValue() {
if (compareValueOrig < TopAsinSelectionOptionHelper.INVALID_VALUE) {
return "N/A";
}
return getFormattedDouble(this.compareValueOrig);
}
@Override
public String getCompareNewDisplayValue() {
if (compareValueNew < TopAsinSelectionOptionHelper.INVALID_VALUE) {
return "N/A";
}
return getFormattedDouble(this.compareValueNew);
}
private String getFormattedDouble(double value) {
DecimalFormat moneyValueFormat = new DecimalFormat("0.000");
String ret = moneyValueFormat.format(value);
// somehow on FR prod host 12003, the result using ',' for '.'
if (ret.indexOf(',') >= 0) {
ret = ret.replace(',', '.');
}
return ret;
}
}