package org.xcolab.view.pages.contestmanagement.wrappers;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xcolab.client.contest.ContestClientUtil;
import org.xcolab.client.contest.PlanTemplateClientUtil;
import org.xcolab.client.contest.pojo.Contest;
import org.xcolab.client.contest.pojo.templates.PlanSectionDefinition;
import org.xcolab.client.contest.pojo.templates.PlanTemplate;
import org.xcolab.client.contest.pojo.templates.PlanTemplateSection;
import org.xcolab.util.html.LabelValue;
import org.xcolab.view.pages.contestmanagement.utils.ProposalTemplateLifecycleUtil;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class ProposalTemplateWrapper {
private final static Logger _log = LoggerFactory.getLogger(ProposalTemplateWrapper.class);
private List<SectionDefinitionWrapper> sections;
private Integer numberOfSections;
private PlanTemplate planTemplate;
private String templateName;
private Long planTemplateId;
private Boolean updateExistingSections = false;
private Boolean createNew = false;
public ProposalTemplateWrapper() {
}
public ProposalTemplateWrapper(Long planTemplateId) {
this.planTemplate = PlanTemplateClientUtil.getPlanTemplate(planTemplateId);
populateExistingProposalTemplateSections();
}
private void populateExistingProposalTemplateSections() {
sections = new ArrayList<>();
if (planTemplate != null) {
for (PlanSectionDefinition planSectionDefinition : PlanTemplateClientUtil
.getPlanSectionDefinitionByPlanTemplateId(planTemplate.getId_(), null)) {
if (!planSectionDefinition.getLocked()) {
sections.add(new SectionDefinitionWrapper(planSectionDefinition,
planTemplate.getId_()));
}
}
}
addDummySection();
}
private void addDummySection() {
SectionDefinitionWrapper sectionDefinitionWrapper = new SectionDefinitionWrapper();
sectionDefinitionWrapper.setTemplateSection(true);
sectionDefinitionWrapper.setTitle("");
sectionDefinitionWrapper.setContent("");
sectionDefinitionWrapper.setLevel(0L);
sectionDefinitionWrapper.setPointType(0L);
sectionDefinitionWrapper.setPointPercentage("0");
sections.add(sectionDefinitionWrapper);
}
public static List<LabelValue> getAllPlanTemplateSelectionItems() {
List<LabelValue> selectItems = new ArrayList<>();
for (PlanTemplate planTemplateItem : PlanTemplateClientUtil.getPlanTemplates()) {
selectItems.add(new LabelValue(planTemplateItem.getId_(), planTemplateItem.getName()));
}
return selectItems;
}
public Long getPlanTemplateId() {
if (planTemplate != null) {
return planTemplate.getId_();
}
return planTemplateId;
}
public void setPlanTemplateId(Long planTemplateId) {
this.planTemplateId = planTemplateId;
initPlanTemplate(planTemplateId);
}
private void initPlanTemplate(Long planTemplateId) {
this.planTemplate = PlanTemplateClientUtil.getPlanTemplate(planTemplateId);
}
public Boolean getUpdateExistingSections() {
return updateExistingSections;
}
public void setUpdateExistingTemplate(Boolean updateExistingSections) {
this.updateExistingSections = updateExistingSections;
}
public PlanTemplate getPlanTemplate() {
return planTemplate;
}
public void setPlanTemplate(PlanTemplate planTemplate) {
this.planTemplate = planTemplate;
}
public List<SectionDefinitionWrapper> getSections() {
return sections;
}
public void setSections(List<SectionDefinitionWrapper> sections) {
this.sections = sections;
}
public Boolean getCreateNew() {
return createNew;
}
public void setCreateNew(Boolean createNew) {
this.createNew = createNew;
}
public int getNumberOfSections() {
if (sections != null) {
return sections.size();
}
return numberOfSections;
}
public void setNumberOfSections(int numberOfSections) {
this.numberOfSections = numberOfSections;
}
public String getTemplateName() {
if (planTemplate != null && planTemplate.getName() != null) {
this.templateName = planTemplate.getName();
}
return templateName;
}
public void setTemplateName(String templateName) {
this.templateName = templateName;
}
public void persist() {
removeDeletedSections();
removeTemplateSection();
if (createNew) {
duplicateExistingPlanTemplate();
updateExistingSections = false;
}
for (SectionDefinitionWrapper sectionBaseDefinition : sections) {
sectionBaseDefinition.persist(createNew);
}
addSectionsToProposalTemplate();
updatePlanTemplateTitle();
}
public void removeDeletedSections() {
Set<Long> remainingPlanSectionDefinitionIds = new HashSet<>();
List<SectionDefinitionWrapper> removedSectionDefinitions = new ArrayList<>();
for (SectionDefinitionWrapper sectionBaseDefinition : sections) {
if ((sectionBaseDefinition.getTitle() == null || sectionBaseDefinition.getTitle()
.isEmpty())
&& !sectionBaseDefinition.isTemplateSection()) {
removedSectionDefinitions.add(sectionBaseDefinition);
} else {
remainingPlanSectionDefinitionIds.add(sectionBaseDefinition.getId());
}
}
List<PlanSectionDefinition> planSectionDefinitions = PlanTemplateClientUtil
.getPlanSectionDefinitionByPlanTemplateId(planTemplate.getId_(), null);
for (PlanSectionDefinition planSectionDefinition : planSectionDefinitions) {
if (!remainingPlanSectionDefinitionIds.contains(planSectionDefinition.getId_())) {
if (!ProposalTemplateLifecycleUtil
.isPlanSectionDefinitionUsedInOtherTemplate(
planSectionDefinition.getId_(),
planTemplate.getId_())) {
PlanTemplateClientUtil
.deletePlanSectionDefinition(planSectionDefinition.getId_());
}
PlanTemplateClientUtil
.deletePlanTemplateSection(planTemplate.getId_(),
planSectionDefinition.getId_());
}
}
for (SectionDefinitionWrapper removedSectionDefinition : removedSectionDefinitions) {
sections.remove(removedSectionDefinition);
}
}
private void removeTemplateSection() {
SectionDefinitionWrapper templateSectionDefinitionWrapper = new SectionDefinitionWrapper();
for (SectionDefinitionWrapper sectionBaseDefinition : sections) {
if (sectionBaseDefinition.isTemplateSection()) {
templateSectionDefinitionWrapper = sectionBaseDefinition;
break;
}
}
sections.remove(templateSectionDefinitionWrapper);
}
private void duplicateExistingPlanTemplate() {
planTemplate.setId_(null);
PlanTemplate newPlanTemplate = PlanTemplateClientUtil.createPlanTemplate(planTemplate);
planTemplateId = newPlanTemplate.getId_();
planTemplate = newPlanTemplate;
for (SectionDefinitionWrapper section : sections) {
section.setId(null);
}
}
private void addSectionsToProposalTemplate() {
for (SectionDefinitionWrapper sectionDefinitionWrapper : sections) {
createOrUpdateIfExistsPlanTemplateSection(sectionDefinitionWrapper);
}
}
private void createOrUpdateIfExistsPlanTemplateSection(
SectionDefinitionWrapper sectionDefinitionWrapper) {
boolean wasUpdated = false;
Long planTemplateId = planTemplate.getId_();
Long sectionDefinitionId = sectionDefinitionWrapper.getId();
Integer weight = sectionDefinitionWrapper.getWeight();
List<PlanTemplateSection> planTemplateSectionsWithSectionDefinition =
PlanTemplateClientUtil
.getPlanTemplateSectionByPlanSectionDefinitionId(
sectionDefinitionWrapper.getId());
for (PlanTemplateSection planTemplateSection : planTemplateSectionsWithSectionDefinition) {
if (planTemplateSection.getPlanTemplateId().longValue() == planTemplateId) {
planTemplateSection.setWeight(weight);
PlanTemplateClientUtil
.updatePlanTemplateSection(planTemplateSection);
wasUpdated = true;
break;
}
}
if (!wasUpdated) {
PlanTemplateSection pts = new PlanTemplateSection();
pts.setPlanSectionId(sectionDefinitionId);
pts.setPlanTemplateId(planTemplateId);
pts.setWeight(weight);
PlanTemplateClientUtil.createPlanTemplateSection(pts);
}
}
private void updatePlanTemplateTitle() {
if (planTemplate != null && templateName != null) {
planTemplate.setName(templateName);
PlanTemplateClientUtil.updatePlanTemplate(planTemplate);
}
}
public List<Contest> getContestsUsingTemplate() {
List<Contest> contestsUsingSelectedTemplate = new ArrayList<>();
List<Contest> contestsUsingSelectedTemplateList;
Long planTemplateId = planTemplate.getId_();
contestsUsingSelectedTemplateList =
ContestClientUtil.getContestsByPlanTemplateId(planTemplateId);
for (Contest contest : contestsUsingSelectedTemplateList) {
contestsUsingSelectedTemplate.add((contest));
}
return contestsUsingSelectedTemplate;
}
}