package org.xcolab.client.contest;
import org.xcolab.client.contest.pojo.Contest;
import org.xcolab.client.contest.pojo.impact.ImpactIteration;
import org.xcolab.client.contest.pojo.impact.ImpactIterationDto;
import org.xcolab.client.contest.pojo.impact.ImpactTemplateFocusAreaList;
import org.xcolab.client.contest.pojo.impact.ImpactTemplateFocusAreaListDto;
import org.xcolab.client.contest.pojo.impact.ImpactTemplateMaxFocusArea;
import org.xcolab.client.contest.pojo.impact.ImpactTemplateMaxFocusAreaDto;
import org.xcolab.client.contest.pojo.impact.ImpactTemplateSeries;
import org.xcolab.client.contest.pojo.impact.ImpactTemplateSeriesDto;
import org.xcolab.client.contest.pojo.templates.PlanTemplate;
import org.xcolab.util.http.client.RestResource1;
import org.xcolab.util.http.client.RestService;
import org.xcolab.util.http.dto.DtoUtil;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ImpactClient {
private static final Map<RestService, ImpactClient> instances = new HashMap<>();
private final RestService contestService;
private final RestResource1<ImpactTemplateSeriesDto, Long> impactTemplateSeriesResource;
private final RestResource1<ImpactIterationDto, Long> impactIterationResource;
private final RestResource1<ImpactTemplateFocusAreaListDto, Long>
impactTemplateFocusAreaListResource;
private final RestResource1<ImpactTemplateMaxFocusAreaDto, Long>
impactTemplateMaxFocusAreaResource;
private ImpactClient(RestService contestService) {
this.contestService = contestService;
impactTemplateSeriesResource = new RestResource1<>(this.contestService,
"impactTemplateSeries", ImpactTemplateSeriesDto.TYPES);
impactIterationResource = new RestResource1<>(this.contestService,
"impactIterations", ImpactIterationDto.TYPES);
impactTemplateFocusAreaListResource = new RestResource1<>(this.contestService,
"impactTemplateFocusAreaLists", ImpactTemplateFocusAreaListDto.TYPES);
impactTemplateMaxFocusAreaResource = new RestResource1<>(this.contestService,
"impactTemplateMaxFocusAreas", ImpactTemplateMaxFocusAreaDto.TYPES);
}
public static ImpactClient fromService(RestService contestService) {
ImpactClient client = instances.get(contestService);
if (client == null) {
client = new ImpactClient(contestService);
instances.put(contestService, client);
}
return client;
}
public List<ImpactTemplateMaxFocusArea> getContestImpactFocusAreas(Contest contest) {
ImpactTemplateFocusAreaList focusAreaList = getContestImpactFocusAreaList(contest);
return getImpactTemplateMaxFocusArea(focusAreaList.getFocusAreaListId());
}
public ImpactTemplateFocusAreaList getContestImpactFocusAreaList(Contest contest) {
PlanTemplate planTemplate =
PlanTemplateClientUtil.getPlanTemplate(contest.getPlanTemplateId());
return getImpactTemplateFocusAreaList(planTemplate.getFocusAreaListTemplateId());
}
public ImpactTemplateFocusAreaList getImpactTemplateFocusAreaList(long focusAreaListId) {
return impactTemplateFocusAreaListResource.get(focusAreaListId)
.execute().toPojo(contestService);
}
public List<ImpactTemplateMaxFocusArea> getImpactTemplateMaxFocusArea(Long focusAreaListId) {
return DtoUtil.toPojos(impactTemplateMaxFocusAreaResource.list()
.optionalQueryParam("focusAreaListId", focusAreaListId)
.execute(), contestService);
}
public List<ImpactIteration> getContestImpactIterations(Contest contest) {
ImpactTemplateSeries impactSeries = getContestImpactTemplateSeries(contest);
return getContestImpactIterations(impactSeries.getIterationId());
}
public ImpactTemplateSeries getContestImpactTemplateSeries(Contest contest) {
PlanTemplate planTemplate =
PlanTemplateClientUtil.getPlanTemplate(contest.getPlanTemplateId());
return getImpactTemplateSeries(planTemplate.getImpactSeriesTemplateId());
}
public ImpactTemplateSeries getImpactTemplateSeries(long seriesId) {
return impactTemplateSeriesResource.get(seriesId)
.execute().toPojo(contestService);
}
public List<ImpactIteration> getContestImpactIterations(Long iterationId) {
return DtoUtil.toPojos(impactIterationResource.list()
.optionalQueryParam("iterationId", iterationId)
.execute(), contestService);
}
}