package com.constellio.app.modules.rm.ui.components.folder.fields;
import com.constellio.app.modules.rm.wrappers.Category;
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.fields.lookup.LookupRecordField;
import com.constellio.app.ui.framework.data.RecordLookupTreeDataProvider;
import com.constellio.app.ui.framework.data.RecordTextInputDataProvider;
import com.constellio.app.ui.framework.data.trees.LinkableRecordTreeNodesDataProvider;
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.entities.schemas.MetadataSchemaType;
import com.constellio.model.services.factories.ModelLayerFactory;
import com.constellio.model.services.schemas.MetadataSchemasManager;
import com.constellio.model.services.search.query.logical.condition.LogicalSearchCondition;
import com.constellio.model.services.taxonomies.TaxonomiesManager;
import com.constellio.model.services.taxonomies.TaxonomiesSearchFilter;
import com.constellio.model.services.users.UserServices;
import org.apache.commons.lang.StringUtils;
import java.util.ArrayList;
import java.util.List;
import static com.constellio.app.services.factories.ConstellioFactories.getInstance;
import static com.constellio.app.ui.application.ConstellioUI.getCurrentSessionContext;
import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.anyConditions;
import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.from;
public class FolderCategoryFieldImpl extends LookupRecordField implements FolderCategoryField {
public FolderCategoryFieldImpl() {
this(Category.SCHEMA_TYPE, null, false);
}
private FolderCategoryFieldImpl(String schemaTypeCode, String schemaCode, boolean writeAccess) {
super(new RecordTextInputDataProvider(getInstance(), getCurrentSessionContext(), schemaTypeCode, schemaCode, writeAccess), getTreeDataProvider(schemaTypeCode, schemaCode, writeAccess));
}
@Override
public String getFieldValue() {
return (String) getConvertedValue();
}
@Override
public void setFieldValue(Object value) {
setInternalValue((String) value);
}
private static LookupTreeDataProvider<String>[] getTreeDataProvider(final String schemaTypeCode, final String schemaCode,
boolean writeAccess) {
SessionContext sessionContext = ConstellioUI.getCurrentSessionContext();
final String collection = sessionContext.getCurrentCollection();
UserVO currentUserVO = sessionContext.getCurrentUser();
ConstellioFactories constellioFactories = getInstance();
final 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, writeAccess, getDataProvider(taxonomyCode,constellioFactories, sessionContext)));
}
}
return !dataProviders.isEmpty() ? dataProviders.toArray(new RecordLookupTreeDataProvider[0]) : null;
}
static public LinkableRecordTreeNodesDataProvider getDataProvider(String taxonomyCode, ConstellioFactories constellioFactories, SessionContext sessionContext) {
MetadataSchemaType categoryType = constellioFactories.getModelLayerFactory().getMetadataSchemasManager()
.getSchemaTypes(sessionContext.getCurrentCollection()).getSchemaType(Category.SCHEMA_TYPE);
LogicalSearchCondition searchCondition = from(categoryType).where(categoryType.getDefaultSchema().get(Category.DEACTIVATE)).isNotEqual(true);
TaxonomiesSearchFilter taxonomiesSearchFilter = new TaxonomiesSearchFilter();
taxonomiesSearchFilter.setLinkableConceptsCondition(searchCondition);
return new LinkableRecordTreeNodesDataProvider(taxonomyCode, Category.SCHEMA_TYPE, false, taxonomiesSearchFilter);
}
}