package qa.qcri.aidr.trainer.api.template;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import org.apache.log4j.Logger;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import qa.qcri.aidr.dbmanager.dto.CollectionDTO;
import qa.qcri.aidr.dbmanager.dto.ModelFamilyDTO;
import qa.qcri.aidr.dbmanager.dto.NominalLabelDTO;
import qa.qcri.aidr.dbmanager.entities.model.NominalLabel;
import qa.qcri.aidr.dbmanager.entities.task.Document;
import qa.qcri.aidr.dbmanager.entities.task.DocumentNominalLabel;
import qa.qcri.aidr.dbmanager.entities.task.DocumentNominalLabelId;
import qa.qcri.aidr.dbmanager.entities.task.TaskAnswer;
import qa.qcri.aidr.trainer.api.service.CrisisService;
/**
* Created with IntelliJ IDEA.
* User: jilucas
* Date: 9/16/13
* Time: 4:57 PM
* To change this template use File | Settings | File Templates.
*/
public class PybossaTemplate {
private static Logger logger=Logger.getLogger(PybossaTemplate.class);
public TaskAnswerResponse getPybossaTaskAnswer(String data, CrisisService crisisService){
TaskAnswer taskAnswer = null;
JSONArray attributeIDJson = new JSONArray();
TaskAnswerResponse taskAnswerResponse = new TaskAnswerResponse();
try {
JSONParser parser = new JSONParser();
Object obj = parser.parse(data);
JSONArray jsonObject = (JSONArray) obj;
Iterator itr= jsonObject.iterator();
while(itr.hasNext()){
JSONArray taskAnswerJson = new JSONArray();
JSONObject featureJsonObj = (JSONObject)itr.next();
JSONObject info = (JSONObject)featureJsonObj.get("info");
String category = (String)info.get("category");
String[] categorySet = category.split("\\,");
Long crisisID = (Long)info.get("crisisID");
Long documentID = (Long)info.get("documentID");
Long userID = (Long)info.get("aidrID");
Long attributeID = (Long)info.get("attributeID");
CollectionDTO crisis = crisisService.findByCrisisID(crisisID) ;
List<ModelFamilyDTO> modelFamilySet= crisis.getModelFamiliesDTO();
DocumentNominalLabel documentNominalLabel = null;
// String category ="Food and water";
for (ModelFamilyDTO modelFamily : modelFamilySet){
if(modelFamily.getNominalAttributeDTO().getNominalAttributeId().equals(attributeID)){
ModelFamilyDTO currentModelFamily = modelFamily;
List<NominalLabelDTO> nominalLabelSet = modelFamily.getNominalAttributeDTO().getNominalLabelsDTO();
logger.info("attribute name : " + modelFamily.getNominalAttributeDTO().getName() + "\n");
for (NominalLabelDTO nominalLabel : nominalLabelSet){
JSONObject taskAnswerElement = new JSONObject();
if(nominalLabel.getNominalAttributeDTO().getNominalAttributeId().equals(attributeID)) {
if(findMatchingLabel(categorySet, nominalLabel.getNominalLabelCode())) {
Long labelID = nominalLabel.getNominalLabelId().longValue();
if(!attributeIDJson.contains(attributeID) ){
attributeIDJson.add(attributeID ) ;
}
taskAnswerElement.put("attributeID", attributeID) ;
taskAnswerElement.put("labelID", labelID) ;
taskAnswerJson.add(taskAnswerElement);
DocumentNominalLabelId documentNominalLabelId = new DocumentNominalLabelId(documentID,labelID, userID);
NominalLabel nl = new NominalLabel();
nl.setNominalLabelId(labelID);
Document d = new Document();
d.setDocumentId(documentID);
documentNominalLabel = new DocumentNominalLabel(documentNominalLabelId, nl, d);
taskAnswerResponse.setDocumentNominalLabelList(documentNominalLabel);
}
}
}
}
}
taskAnswerJson.add(getUtilDatJson(featureJsonObj));
taskAnswer = new TaskAnswer(documentID, userID, taskAnswerJson.toJSONString()) ;
taskAnswerResponse.setTaskAnswerList(taskAnswer);
taskAnswerResponse.setJedisJson(getJedisJson(crisisID, attributeIDJson));
taskAnswerResponse.setDocumentID(documentID);
taskAnswerResponse.setUserID(userID);
// System.out.print("category: " + category + " crisisID:" + crisisID+ " documentID:" + documentID + "taskAnswerJson" + taskAnswerJson.toJSONString());
}
} catch (ParseException e) {
//e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
logger.error("Exception while getting Pybossa task answer \t"+e.getStackTrace());
}
return taskAnswerResponse;
}
private boolean findMatchingLabel(String[] categorySet, String label){
boolean found = false;
for(int i=0; i< categorySet.length; i++){
String category = categorySet[i];
if(category.equalsIgnoreCase(label)) {
found = true;
}
}
return found;
}
private String getJedisJson(Long crisisID, JSONArray attributeIDJson){
JSONObject jedisJson = new JSONObject();
jedisJson.put("crisis_id", crisisID);
jedisJson.put("attributes", attributeIDJson);
return jedisJson.toJSONString();
}
private JSONObject getUtilDatJson(JSONObject featureJsonObj){
JSONObject utilJson = new JSONObject();
utilJson.put("clientuserID",featureJsonObj.get("user_id")) ;
return utilJson;
}
}