package org.openmrs.module.reporting.web.datasets;
import org.apache.commons.lang.StringUtils;
import org.openmrs.api.context.Context;
import org.openmrs.module.htmlwidgets.web.WidgetUtil;
import org.openmrs.module.reporting.dataset.definition.DataSetDefinition;
import org.openmrs.module.reporting.dataset.definition.MultiParameterDataSetDefinition;
import org.openmrs.module.reporting.dataset.definition.service.DataSetDefinitionService;
import org.openmrs.module.reporting.definition.DefinitionContext;
import org.openmrs.module.reporting.evaluation.parameter.Parameter;
import org.openmrs.util.OpenmrsUtil;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.context.request.WebRequest;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Controller
public class MultiParameterDataSetEditor {
@RequestMapping("/module/reporting/datasets/multiParameterDataSetEditor")
public void showForm(ModelMap model,
@RequestParam(value="uuid", required=false) String uuid) {
List<DataSetDefinition> allDefinitions = Context.getService(DataSetDefinitionService.class).getAllDefinitions(false);
if (uuid == null) {
model.addAttribute("definition", new MultiParameterDataSetDefinition());
} else {
DataSetDefinition def = Context.getService(DataSetDefinitionService.class).getDefinitionByUuid(uuid);
allDefinitions.remove(def);
if (def instanceof MultiParameterDataSetDefinition) {
model.addAttribute("definition", def);
} else {
throw new RuntimeException("This definition is not of the right class");
}
}
model.addAttribute("availableDefinitions", allDefinitions);
}
@RequestMapping("/module/reporting/datasets/multiParameterAddIteration")
public String addIteration(@RequestParam("dsdUuid") String dsdUuid,
@RequestParam("index") Integer index) {
DataSetDefinition dsd = DefinitionContext.getDataSetDefinitionService().getDefinitionByUuid(dsdUuid);
MultiParameterDataSetDefinition pdsd = (MultiParameterDataSetDefinition) dsd;
if (pdsd.getIterations() == null) {
pdsd.setIterations(new ArrayList<Map<String, Object>>());
}
pdsd.getIterations().add(new HashMap<String, Object>());
DefinitionContext.getDataSetDefinitionService().saveDefinition(pdsd);
return "redirect:multiParameterDataSetEditor.form?uuid=" + dsdUuid;
}
@RequestMapping("/module/reporting/datasets/multiParameterRemoveIteration")
public String removeIteration(@RequestParam("dsdUuid") String dsdUuid,
@RequestParam("index") Integer index) {
DataSetDefinition dsd = DefinitionContext.getDataSetDefinitionService().getDefinitionByUuid(dsdUuid);
MultiParameterDataSetDefinition pdsd = (MultiParameterDataSetDefinition) dsd;
if (pdsd.getIterations() != null) {
pdsd.getIterations().remove((int) index);
DefinitionContext.getDataSetDefinitionService().saveDefinition(pdsd);
}
return "redirect:multiParameterDataSetEditor.form?uuid=" + dsdUuid;
}
@RequestMapping("/module/reporting/datasets/multiParameterEditIterationParameter")
public String editIterationParameter(@RequestParam("dsdUuid") String dsdUuid,
@RequestParam("iteration") Integer iteration,
@RequestParam("parameterName") String parameterName,
WebRequest request) {
DataSetDefinition dsd = DefinitionContext.getDataSetDefinitionService().getDefinitionByUuid(dsdUuid);
MultiParameterDataSetDefinition pdsd = (MultiParameterDataSetDefinition) dsd;
if (pdsd.getIterations() != null) {
String valueType = request.getParameterValues("valueType")[0];
String[] value = request.getParameterValues(valueType + "Value");
Parameter p = pdsd.getBaseDefinition().getParameter(parameterName);
if (value != null && value.length > 0) {
Object paramValue = null;
if (StringUtils.isEmpty(valueType) || valueType.equals("fixed")) {
String fixedValueString = OpenmrsUtil.join(Arrays.asList(value), ",");
paramValue = WidgetUtil.parseInput(fixedValueString, p.getType());
}
else {
paramValue = "${" + value[0] + "}";
}
if (paramValue != null) {
pdsd.getIterations().get(iteration).put(parameterName, paramValue);
}
}
DefinitionContext.getDataSetDefinitionService().saveDefinition(pdsd);
}
return "redirect:/module/reporting/closeWindow.htm";
}
@RequestMapping("/module/reporting/datasets/multiParameterChangeBaseDefinition")
public String changeBaseDefinition(@RequestParam("dsdUuid") String dsdUuid,
@RequestParam("baseDefinitionUuid") String baseDefinitionUuid) {
DataSetDefinition dsd = DefinitionContext.getDataSetDefinitionService().getDefinitionByUuid(dsdUuid);
MultiParameterDataSetDefinition pdsd = (MultiParameterDataSetDefinition) dsd;
DataSetDefinition baseDsd = DefinitionContext.getDataSetDefinitionService().getDefinitionByUuid(baseDefinitionUuid);
pdsd.setBaseDefinition(baseDsd);
pdsd.getIterations().clear();
DefinitionContext.getDataSetDefinitionService().saveDefinition(pdsd);
return "redirect:multiParameterDataSetEditor.form?uuid=" + dsdUuid;
}
}