package com.constellio.app.ui.framework.components.fields.lookup;
import static com.constellio.app.services.factories.ConstellioFactories.getInstance;
import static com.constellio.app.ui.application.ConstellioUI.getCurrentSessionContext;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import com.constellio.app.services.factories.ConstellioFactories;
import com.constellio.app.ui.application.ConstellioUI;
import com.constellio.app.ui.entities.UserVO;
import com.constellio.app.ui.framework.components.converters.TaxonomyCodeToCaptionConverter;
import com.constellio.app.ui.framework.components.converters.TaxonomyRecordIdToContextCaptionConverter;
import com.constellio.app.ui.framework.components.fields.autocomplete.BaseAutocompleteField;
import com.constellio.app.ui.framework.components.fields.autocomplete.BaseAutocompleteField.AutocompleteSuggestionsProvider;
import com.constellio.app.ui.framework.components.fields.autocomplete.RecordAutocompleteField;
import com.constellio.app.ui.framework.components.tree.LazyTree;
import com.constellio.app.ui.framework.components.tree.RecordLazyTree;
import com.constellio.app.ui.framework.data.LazyTreeDataProvider;
import com.constellio.app.ui.framework.data.RecordLookupTreeDataProvider;
import com.constellio.app.ui.framework.data.RecordTextInputDataProvider;
import com.constellio.app.ui.pages.base.SessionContext;
import com.constellio.model.entities.Taxonomy;
import com.constellio.model.entities.records.wrappers.User;
import com.constellio.model.services.factories.ModelLayerFactory;
import com.constellio.model.services.schemas.MetadataSchemasManager;
import com.constellio.model.services.taxonomies.TaxonomiesManager;
import com.constellio.model.services.users.UserServices;
public class LookupRecordField extends LookupField<String> {
private TaxonomyCodeToCaptionConverter captionConverter = new TaxonomyCodeToCaptionConverter();
public LookupRecordField(String schemaTypeCode) {
this(schemaTypeCode, null);
}
public LookupRecordField(String schemaTypeCode, String schemaCode) {
this(schemaTypeCode, schemaCode, false);
}
public LookupRecordField(String schemaTypeCode, boolean writeAccess,
RecordTextInputDataProvider recordTextInputDataProvider) {
this(schemaTypeCode, null, writeAccess, recordTextInputDataProvider);
}
public LookupRecordField(String schemaTypeCode, String schemaCode, boolean writeAccess,
RecordTextInputDataProvider recordTextInputDataProvider) {
this(recordTextInputDataProvider, getTreeDataProvider(schemaTypeCode, schemaCode, writeAccess));
}
public LookupRecordField(String schemaTypeCode, boolean writeAccess) {
this(schemaTypeCode, null, writeAccess);
}
public LookupRecordField(String schemaTypeCode, String schemaCode, boolean writeAccess) {
super(new RecordTextInputDataProvider(getInstance(), getCurrentSessionContext(), schemaTypeCode, schemaCode, writeAccess),
getTreeDataProvider(schemaTypeCode, schemaCode, writeAccess));
setItemConverter(new TaxonomyRecordIdToContextCaptionConverter());
}
public LookupRecordField(RecordTextInputDataProvider recordTextInputDataProvider,
LookupTreeDataProvider<String>[] lookupTreeDataProviders) {
super(recordTextInputDataProvider, lookupTreeDataProviders);
setItemConverter(new TaxonomyRecordIdToContextCaptionConverter());
}
private static LookupTreeDataProvider<String>[] getTreeDataProvider(String schemaTypeCode, String schemaCode,
boolean writeAccess) {
SessionContext sessionContext = ConstellioUI.getCurrentSessionContext();
String collection = sessionContext.getCurrentCollection();
UserVO currentUserVO = sessionContext.getCurrentUser();
ConstellioFactories constellioFactories = ConstellioFactories.getInstance();
ModelLayerFactory modelLayerFactory = constellioFactories.getModelLayerFactory();
UserServices userServices = modelLayerFactory.newUserServices();
MetadataSchemasManager metadataSchemasManager = modelLayerFactory.getMetadataSchemasManager();
TaxonomiesManager taxonomiesManager = modelLayerFactory.getTaxonomiesManager();
User currentUser = userServices.getUserInCollection(currentUserVO.getUsername(), collection);
List<Taxonomy> taxonomies;
if (schemaTypeCode != null) {
taxonomies = taxonomiesManager
.getAvailableTaxonomiesForSelectionOfType(schemaTypeCode, currentUser, metadataSchemasManager);
} else {
taxonomies = taxonomiesManager.getAvailableTaxonomiesForSchema(schemaCode, currentUser, metadataSchemasManager);
}
List<RecordLookupTreeDataProvider> dataProviders = new ArrayList<>();
for (Taxonomy taxonomy : taxonomies) {
String taxonomyCode = taxonomy.getCode();
if (StringUtils.isNotBlank(taxonomyCode)) {
dataProviders.add(new RecordLookupTreeDataProvider(schemaTypeCode, taxonomyCode, writeAccess));
}
}
return !dataProviders.isEmpty() ? dataProviders.toArray(new RecordLookupTreeDataProvider[0]) : null;
}
@Override
protected BaseAutocompleteField<String> newAutocompleteField(AutocompleteSuggestionsProvider<String> suggestionsProvider) {
return new RecordAutocompleteField(suggestionsProvider);
}
@Override
protected LazyTree<String> newLazyTree(LookupTreeDataProvider<String> lookupTreeDataProvider, int treeBufferSize) {
return new RecordLazyTree(lookupTreeDataProvider, treeBufferSize);
}
@Override
protected String getCaptionForLazyTree(LazyTreeDataProvider<String> lazyTreeDataProvider) {
String taxonomyCode = lazyTreeDataProvider.getTaxonomyCode();
return captionConverter.convertToPresentation(taxonomyCode, String.class, getLocale());
}
@Override
public Class<String> getType() {
return String.class;
}
SessionContext getSessionContext() {
return ConstellioUI.getCurrentSessionContext();
}
}