package com.constellio.app.modules.rm.ui.components.copyRetentionRule;
import com.constellio.app.modules.rm.ui.components.copyRetentionRule.fields.copyRetentionRule.CopyRetentionRuleField;
import com.constellio.app.modules.rm.ui.components.copyRetentionRule.fields.copyRetentionRule.CopyRetentionRuleFieldImpl;
import com.constellio.app.modules.rm.ui.components.copyRetentionRule.fields.retentionRule.CopyRetentionRuleDependencyField;
import com.constellio.app.modules.rm.ui.components.copyRetentionRule.fields.retentionRule.DocumentCopyRetentionRuleDependencyFieldImpl;
import com.constellio.app.modules.rm.ui.components.copyRetentionRule.fields.retentionRule.FolderCopyRetentionruleDependencyFieldImpl;
import com.constellio.app.modules.rm.wrappers.Document;
import com.constellio.app.modules.rm.wrappers.Folder;
import com.constellio.app.services.factories.ConstellioFactories;
import com.constellio.app.ui.application.ConstellioUI;
import com.constellio.app.ui.entities.MetadataVO;
import com.constellio.app.ui.entities.RecordVO;
import com.constellio.app.ui.framework.components.RecordFieldFactory;
import com.constellio.app.ui.pages.base.SessionContext;
import com.constellio.model.services.search.query.logical.LogicalSearchQuery;
import com.vaadin.ui.Field;
import org.apache.commons.lang3.StringUtils;
import java.util.Arrays;
import java.util.List;
public class RecordWithCopyRetentionRuleFieldFactory extends RecordFieldFactory
implements RecordWithCopyRetentionRuleParametersFields {
static final private List<String> folderSpecificFieldsMetadataLocaleCodes = Arrays
.asList(Folder.RETENTION_RULE_ENTERED, Folder.MAIN_COPY_RULE_ID_ENTERED
, Folder.COPY_STATUS);
static final private List<String> documentSpecificMetadataLocaleCodes = Arrays
.asList(Document.FOLDER, Document.MAIN_COPY_RULE_ID_ENTERED);
private FolderCopyRetentionruleDependencyFieldImpl folderCopyRetentionRuleDependencyField;
private DocumentCopyRetentionRuleDependencyFieldImpl documentCopyRetentionRuleDependencyField;
private CopyRetentionRuleFieldImpl copyRetentionRuleField;
private RecordWithCopyRetentionRuleParametersPresenter presenter;
private final String recordIdThatCopyRetentionRuleDependantOn, selectedTypeId, schemaType;
private final List<String> selectedRecords;
private final LogicalSearchQuery query;
public RecordWithCopyRetentionRuleFieldFactory(String schemaType, String recordIdThatCopyRetentionRuleDependantOn,
String selectedTypeId, LogicalSearchQuery query, List<String> selectedRecords) {
this.presenter = new RecordWithCopyRetentionRuleParametersPresenter(this);
this.schemaType = schemaType;
this.recordIdThatCopyRetentionRuleDependantOn = recordIdThatCopyRetentionRuleDependantOn;
this.selectedTypeId = selectedTypeId;
this.query = query;
this.selectedRecords = selectedRecords;
}
@Override
public Field<?> build(RecordVO recordVO, MetadataVO metadataVO) {
Field<?> field;
String code = MetadataVO.getCodeWithoutPrefix(metadataVO.getCode());
if (schemaType.equals(Folder.SCHEMA_TYPE) &&
folderSpecificFieldsMetadataLocaleCodes.contains(code)) {
field = buildFolderSpecificFields(recordVO, metadataVO);
super.postBuild(field, recordVO, metadataVO);
} else if (schemaType.equals(Document.SCHEMA_TYPE) &&
documentSpecificMetadataLocaleCodes.contains(code)) {
field = buildDocumentSpecificFields(recordVO, metadataVO);
super.postBuild(field, recordVO, metadataVO);
} else {
field = super.build(recordVO, metadataVO);
}
return field;
}
private Field<?> buildDocumentSpecificFields(RecordVO recordVO, MetadataVO metadataVO) {
Field<?> field;
if (documentCopyRetentionRuleDependencyField == null) {
documentCopyRetentionRuleDependencyField = new DocumentCopyRetentionRuleDependencyFieldImpl(
presenter.fields.getSessionContext().getCurrentCollection());
copyRetentionRuleField = new CopyRetentionRuleFieldImpl();
presenter.rmFieldsCreated();
if (StringUtils.isNotBlank(recordIdThatCopyRetentionRuleDependantOn)) {
documentCopyRetentionRuleDependencyField.setFieldValue(recordIdThatCopyRetentionRuleDependantOn);
} else {
presenter.updateFields();
}
}
if (Document.MAIN_COPY_RULE_ID_ENTERED.equals(metadataVO.getLocalCode())) {
field = copyRetentionRuleField;
} else {
field = documentCopyRetentionRuleDependencyField;
}
return field;
}
private Field<?> buildFolderSpecificFields(RecordVO recordVO, MetadataVO metadataVO) {
Field<?> field;
if (folderCopyRetentionRuleDependencyField == null) {
folderCopyRetentionRuleDependencyField = new FolderCopyRetentionruleDependencyFieldImpl(
presenter.fields.getSessionContext().getCurrentCollection());
copyRetentionRuleField = new CopyRetentionRuleFieldImpl();
presenter.rmFieldsCreated();
if (StringUtils.isNotBlank(recordIdThatCopyRetentionRuleDependantOn)) {
folderCopyRetentionRuleDependencyField.setFieldValue(recordIdThatCopyRetentionRuleDependantOn);
} else {
presenter.updateFields();
}
}
if (Folder.MAIN_COPY_RULE_ID_ENTERED.equals(metadataVO.getLocalCode())) {
field = copyRetentionRuleField;
} else {
field = folderCopyRetentionRuleDependencyField;
}
return field;
}
@Override
public SessionContext getSessionContext() {
return ConstellioUI.getCurrentSessionContext();
}
@Override
public ConstellioFactories getConstellioFactories() {
return ConstellioUI.getCurrent().getConstellioFactories();
}
@Override
public CopyRetentionRuleDependencyField getCopyRetentionRuleDependencyField() {
if (schemaType.equals(Folder.SCHEMA_TYPE)) {
return folderCopyRetentionRuleDependencyField;
} else if (schemaType.equals(Document.SCHEMA_TYPE)) {
return documentCopyRetentionRuleDependencyField;
} else {
throw new RuntimeException("Unsupported for record type " + schemaType);
}
}
@Override
public CopyRetentionRuleField getCopyRetentionRuleField() {
return copyRetentionRuleField;
}
@Override
public String getSchemaType() {
return schemaType;
}
@Override
public LogicalSearchQuery getQuery() {
return query;
}
@Override
public List<String> getSelectedRecords() {
return selectedRecords;
}
@Override
public String getType() {
return selectedTypeId;
}
}