package com.constellio.app.modules.es.ui.pages.mapping;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import com.constellio.app.modules.es.model.connectors.ConnectorInstance;
import com.constellio.app.modules.es.navigation.ESViews;
import com.constellio.app.modules.es.services.mapping.ConnectorField;
import com.constellio.app.modules.es.services.mapping.TargetParams;
import com.constellio.app.modules.es.ui.entities.MappingVO;
import com.constellio.app.ui.entities.MetadataSchemaVO;
import com.constellio.app.ui.entities.MetadataVO;
import com.constellio.app.ui.entities.RecordVO.VIEW_MODE;
import com.constellio.app.ui.framework.builders.MetadataSchemaToVOBuilder;
import com.constellio.app.ui.framework.builders.MetadataToVOBuilder;
import com.constellio.model.entities.schemas.Metadata;
import com.constellio.model.entities.schemas.MetadataValueType;
public class AddEditMappingPresenter extends MappingsPresenter<AddEditMappingView> {
private String documentType;
private String metadataCode;
private boolean editMode;
private MetadataSchemaVO schema;
public AddEditMappingPresenter(AddEditMappingView view) {
super(view);
}
public AddEditMappingPresenter forParams(String parameters) {
String[] parts = parameters.split("/");
instanceId = parts[0];
documentType = parts[1];
if (parts.length == 3) {
metadataCode = parts[2];
editMode = true;
} else {
editMode = false;
}
schema = new MetadataSchemaToVOBuilder()
.build(schema(documentType + "_" + instanceId), VIEW_MODE.DISPLAY, view.getSessionContext());
return this;
}
public MappingVO getMapping() {
return editMode ? buildMappingVO() : new MappingVO();
}
public List<MetadataVO> getAvailableTargetMetadata() {
MetadataToVOBuilder builder = new MetadataToVOBuilder();
Set<String> used = getUsedTargets();
List<MetadataVO> result = new ArrayList<>();
for (Metadata metadata : mappingService().getTargetMetadata(connectorInstance(), documentType)) {
if (!used.contains(metadata.getLocalCode())) {
result.add(builder.build(metadata, schema, view.getSessionContext()));
}
}
return result;
}
public Collection<MetadataValueType> getApplicableTypes() {
Set<MetadataValueType> result = new HashSet<>();
for (ConnectorField field : mappingService().getConnectorFields(connectorInstance(), documentType)) {
result.add(field.getType());
}
return result;
}
public List<ConnectorField> getApplicableSourceFields(MappingVO mapping) {
List<ConnectorField> result = new ArrayList<>();
for (ConnectorField field : mappingService().getConnectorFields(connectorInstance(), documentType)) {
if (field.getType().equals(mapping.getMetadataType())) {
result.add(field);
}
}
return result;
}
public boolean isEditMode() {
return editMode;
}
public boolean canEditMetadata() {
return !editMode;
}
public MetadataVO metadataCreationRequested(TargetParams target) {
Metadata metadata = mappingService().createTargetMetadata(connectorInstance(), documentType, target);
return new MetadataToVOBuilder().build(metadata, schema, view.getSessionContext());
}
public void metadataSelected(MappingVO mapping, MetadataVO metadata) {
MetadataVO previous = mapping.getMetadata();
mapping.setMetadata(metadata);
metadataCode = metadata.getLocalCode();
if (previous == null || !previous.getType().equals(metadata.getType())) {
mapping.setFields(new ArrayList<ConnectorField>());
view.resetSources();
}
}
public boolean canAddFieldsTo(MappingVO mapping) {
return mapping.getMetadata() != null;
}
public void fieldAdditionRequested(MappingVO mapping) {
mapping.getFields().add(null);
view.resetSources();
}
public void fieldRemovalRequested(MappingVO mapping, ConnectorField field) {
mapping.getFields().remove(field);
view.resetSources();
}
public boolean canSave(MappingVO mapping) {
if (mapping.getMetadata() == null || mapping.getFields().isEmpty()) {
return false;
}
for (ConnectorField field : mapping.getFields()) {
if (field == null) {
return false;
}
}
return true;
}
public void saveButtonClicked(MappingVO mappingVO) {
Map<String, List<String>> mapping = mappingService().getMapping(connectorInstance(), documentType);
mapping.put(mappingVO.getMetadataLocalCode(), mappingVO.getFieldIds());
ConnectorInstance instance = mappingService().setMapping(connectorInstance(), documentType, mapping);
addOrUpdate(instance.getWrappedRecord());
view.navigate().to(ESViews.class).displayConnectorMappings(instanceId);
}
public void cancelButtonClicked() {
view.navigate().to(ESViews.class).displayConnectorMappings(instanceId);
}
private MappingVO buildMappingVO() {
Map<String, ConnectorField> fields = getFieldMapById(documentType);
List<ConnectorField> mappedFields = new ArrayList<>();
for (String field : mappingService().getMapping(connectorInstance(), documentType).get(metadataCode)) {
mappedFields.add(fields.get(field));
}
return new MappingVO(getMetadataVO(documentType + "_" + instanceId + "_" + metadataCode), mappedFields);
}
private Set<String> getUsedTargets() {
Set<String> result = mappingService().getMapping(connectorInstance(), documentType).keySet();
result.remove(metadataCode);
return result;
}
}