package qa.qcri.aidr.trainer.api.service.impl;
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import qa.qcri.aidr.dbmanager.dto.CollectionDTO;
import qa.qcri.aidr.dbmanager.entities.misc.CustomUiTemplate;
import qa.qcri.aidr.trainer.api.entity.Client;
import qa.qcri.aidr.trainer.api.entity.ClientApp;
import qa.qcri.aidr.trainer.api.service.ClientAppService;
import qa.qcri.aidr.trainer.api.service.ClientService;
import qa.qcri.aidr.trainer.api.service.CrisisService;
import qa.qcri.aidr.trainer.api.service.CustomUITemplateService;
import qa.qcri.aidr.trainer.api.service.TaskQueueService;
import qa.qcri.aidr.trainer.api.service.TemplateService;
import qa.qcri.aidr.trainer.api.store.CodeLookUp;
import qa.qcri.aidr.trainer.api.store.StatusCodeType;
import qa.qcri.aidr.trainer.api.store.URLReference;
import qa.qcri.aidr.trainer.api.template.CrisisApplicationListFormatter;
import qa.qcri.aidr.trainer.api.template.CrisisApplicationListModel;
import qa.qcri.aidr.trainer.api.template.CrisisLandingHtmlModel;
import qa.qcri.aidr.trainer.api.template.CrisisLandingStatusModel;
//import qa.qcri.aidr.trainer.api.entity.Crisis;
/**
* Created with IntelliJ IDEA.
* User: jlucas
* Date: 10/27/13
* Time: 3:12 PM
* To change this template use File | Settings | File Templates.
*/
@Service("templateService")
@Transactional(readOnly = false)
public class TemplateServiceImpl implements TemplateService {
private static Logger logger=Logger.getLogger(TemplateServiceImpl.class);
@Autowired
private ClientService clientService;
@Autowired
private ClientAppService clientAppService;
@Autowired
private TaskQueueService taskQueueService;
@Autowired
private CrisisService crisisService;
@Autowired
private CustomUITemplateService customUITemplateService;
@Override
public List<CrisisApplicationListModel> getApplicationListHtmlByCrisisID(Long cririsID) {
Client client;
List<CrisisApplicationListModel> applicationListModelList = new ArrayList<CrisisApplicationListModel>();
List<ClientApp> clientAppList = clientAppService.getAllClientAppByCrisisID(cririsID);
if(clientAppList != null){
if(clientAppList.size() > 0){
client = clientService.findClientbyID("clientID", clientAppList.get(0).getClientID());
for(int i=0; i < clientAppList.size(); i++){
ClientApp clientApp = clientAppList.get(i);
if(!clientApp.getStatus().equals(StatusCodeType.CLIENT_APP_INACTIVE) && !clientApp.getStatus().equals(StatusCodeType.CLIENT_APP_DISABLED)){
CrisisApplicationListFormatter formatter = new CrisisApplicationListFormatter(clientApp,client,taskQueueService) ;
String url = formatter.getURLLink();
Integer remaining = formatter.getRemaining();
Integer totalCount = formatter.getTotalTaskNumber() - formatter.getRemaining();
if(totalCount < 0){
totalCount = 0;
}
String attNameValue = clientApp.getName();
String[] array = attNameValue.split("\\:");
String attName =null;
if(array.length > 1){
attName = array[1];
}
applicationListModelList.add(new CrisisApplicationListModel(clientApp.getNominalAttributeID(),attName.trim(),url,remaining, totalCount));
}
}
}
}
return applicationListModelList; //To change body of implemented methods use File | Settings | File Templates.
}
@Override
public List<CrisisApplicationListModel> getApplicationListHtmlByCrisisCode(String crisisCode) {
List<CrisisApplicationListModel> crisisApplicationListModelList = null;
List<CollectionDTO> crisisList;
try {
crisisList = crisisService.findByCrisisCode(crisisCode);
if(crisisList!=null){
if(crisisList.size() > 0){
CollectionDTO crisis = crisisList.get(0);
crisisApplicationListModelList = getApplicationListHtmlByCrisisID(crisis.getCrisisID());
}
}
} catch (Exception e) {
logger.error("Exception in getApplicationListHtmlByCrisisCode, crisisCode="+crisisCode+"\t"+e.getStackTrace());
return null;
}
return crisisApplicationListModelList; //To change body of implemented methods use File | Settings | File Templates.
}
@Override
public CrisisLandingHtmlModel getCrisisLandingHtmlByCrisisCode(String crisisCode) {
CrisisLandingHtmlModel crisisLandingHtmlModel = null;
List<CollectionDTO> crisisList = null;
try {
crisisList = crisisService.findByCrisisCode(crisisCode);
} catch (Exception e) {
logger.error("Exception in CrisisLandingHtmlModel for crisis="+crisisCode+"\t"+e.getStackTrace());
}
if(crisisList != null){
if(crisisList.size() > 0){
CollectionDTO crisis = crisisList.get(0);
crisisLandingHtmlModel = getCrisisLandingHtmlByCrisisID(crisis.getCrisisID());
}
}
return crisisLandingHtmlModel;
}
@Override
public CrisisLandingHtmlModel getCrisisLandingHtmlByCrisisID(Long crisisID) {
CrisisLandingHtmlModel crisisLandingHtmlModel = null;
try {
//Crisis crisis = crisisService.findByCrisisID(crisisID);
CollectionDTO crisis = crisisService.findByCrisisID(crisisID);
List<ClientApp> clientAppList = clientAppService.getAllClientAppByCrisisID(crisisID);
if(clientAppList != null & crisis!= null){
if(clientAppList.size() > 0){
Client client = clientService.findClientbyID("clientID", clientAppList.get(0).getClientID());
List<CrisisApplicationListModel> crisisApplicationListModelList = null;
crisisApplicationListModelList = getApplicationListHtmlByCrisisID(crisisID);
crisisLandingHtmlModel = new CrisisLandingHtmlModel(crisis.getCode(), crisis.getName(), crisisApplicationListModelList);
}
}
} catch (Exception e) {
logger.error("Exception in getCrisisLandingHtmlByCrisisID for crisisID="+crisisID+"\t"+e.getStackTrace());
}
return crisisLandingHtmlModel;
}
@Override
public String getCrisisLandingJSONPByCrisisID(Long crisisID) {
CrisisLandingHtmlModel crisisLandingHtmlModel = null;
JSONObject json = new JSONObject();
CollectionDTO crisis = null;
try {
//Crisis crisis = crisisService.findByCrisisID(crisisID);
crisis = crisisService.findByCrisisID(crisisID);
} catch (Exception e) {
logger.error("Exception while finding crisis by id:"+crisisID ,e);
}
List<ClientApp> clientAppList = clientAppService.getAllClientAppByCrisisID(crisisID);
// customUITemplateService
if(clientAppList != null & crisis!= null){
if(clientAppList.size() > 0){
Client client = clientService.findClientbyID("clientID", clientAppList.get(0).getClientID());
List<CrisisApplicationListModel> crisisApplicationListModelList = null;
crisisApplicationListModelList = getApplicationListHtmlByCrisisID(crisisID);
json.put("crisisName", crisis.getName()) ;
json.put("crisisCode", crisis.getCode()) ;
JSONArray list = new JSONArray();
for(int i= 0; i < crisisApplicationListModelList.size(); i++ ){
JSONObject app = new JSONObject();
CrisisApplicationListModel item = crisisApplicationListModelList.get(i);
app.put("name" , item.getName());
app.put("nominalAttributeID" , item.getNominalAttributeID());
app.put("url" , item.getUrl());
app.put("remaining" , item.getRemaining());
app.put("totaltaskNumber" , item.getTotaltaskNumber());
list.add(app) ;
}
json.put("app", list);
}
}
List<CustomUiTemplate> uiTemps = customUITemplateService.getCustomTemplateForLandingPage(crisisID);
for(CustomUiTemplate iTemplate: uiTemps){
if(iTemplate.getTemplateType().equals(CodeLookUp.CURATOR_NAME)){
json.put("curator", iTemplate.getTemplateValue());
}
if(iTemplate.getTemplateType().equals(CodeLookUp.PUBLIC_LANDING_PAGE_TOP)){
json.put("topStory", iTemplate.getTemplateValue());
}
if(iTemplate.getTemplateType().equals(CodeLookUp.PUBLIC_LANDING_PAGE_BOTTOM)){
json.put("bottomStory", iTemplate.getTemplateValue());
}
}
String returnValue = "";
if(json.toString().trim().length() > 5){
returnValue = "jsonp(" + json.toJSONString() + ");";
}
return returnValue;
}
@Override
public String getCrisisLandingJSONPByCrisisCode(String crisisCode) {
String returnValue = "";
List<CollectionDTO> crisisList = null;
try {
crisisList = crisisService.findByCrisisCode(crisisCode);
if(crisisList != null){
if(crisisList.size() > 0){
CollectionDTO crisis = crisisList.get(0);
returnValue = getCrisisLandingJSONPByCrisisID(crisis.getCrisisID()) ;
}
}
} catch (Exception e) {
logger.error("Exception in getCrisisLandingJSONPByCrisisCode for crisis="+crisisCode+"\t"+e.getStackTrace());
}
return returnValue; //To change body of implemented methods use File | Settings | File Templates.
}
@Override
public CrisisLandingStatusModel getCrisisLandingStatusByCrisisCode(String crisisCode) {
CrisisLandingStatusModel crisisLandingStatusModel = null;
List<CollectionDTO> crisisList = null;
try {
crisisList = crisisService.findByCrisisCode(crisisCode);
logger.info("crisisList size = " + (crisisList != null ? crisisList.size() : "null"));
} catch (Exception e) {
logger.error("Exception in getCrisisLandingStatusByCrisisCode for crisis: "+crisisCode+"\t"+e.getStackTrace());
}
boolean isReadyToShow = false;
if(crisisList != null){
if(crisisList.size() > 0){
CollectionDTO crisis = crisisList.get(0);
List<ClientApp> clientAppList = clientAppService.getAllClientAppByCrisisID(crisis.getCrisisID());
//System.out.println("clientAppList size = " + (clientAppList != null ? clientAppList.size() : "null"));
logger.info("clientAppList size = " + (clientAppList != null ? clientAppList.size() : "null"));
if(clientAppList != null ){
if(clientAppList.size() > 0){
isReadyToShow = true;
}
}
}
}
logger.info("isReadyToShow = " + isReadyToShow);
if(isReadyToShow){
String url = URLReference.PUBLIC_LINK + crisisCode;
crisisLandingStatusModel = new CrisisLandingStatusModel(url, StatusCodeType.CRISIS_PYBOSSA_SERVICE_READY, "ready" );
}
else{
crisisLandingStatusModel = new CrisisLandingStatusModel("", StatusCodeType.CRISIS_PYBOSSA_SERVICE_NOT_READY, "Initializing trainer task. Please come back in a few minutes." );
}
return crisisLandingStatusModel;
}
}