package fi.otavanopisto.muikku.plugins.material;
import java.io.IOException;
import java.util.List;
import javax.enterprise.context.Dependent;
import javax.enterprise.event.Event;
import javax.inject.Inject;
import org.apache.commons.lang3.StringUtils;
import org.codehaus.jackson.map.ObjectMapper;
import fi.otavanopisto.muikku.plugins.material.dao.QuerySelectFieldDAO;
import fi.otavanopisto.muikku.plugins.material.dao.QuerySelectFieldOptionDAO;
import fi.otavanopisto.muikku.plugins.material.events.QueryFieldDeleteEvent;
import fi.otavanopisto.muikku.plugins.material.events.QueryFieldUpdateEvent;
import fi.otavanopisto.muikku.plugins.material.fieldmeta.SelectFieldMeta;
import fi.otavanopisto.muikku.plugins.material.fieldmeta.SelectFieldOptionMeta;
import fi.otavanopisto.muikku.plugins.material.model.Material;
import fi.otavanopisto.muikku.plugins.material.model.QuerySelectField;
import fi.otavanopisto.muikku.plugins.material.model.QuerySelectFieldOption;
@Dependent
public class QuerySelectFieldController {
@Inject
private QuerySelectFieldDAO querySelectFieldDAO;
@Inject
private QuerySelectFieldOptionDAO querySelectFieldOptionDAO;
@Inject
private Event<QueryFieldUpdateEvent> queryFieldUpdateEvent;
@Inject
private Event<QueryFieldDeleteEvent> queryFieldDeleteEvent;
/* QuerySelectField */
public QuerySelectField createQuerySelectField(Material material, String name) {
return querySelectFieldDAO.create(material, name);
}
public QuerySelectField findQuerySelectFieldbyId(Long id) {
return querySelectFieldDAO.findById(id);
}
public QuerySelectField findQuerySelectFieldByMaterialAndName(Material material, String name) {
return querySelectFieldDAO.findByMaterialAndName(material, name);
}
public QuerySelectField updateQuerySelectField(Material material, MaterialField field, boolean removeAnswers) throws MaterialFieldMetaParsingExeption {
// Field JSON to metadata object
ObjectMapper objectMapper = new ObjectMapper();
SelectFieldMeta selectFieldMeta;
try {
selectFieldMeta = objectMapper.readValue(field.getContent(), SelectFieldMeta.class);
} catch (IOException e) {
throw new MaterialFieldMetaParsingExeption("Could not parse select field meta", e);
}
QuerySelectField queryField = querySelectFieldDAO.findByMaterialAndName(material, selectFieldMeta.getName());
// -> fi.otavanopisto.muikku.plugins.workspace.QueryFieldChangeListener
queryFieldUpdateEvent.fire(new QueryFieldUpdateEvent(queryField, field, removeAnswers));
List<QuerySelectFieldOption> oldOptions = querySelectFieldOptionDAO.listByField(queryField);
List<SelectFieldOptionMeta> newOptions = selectFieldMeta.getOptions();
for (SelectFieldOptionMeta newOption : newOptions) {
QuerySelectFieldOption correspondingOption = findOptionByName(oldOptions, newOption.getName());
if (correspondingOption == null) {
// New options
createQuerySelectFieldOption(queryField, newOption.getName(), newOption.getText());
}
else {
// Modified options
if (!StringUtils.equals(correspondingOption.getText(), newOption.getText())) {
updateQuerySelectFieldOptionText(correspondingOption, newOption.getText());
}
oldOptions.remove(correspondingOption);
}
}
// Removed options
for (QuerySelectFieldOption removedOption : oldOptions) {
deleteQuerySelectFieldOption(removedOption);
}
return queryField;
}
private QuerySelectFieldOption findOptionByName(List<QuerySelectFieldOption> options, String name) {
for (QuerySelectFieldOption option : options) {
if (StringUtils.equals(option.getName(), name)) {
return option;
}
}
return null;
}
public void deleteQuerySelectField(QuerySelectField queryField, boolean removeAnswers) {
queryFieldDeleteEvent.fire(new QueryFieldDeleteEvent(queryField, removeAnswers));
for (QuerySelectFieldOption option : listQuerySelectFieldOptionsBySelectField(queryField)) {
deleteQuerySelectFieldOption(option);
}
querySelectFieldDAO.delete(queryField);
}
/* QuerySelectFieldOption */
public QuerySelectFieldOption createQuerySelectFieldOption(QuerySelectField querySelectField, String name, String text) {
return querySelectFieldOptionDAO.create(name, text == null ? "" : text, querySelectField);
}
public QuerySelectFieldOption findQuerySelectFieldOptionBySelectFieldAndName(QuerySelectField selectField, String name) {
return querySelectFieldOptionDAO.findBySelectFieldAndName(selectField, name);
}
public List<QuerySelectFieldOption> listQuerySelectFieldOptionsBySelectField(QuerySelectField selectField) {
return querySelectFieldOptionDAO.listBySelectField(selectField);
}
public QuerySelectFieldOption updateQuerySelectFieldOptionText(QuerySelectFieldOption querySelectFieldOption, String text) {
return querySelectFieldOptionDAO.updateText(querySelectFieldOption, text == null ? "" : text);
}
public void deleteQuerySelectFieldOption(QuerySelectFieldOption querySelectFieldOption) {
querySelectFieldOptionDAO.delete(querySelectFieldOption);
}
}