package com.constellio.app.ui.pages.management.schemas.display.report;
import com.constellio.app.modules.rm.services.RMSchemasRecordsServices;
import com.constellio.app.ui.entities.MetadataVO;
import com.constellio.app.ui.entities.ReportVO;
import com.constellio.app.ui.framework.builders.MetadataToVOBuilder;
import com.constellio.app.ui.framework.builders.ReportToVOBuilder;
import com.constellio.app.ui.framework.data.MetadataVODataProvider;
import com.constellio.app.ui.pages.base.BasePresenter;
import com.constellio.model.entities.CorePermissions;
import com.constellio.model.entities.Language;
import com.constellio.model.entities.records.Record;
import com.constellio.model.entities.records.wrappers.Report;
import com.constellio.model.entities.records.wrappers.User;
import com.constellio.model.entities.records.wrappers.structure.ReportedMetadata;
import com.constellio.model.entities.schemas.Metadata;
import com.constellio.model.entities.schemas.MetadataSchema;
import com.constellio.model.entities.schemas.MetadataSchemaType;
import com.constellio.model.entities.schemas.Schemas;
import com.constellio.model.services.reports.ReportServices;
import com.constellio.model.services.schemas.MetadataSchemasManager;
import org.apache.commons.lang3.StringUtils;
import java.util.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
public class ReportDisplayConfigPresenter extends BasePresenter<ReportConfigurationView>{
private Map<String, String> parameters;
private boolean isAddMode = true;
public ReportDisplayConfigPresenter(ReportConfigurationView view) {
super(view);
}
@Override
protected boolean hasPageAccess(String params, User user) {
return user.has(CorePermissions.MANAGE_METADATASCHEMAS).globally();
}
public MetadataVODataProvider getDataProvider() {
return new MetadataVODataProvider(new MetadataToVOBuilder(), modelLayerFactory, collection, getSchemaTypeCode()){
@Override
public List<MetadataVO> buildList() {
Set<String> metadataLocalCodeSet = new HashSet<>();
List<MetadataVO> schemaVOs = new ArrayList<>();
MetadataSchemaType type = schemaType(getSchemaTypeCode());
if (type != null) {
for(MetadataSchema schema:type.getAllSchemas()){
for (Metadata meta : schema.getMetadatas()) {
if ((!meta.isSystemReserved() || isSystemReservedAllowedInReport(meta)) && metadataLocalCodeSet.add(meta.getLocalCode())) {
MetadataVO metadataVO = voBuilder.build(meta, view.getSessionContext());
if(AllowedMetadataUtil.isAllowedMetadata(metadataVO)){
schemaVOs.add(metadataVO);
}
}
}
}
}
return schemaVOs;
}
};
}
public boolean isSystemReservedAllowedInReport(Metadata meta) {
List<String> allowedMetadatas = Arrays.asList(Schemas.IDENTIFIER.getLocalCode());
return allowedMetadatas.contains(meta.getLocalCode());
}
private String getSelectedReport() {
return view.getSelectedReport();
}
public void setParameters(Map<String, String> params) {
this.parameters = params;
}
public void saveButtonClicked(List<MetadataVO> metadataVOs) {
ReportServices reportServices = new ReportServices(modelLayerFactory, collection);
String reportTile = getSelectedReport();
String schemaTypeCode = getSchemaTypeCode();
Report report = reportServices.getReport(schemaTypeCode, reportTile);
if(report == null){
MetadataSchema reportSchema = schemaType(Report.SCHEMA_TYPE).getDefaultSchema();
Record newReportRecord = modelLayerFactory.newRecordServices().newRecordWithSchema(reportSchema);
report = new Report(newReportRecord, types());
report.setTitle(reportTile);
report.setSchemaTypeCode(schemaTypeCode);
}
report.setColumnsCount(metadataVOs.size());
report.setLinesCount(1);
List<ReportedMetadata> reportedMetadataList = buildReportedMetadataList(metadataVOs);
report.setReportedMetadata(reportedMetadataList);
reportServices.saveReport(getCurrentUser(), report);
view.navigate().to().listSchemaTypes();
}
private List<ReportedMetadata> buildReportedMetadataList(List<MetadataVO> metadataVOs) {
List<ReportedMetadata> returnList = new ArrayList<>();
for(int i = 0; i < metadataVOs.size(); i++){
MetadataVO metadataVO = metadataVOs.get(i);
returnList.add(new ReportedMetadata(metadataVO.getCode(), i));
}
return returnList;
}
public void deleteButtonClicked()
{
ReportServices reportServices = new ReportServices(modelLayerFactory, collection);
String schemaTypeCode = getSchemaTypeCode();
String reportTile = getSelectedReport();
Report report = reportServices.getReport(schemaTypeCode, reportTile);
reportServices.deleteReport(getCurrentUser(), report);
view.navigate().to().listSchemaTypes();
}
public void cancelButtonClicked() {
view.navigate().to().listSchemaTypes();
}
private MetadataSchemasManager getMetadataSchemasManager() {
return modelLayerFactory.getMetadataSchemasManager();
}
public String getSchemaTypeCode() {
return parameters.get("schemaTypeCode");
}
public List<ReportVO> getReports() {
List<ReportVO> returnList = new ArrayList<>();
ReportServices reportServices = new ReportServices(modelLayerFactory, collection);
List<Report> reports = reportServices.getReports(getSchemaTypeCode());
ReportToVOBuilder builder = new ReportToVOBuilder();
for(Report report: reports){
returnList.add(builder.build(report));
}
return returnList;
}
public List<MetadataVO> getReportMetadatas() {
List<MetadataVO> returnMetadataVOs = new ArrayList<>();
if(StringUtils.isBlank(getSelectedReport())){
return returnMetadataVOs;
}
ReportServices reportServices = new ReportServices(modelLayerFactory, view.getCollection());
Report report = reportServices.getReport(getSchemaTypeCode(), getSelectedReport());
if(report == null){
return returnMetadataVOs;
}
MetadataSchemasManager schemasManager = modelLayerFactory.getMetadataSchemasManager();
MetadataToVOBuilder builder = new MetadataToVOBuilder();
for(ReportedMetadata reportedMetadata : report.getReportedMetadata()){
Metadata metadata = schemasManager.getSchemaTypes(collection).getMetadata(reportedMetadata.getMetadataCode());
returnMetadataVOs.add(builder.build(metadata, view.getSessionContext()));
}
return returnMetadataVOs;
}
public String getSchemaName(String metadataCode) {
Language language = Language.withCode(view.getSessionContext().getCurrentLocale().getLanguage());
MetadataSchemasManager metadataSchemasManager = appLayerFactory.getModelLayerFactory().getMetadataSchemasManager();
int index = metadataCode.lastIndexOf("_");
return metadataSchemasManager.getSchemaTypes(collection).getSchema(metadataCode.substring(0, index))
.getLabel(language);
}
public boolean isAddMode() {
return isAddMode;
}
public void setAddMode(boolean addMode) {
isAddMode = addMode;
}
}