package com.constellio.app.modules.rm.reports.model.administration.plan;
import com.constellio.app.extensions.AppLayerCollectionExtensions;
import com.constellio.app.extensions.AppLayerSystemExtensions;
import com.constellio.app.modules.rm.ConstellioRMModule;
import com.constellio.app.modules.rm.constants.RMTaxonomies;
import com.constellio.app.modules.rm.extensions.api.RMModuleExtensions;
import com.constellio.app.modules.rm.reports.builders.administration.plan.AdministrativeUnitReportParameters;
import com.constellio.app.modules.rm.reports.model.administration.plan.AdministrativeUnitReportModel.AdministrativeUnitReportModel_AdministrativeUnit;
import com.constellio.app.modules.rm.reports.model.administration.plan.AdministrativeUnitReportModel.AdministrativeUnitReportModel_User;
import com.constellio.app.modules.rm.services.RMSchemasRecordsServices;
import com.constellio.app.modules.rm.wrappers.AdministrativeUnit;
import com.constellio.app.services.factories.AppLayerFactory;
import com.constellio.app.ui.framework.components.NewReportPresenter;
import com.constellio.app.ui.framework.reports.NewReportWriterFactory;
import com.constellio.model.conf.FoldersLocator;
import com.constellio.model.entities.records.Record;
import com.constellio.model.entities.records.wrappers.User;
import com.constellio.model.entities.schemas.MetadataSchemaTypes;
import com.constellio.model.entities.security.Role;
import com.constellio.model.services.factories.ModelLayerFactory;
import com.constellio.model.services.search.query.ReturnedMetadatasFilter;
import com.constellio.model.services.security.AuthorizationsServices;
import com.constellio.model.services.taxonomies.TaxonomiesSearchOptions;
import com.constellio.model.services.taxonomies.TaxonomiesSearchServices;
import com.constellio.model.services.taxonomies.TaxonomySearchRecord;
import org.apache.commons.lang.StringUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import static com.constellio.app.ui.i18n.i18n.$;
import static java.util.Arrays.asList;
public class AdministrativeUnitReportPresenter implements NewReportPresenter {
private String collection;
private MetadataSchemaTypes types;
private TaxonomiesSearchOptions searchOptions;
private TaxonomiesSearchServices searchService;
private RMSchemasRecordsServices rmSchemasRecordsServices;
private AuthorizationsServices authorizationsServices;
private boolean withUsers;
protected transient ModelLayerFactory modelLayerFactory;
protected transient AppLayerCollectionExtensions appCollectionExtentions;
protected transient AppLayerSystemExtensions appSystemExtentions;
public AdministrativeUnitReportPresenter(String collection, AppLayerFactory appLayerFactory) {
this(collection, appLayerFactory, true);
}
public AdministrativeUnitReportPresenter(String collection, AppLayerFactory appLayerFactory, boolean withUsers) {
this.collection = collection;
this.modelLayerFactory = appLayerFactory.getModelLayerFactory();
this.appCollectionExtentions = appLayerFactory.getExtensions().forCollection(collection);
this.appSystemExtentions = appLayerFactory.getExtensions().getSystemWideExtensions();
this.withUsers = withUsers;
}
public AdministrativeUnitReportModel build() {
init();
AdministrativeUnitReportModel model = new AdministrativeUnitReportModel();
if (withUsers) {
model.setDetailed(true);
} else {
model.setDetailed(false);
}
List<TaxonomySearchRecord> taxonomySearchRecords = searchService.getLinkableRootConcept(User.GOD, collection,
RMTaxonomies.ADMINISTRATIVE_UNITS, AdministrativeUnit.SCHEMA_TYPE, searchOptions);
List<AdministrativeUnitReportModel_AdministrativeUnit> modelAdministrativeUnits = getUnits(taxonomySearchRecords);
model.setAdministrativeUnits(modelAdministrativeUnits);
return model;
}
private List<AdministrativeUnitReportModel_AdministrativeUnit> getUnits(
List<TaxonomySearchRecord> taxonomySearchRecords) {
List<AdministrativeUnitReportModel_AdministrativeUnit> modelAdministrativeUnits = new ArrayList<>();
for (TaxonomySearchRecord taxonomySearchRecord : taxonomySearchRecords) {
if (taxonomySearchRecord != null) {
Record administrativeUnitRecord = taxonomySearchRecord.getRecord();
if (administrativeUnitRecord != null) {
AdministrativeUnit administrativeUnit = new AdministrativeUnit(administrativeUnitRecord, types);
if (administrativeUnit != null) {
AdministrativeUnitReportModel_AdministrativeUnit modelAdministrativeUnit = new AdministrativeUnitReportModel_AdministrativeUnit();
String unitId = StringUtils.defaultString(administrativeUnit.getId());
String title = StringUtils.defaultString(administrativeUnit.getTitle());
String code = StringUtils.defaultString(administrativeUnit.getCode());
String description = StringUtils.defaultString(administrativeUnit.getDescription());
modelAdministrativeUnit.setUnitId(unitId);
modelAdministrativeUnit.setLabel(title);
modelAdministrativeUnit.setCode(code);
modelAdministrativeUnit.setDescription(description);
modelAdministrativeUnit.setUsers(getUsersFrom(administrativeUnit));
modelAdministrativeUnit.setChildAdministrativeUnits(getChildUnits(administrativeUnitRecord));
modelAdministrativeUnits.add(modelAdministrativeUnit);
}
}
}
}
return modelAdministrativeUnits;
}
private List<AdministrativeUnitReportModel_AdministrativeUnit> getChildUnits(Record parentRecord) {
List<AdministrativeUnitReportModel_AdministrativeUnit> children = new ArrayList<>();
if (parentRecord != null) {
List<TaxonomySearchRecord> childTaxonomySearchRecords = searchService.getLinkableChildConcept(User.GOD,
parentRecord, RMTaxonomies.ADMINISTRATIVE_UNITS, AdministrativeUnit.SCHEMA_TYPE, searchOptions);
if (childTaxonomySearchRecords != null) {
for (TaxonomySearchRecord childTaxonomySearchRecord : childTaxonomySearchRecords) {
if (childTaxonomySearchRecord != null) {
Record administrativeUnitRecord = childTaxonomySearchRecord.getRecord();
if (administrativeUnitRecord != null) {
AdministrativeUnit administrativeUnit = new AdministrativeUnit(administrativeUnitRecord,
types);
AdministrativeUnitReportModel_AdministrativeUnit modelAdministrativeUnit = new AdministrativeUnitReportModel_AdministrativeUnit();
String unitId = StringUtils.defaultString(administrativeUnit.getId());
modelAdministrativeUnit.setUnitId(unitId);
String title = StringUtils.defaultString(administrativeUnit.getTitle());
modelAdministrativeUnit.setLabel(title);
String code = StringUtils.defaultString(administrativeUnit.getCode());
modelAdministrativeUnit.setCode(code);
String description = StringUtils.defaultString(administrativeUnit.getDescription());
modelAdministrativeUnit.setDescription(description);
modelAdministrativeUnit.setUsers(getUsersFrom(administrativeUnit));
modelAdministrativeUnit
.setChildAdministrativeUnits(getChildUnits(administrativeUnitRecord));
children.add(modelAdministrativeUnit);
}
}
}
}
}
return children;
}
private List<AdministrativeUnitReportModel_User> getUsersFrom(AdministrativeUnit administrativeUnit) {
Map<String, AdministrativeUnitReportModel_User> modelUsers = new TreeMap<>();
if (withUsers) {
List<User> users = authorizationsServices.getUsersWithRoleForRecord(Role.WRITE,
rmSchemasRecordsServices.getAdministrativeUnit(administrativeUnit.getId()).getWrappedRecord());
for (User user : users) {
AdministrativeUnitReportModel_User modelUser = new AdministrativeUnitReportModel_User();
String firstName = StringUtils.defaultString(user.getFirstName());
modelUser.setFirstName(firstName);
String lastName = StringUtils.defaultString(user.getLastName());
modelUser.setLastName(lastName);
String userName = StringUtils.defaultString(user.getUsername());
modelUser.setUserName(userName);
String email = StringUtils.defaultString(user.getEmail());
modelUser.setEmail(email);
modelUsers.put(modelUser.getUserName(), modelUser);
}
}
List<AdministrativeUnitReportModel_User> modelUsersList = new ArrayList<>(modelUsers.values());
return modelUsersList;
}
private void init() {
types = modelLayerFactory.getMetadataSchemasManager().getSchemaTypes(collection);
searchOptions = new TaxonomiesSearchOptions().setReturnedMetadatasFilter(ReturnedMetadatasFilter.all()).setRows(1000);
searchService = modelLayerFactory.newTaxonomiesSearchService();
rmSchemasRecordsServices = new RMSchemasRecordsServices(collection, modelLayerFactory);
authorizationsServices = modelLayerFactory.newAuthorizationsServices();
}
public boolean isWithUsers() {
return withUsers;
}
public FoldersLocator getFoldersLocator() {
return modelLayerFactory.getFoldersLocator();
}
@Override
public List<String> getSupportedReports() {
return asList($("Reports.AdministrativeUnits"));
}
@Override
public NewReportWriterFactory getReport(String report) {
RMModuleExtensions rmModuleExtensions = appCollectionExtentions.forModule(ConstellioRMModule.ID);
return rmModuleExtensions.getReportBuilderFactories().transferContainerRecordBuilderFactory.getValue();
}
@Override
public AdministrativeUnitReportParameters getReportParameters(String report) {
return new AdministrativeUnitReportParameters(withUsers);
}
}