package nl.topicus.onderwijs.dashboard.web.components.bargraph;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import nl.topicus.onderwijs.dashboard.keys.Key;
import nl.topicus.onderwijs.dashboard.keys.Project;
import nl.topicus.onderwijs.dashboard.modules.DashboardRepository;
import nl.topicus.onderwijs.dashboard.modules.DataSource;
import nl.topicus.onderwijs.dashboard.web.WicketApplication;
import nl.topicus.onderwijs.dashboard.web.components.JsonResourceBehavior;
import org.apache.wicket.markup.html.IHeaderResponse;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.AbstractReadOnlyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.request.resource.JavaScriptResourceReference;
import org.odlabs.wiquery.core.IWiQueryPlugin;
import org.odlabs.wiquery.core.javascript.JsQuery;
import org.odlabs.wiquery.core.javascript.JsStatement;
import org.odlabs.wiquery.core.options.Options;
import org.odlabs.wiquery.ui.commons.WiQueryUIPlugin;
import org.odlabs.wiquery.ui.widget.WidgetJavaScriptResourceReference;
@WiQueryUIPlugin
public class BarGraphBarPanel extends Panel implements IWiQueryPlugin {
private static final long serialVersionUID = 1L;
private JsonResourceBehavior<Map<String, BarData>> dataResource;
private IModel<List<Class<? extends DataSource<? extends Number>>>> dataSetsModel;
public BarGraphBarPanel(
String id,
IModel<Project> projectModel,
IModel<List<Class<? extends DataSource<? extends Number>>>> dataSetsModel) {
super(id, projectModel);
this.dataSetsModel = dataSetsModel;
this.dataResource = new JsonResourceBehavior<Map<String, BarData>>(
new AbstractReadOnlyModel<Map<String, BarData>>() {
private static final long serialVersionUID = 1L;
@Override
public Map<String, BarData> getObject() {
return retrieveDataFromApplication();
}
});
add(dataResource);
}
protected Map<String, BarData> retrieveDataFromApplication() {
Map<String, BarData> ret = new HashMap<String, BarData>();
for (Class<? extends DataSource<? extends Number>> datasource : dataSetsModel
.getObject()) {
getDataFromDataSource(ret, datasource);
}
return ret;
}
private void getDataFromDataSource(Map<String, BarData> ret,
Class<? extends DataSource<? extends Number>> datasourceType) {
DashboardRepository repository = WicketApplication.get()
.getRepository();
Project project = getProject();
Map<Key, ? extends DataSource<? extends Number>> data = repository
.getData(datasourceType);
DataSource<? extends Number> datasource = data.get(project);
if (datasource != null) {
long max = 0;
for (DataSource<? extends Number> status : data.values()) {
Number number = status.getValue();
max = Math.max(number == null ? 0 : number.longValue(), max);
}
Number sourceValue = datasource.getValue();
if (sourceValue != null) {
long number = sourceValue.longValue();
double value = max == 0 ? 0 : (100.0 * number) / max;
ret.put(datasourceType.getSimpleName(), new BarData(value,
sourceValue.toString()));
}
}
}
@Override
public void renderHead(IHeaderResponse response) {
response.renderJavaScriptReference(WidgetJavaScriptResourceReference
.get());
response.renderJavaScriptReference(new JavaScriptResourceReference(
BarGraphBarPanel.class, "jquery.ui.dashboardbargraph.js"));
}
public Project getProject() {
return (Project) getDefaultModelObject();
}
@Override
public JsStatement statement() {
Options options = new Options();
options.putLiteral("projectName", getProject().getName());
options.putLiteral("dataUrl", dataResource.getCallbackUrl().toString());
JsQuery jsq = new JsQuery(this);
return jsq.$().chain("dashboardBarGraph",
options.getJavaScriptOptions());
}
@Override
protected void onDetach() {
super.onDetach();
dataSetsModel.detach();
}
}