package com.constellio.app.modules.rm.model.calculators;
import java.util.ArrayList;
import java.util.List;
import org.joda.time.LocalDate;
import com.constellio.app.modules.rm.RMConfigs;
import com.constellio.app.modules.rm.model.CopyRetentionRule;
import com.constellio.app.modules.rm.model.enums.AllowModificationOfArchivisticStatusAndExpectedDatesChoice;
import com.constellio.app.modules.rm.wrappers.Folder;
import com.constellio.model.entities.calculators.CalculatorParameters;
import com.constellio.model.entities.calculators.MetadataValueCalculator;
import com.constellio.model.entities.calculators.dependencies.ConfigDependency;
import com.constellio.model.entities.calculators.dependencies.Dependency;
import com.constellio.model.entities.calculators.dependencies.LocalDependency;
import com.constellio.model.entities.schemas.MetadataValueType;
public abstract class AbstractFolderExpectedDateCalculator implements MetadataValueCalculator<LocalDate> {
LocalDependency<List<CopyRetentionRule>> applicableCopyRulesParam = LocalDependency
.toAStructure(Folder.APPLICABLE_COPY_RULES).whichIsMultivalue().whichIsRequired();
LocalDependency<CopyRetentionRule> mainCopyRuleParam = LocalDependency
.toAStructure(Folder.MAIN_COPY_RULE).whichIsRequired();
ConfigDependency<AllowModificationOfArchivisticStatusAndExpectedDatesChoice> manualMetadataChoiceConfigDependency
= RMConfigs.ALLOW_MODIFICATION_OF_ARCHIVISTIC_STATUS_AND_EXPECTED_DATES.dependency();
@Override
public LocalDate calculate(CalculatorParameters parameters) {
AllowModificationOfArchivisticStatusAndExpectedDatesChoice manualMetadataChoice = parameters
.get(manualMetadataChoiceConfigDependency);
if (manualMetadataChoice == null
|| manualMetadataChoice == AllowModificationOfArchivisticStatusAndExpectedDatesChoice.DISABLED) {
return calculateWithoutConsideringManualMetadata(parameters);
} else {
LocalDate manualMetadata = parameters.get(getManualDateDependency());
boolean hasOtherManualMetadata = false;
if (getOtherModeManualDateDependency() != null) {
hasOtherManualMetadata = parameters.get(getOtherModeManualDateDependency()) != null;
}
if (manualMetadata == null && !hasOtherManualMetadata) {
return calculateWithoutConsideringManualMetadata(parameters);
} else {
return manualMetadata;
}
}
}
private LocalDate calculateWithoutConsideringManualMetadata(CalculatorParameters parameters) {
List<LocalDate> dates = parameters.get(getDatesDependency());
List<CopyRetentionRule> applicableCopyRules = parameters.get(applicableCopyRulesParam);
CopyRetentionRule mainCopyRule = parameters.get(mainCopyRuleParam);
int index = applicableCopyRules.indexOf(mainCopyRule);
if (index == 0 && dates.isEmpty()) {
return null;
} else {
return !dates.isEmpty() ? dates.get(index) : null;
}
}
abstract LocalDependency<List<LocalDate>> getDatesDependency();
@Override
public LocalDate getDefaultValue() {
return null;
}
@Override
public MetadataValueType getReturnType() {
return MetadataValueType.DATE;
}
@Override
public boolean isMultiValue() {
return false;
}
@Override
public List<? extends Dependency> getDependencies() {
List<Dependency> dependencies = new ArrayList<>();
dependencies.add(manualMetadataChoiceConfigDependency);
dependencies.add(applicableCopyRulesParam);
dependencies.add(mainCopyRuleParam);
dependencies.add(getDatesDependency());
dependencies.add(getManualDateDependency());
LocalDependency<LocalDate> otherModeManualDateDependency = getOtherModeManualDateDependency();
if (otherModeManualDateDependency != null) {
dependencies.add(otherModeManualDateDependency);
}
return dependencies;
}
protected abstract LocalDependency<LocalDate> getManualDateDependency();
protected abstract LocalDependency<LocalDate> getOtherModeManualDateDependency();
}