package org.atlasapi.persistence.media.entity;
import com.google.common.base.Optional;
import com.google.common.collect.Lists;
import com.metabroadcast.common.persistence.translator.TranslatorUtils;
import com.mongodb.BasicDBObject;
import com.mongodb.DBObject;
import org.atlasapi.media.entity.Described;
import org.atlasapi.media.entity.Priority;
import org.atlasapi.media.entity.PriorityScoreReasons;
import java.util.Iterator;
import java.util.ArrayList;
import java.util.List;
public class PriorityTranslator {
private static final String SCORE_KEY = "score";
private static final String REASONS_KEY = "reasons";
private static final String POSITIVE_REASONS_KEY = "positive";
private static final String NEGATIVE_REASONS_KEY = "negative";
private static final String ITEM_PRIORITY_KEY = "priority";
public Priority getPriority(DBObject dbObject) {
Double score = null;
List<String> positiveScoreReasons = Lists.newArrayList();
List<String> negativeScoreReasons = Lists.newArrayList();
try {
score = TranslatorUtils.toDouble(dbObject, ITEM_PRIORITY_KEY);
} catch (ClassCastException e) {
DBObject priority = TranslatorUtils.toDBObject(dbObject, ITEM_PRIORITY_KEY);
score = TranslatorUtils.toDouble(priority, SCORE_KEY);
DBObject priorityReasons = TranslatorUtils.toDBObject(priority, REASONS_KEY);
positiveScoreReasons = getPositivePriorityScoreReasonsFromDB(priorityReasons);
negativeScoreReasons = getNegativePriorityScoreReasonsFromDB(priorityReasons);
}
PriorityScoreReasons priorityScoreReasons = new PriorityScoreReasons(positiveScoreReasons, negativeScoreReasons);
return new Priority(score, priorityScoreReasons);
}
public void setPriority(DBObject dbObject, Described entity) {
TranslatorUtils.from(dbObject, ITEM_PRIORITY_KEY, getPriorityDBObject(entity));
}
public DBObject getPriorityDBObject(Described entity) {
DBObject dbObject = new BasicDBObject();
TranslatorUtils.from(dbObject, SCORE_KEY, entity.getPriority().getScore());
DBObject scoreReasons = new BasicDBObject();
TranslatorUtils.fromIterable(scoreReasons, entity.getPriority().getReasons().getPositive(),
POSITIVE_REASONS_KEY);
TranslatorUtils.fromIterable(scoreReasons, entity.getPriority().getReasons().getNegative(),
NEGATIVE_REASONS_KEY);
dbObject.put(REASONS_KEY, scoreReasons);
return dbObject;
}
public List<String> getPositivePriorityScoreReasonsFromDB(DBObject priorityReasons) {
List<String> positiveScoreReasons = Lists.newArrayList();
Optional<List<String>> positiveReasons = Optional.of(TranslatorUtils
.toList(priorityReasons, POSITIVE_REASONS_KEY));
if (positiveReasons.isPresent()) {
Iterator<String> positiveReasonsIterator = positiveReasons.get().iterator();
while (positiveReasonsIterator.hasNext()) {
positiveScoreReasons.add(positiveReasonsIterator.next());
}
return positiveScoreReasons;
} else {
return positiveScoreReasons;
}
}
public List<String> getNegativePriorityScoreReasonsFromDB(DBObject priorityReasons) {
List<String> negativeScoreReasons = Lists.newArrayList();
Optional<List<String>> negativeReasons = Optional.of(TranslatorUtils
.toList(priorityReasons, NEGATIVE_REASONS_KEY));
if (negativeReasons.isPresent()) {
Iterator<String> negativeReasonsIterator = negativeReasons.get().iterator();
while (negativeReasonsIterator.hasNext()) {
negativeScoreReasons.add(negativeReasonsIterator.next());
}
return negativeScoreReasons;
} else {
return negativeScoreReasons;
}
}
}