package com.constellio.app.modules.rm.reports.model.administration.plan;
import com.constellio.app.modules.rm.constants.RMTaxonomies;
import com.constellio.app.modules.rm.reports.model.administration.plan.AvailableSpaceReportModel.AvailableSpaceReportModelNode;
import com.constellio.app.modules.rm.services.RMSchemasRecordsServices;
import com.constellio.app.modules.rm.wrappers.ContainerRecord;
import com.constellio.app.modules.rm.wrappers.StorageSpace;
import com.constellio.model.conf.FoldersLocator;
import com.constellio.model.entities.records.Record;
import com.constellio.model.entities.schemas.MetadataSchemaTypes;
import com.constellio.model.services.factories.ModelLayerFactory;
import com.constellio.model.services.search.SearchServices;
import com.constellio.model.services.search.query.ReturnedMetadatasFilter;
import com.constellio.model.services.search.query.logical.LogicalSearchQuery;
import com.constellio.model.services.search.query.logical.condition.LogicalSearchCondition;
import com.constellio.model.services.taxonomies.ConceptNodesTaxonomySearchServices;
import com.constellio.model.services.taxonomies.TaxonomiesSearchOptions;
import com.constellio.model.services.taxonomies.TaxonomiesSearchServices;
import java.util.List;
import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.from;
/**
* Created by Charles Blanchette on 2017-02-20.
*/
public class AvailableSpaceReportPresenter {
private String collection;
private ModelLayerFactory modelLayerFactory;
private TaxonomiesSearchOptions searchOptions;
private TaxonomiesSearchServices taxonomiesSearchServices;
private SearchServices searchServices;
private RMSchemasRecordsServices rm;
private ConceptNodesTaxonomySearchServices conceptNodesTaxonomySearchServices;
private MetadataSchemaTypes types;
private boolean showFullSpaces;
public AvailableSpaceReportPresenter(String collection, ModelLayerFactory modelLayerFactory) {
this.collection = collection;
this.modelLayerFactory = modelLayerFactory;
}
public AvailableSpaceReportPresenter(String collection, ModelLayerFactory modelLayerFactory, boolean showFullSpaces) {
this.collection = collection;
this.modelLayerFactory = modelLayerFactory;
this.showFullSpaces = showFullSpaces;
}
public AvailableSpaceReportModel build() {
init();
AvailableSpaceReportModel model = new AvailableSpaceReportModel();
model.setShowFullSpaces(showFullSpaces);
List<Record> rootStorageSpaces = conceptNodesTaxonomySearchServices
.getRootConcept(collection, RMTaxonomies.STORAGES, searchOptions.setRows(10000));
if (rootStorageSpaces != null) {
for (Record rootRecord : rootStorageSpaces) {
AvailableSpaceReportModelNode parent = new AvailableSpaceReportModelNode();
StorageSpace storageSpace = new StorageSpace(rootRecord, types);
parent.setCode(storageSpace.getCode()).setTitle(rootRecord.getTitle()).setImage("etagere")
.setCapacity(storageSpace.getCapacity() != null ? storageSpace.getCapacity() : 0)
.setAvailableSpace(storageSpace.getAvailableSize() != null ? storageSpace.getAvailableSize() : 0);
List<Record> childStorageSpaces = conceptNodesTaxonomySearchServices.getChildConcept(rootRecord, searchOptions.setRows(10000));
if (childStorageSpaces != null) {
createChildRow(parent, childStorageSpaces);
}
if(showFullSpaces || !(parent.getChildrenNodes() == null || parent.getChildrenNodes().isEmpty()) || parent.getAvailableSpace() > 0.0) {
model.getRootNodes().add(parent);
}
}
}
return model;
}
private void createChildRow(AvailableSpaceReportModelNode parent, List<Record> childStorageSpaces) {
for (Record childRecord : childStorageSpaces) {
AvailableSpaceReportModelNode child = new AvailableSpaceReportModelNode();
StorageSpace storageSpace = new StorageSpace(childRecord, types);
child.setCode(storageSpace.getCode()).setImage("etagere")
.setCapacity(storageSpace.getCapacity() != null ? storageSpace.getCapacity() : 0)
.setTitle(childRecord.getTitle()).setAvailableSpace(storageSpace.getAvailableSize() != null ? storageSpace.getAvailableSize() : 0);
List<Record> subChildStorageSpaces = conceptNodesTaxonomySearchServices.getChildConcept(childRecord, searchOptions.setRows(10000));
if (subChildStorageSpaces != null) {
createChildRow(child, subChildStorageSpaces);
}
LogicalSearchCondition condition = from(rm.containerRecord.schemaType()).where(rm.containerRecord.storageSpace()).isEqualTo(storageSpace);
LogicalSearchQuery query = new LogicalSearchQuery(condition);
List<ContainerRecord> containerRecords = rm.searchContainerRecords(query);
if (containerRecords != null) {
createContainerRecordRow(child, containerRecords);
}
if(showFullSpaces || !(child.getChildrenNodes() == null || child.getChildrenNodes().isEmpty()) || child.getAvailableSpace() > 0.0) {
parent.getChildrenNodes().add(child);
}
}
}
private void createContainerRecordRow(AvailableSpaceReportModelNode parent, List<ContainerRecord> containerRecords) {
for (ContainerRecord boite : containerRecords) {
AvailableSpaceReportModelNode childBox = new AvailableSpaceReportModelNode();
childBox.setTitle(boite.getTitle()).setCode(boite.getId()).setImage("boite")
.setCapacity(boite.getCapacity() != null ? boite.getCapacity() : 0)
.setAvailableSpace(boite.getAvailableSize() != null ? boite.getAvailableSize() : 0);
if(showFullSpaces || childBox.getAvailableSpace() > 0.0) {
parent.getChildrenNodes().add(childBox);
}
}
}
private void init() {
types = modelLayerFactory.getMetadataSchemasManager().getSchemaTypes(collection);
searchOptions = new TaxonomiesSearchOptions().setReturnedMetadatasFilter(ReturnedMetadatasFilter.all());
taxonomiesSearchServices = modelLayerFactory.newTaxonomiesSearchService();
rm = new RMSchemasRecordsServices(collection, modelLayerFactory);
searchServices = modelLayerFactory.newSearchServices();
conceptNodesTaxonomySearchServices = new ConceptNodesTaxonomySearchServices(modelLayerFactory);
}
public FoldersLocator getFoldersLocator() {
return modelLayerFactory.getFoldersLocator();
}
}