package com.constellio.app.modules.rm.ui.pages.decommissioning;
import com.constellio.app.modules.rm.RMConfigs;
import com.constellio.app.modules.rm.constants.RMPermissionsTo;
import com.constellio.app.modules.rm.navigation.RMViews;
import com.constellio.app.modules.rm.services.RMSchemasRecordsServices;
import com.constellio.app.modules.rm.services.decommissioning.DecommissioningListQueryFactory;
import com.constellio.app.modules.rm.services.decommissioning.DecommissioningSearchConditionFactory;
import com.constellio.app.modules.rm.services.decommissioning.DecommissioningSecurityService;
import com.constellio.app.modules.rm.services.decommissioning.SearchType;
import com.constellio.app.modules.rm.wrappers.DecommissioningList;
import com.constellio.app.ui.entities.MetadataSchemaVO;
import com.constellio.app.ui.entities.RecordVO;
import com.constellio.app.ui.entities.RecordVO.VIEW_MODE;
import com.constellio.app.ui.framework.builders.MetadataSchemaToVOBuilder;
import com.constellio.app.ui.framework.builders.RecordToVOBuilder;
import com.constellio.app.ui.framework.data.RecordVODataProvider;
import com.constellio.app.ui.pages.base.SingleSchemaBasePresenter;
import com.constellio.data.utils.ImpossibleRuntimeException;
import com.constellio.model.entities.records.Record;
import com.constellio.model.entities.records.wrappers.User;
import com.constellio.model.entities.schemas.MetadataSchema;
import com.constellio.model.services.search.SearchServices;
import com.constellio.model.services.search.query.logical.LogicalSearchQuery;
import java.util.ArrayList;
import java.util.List;
import static com.constellio.app.ui.i18n.i18n.$;
public class DecommissioningMainPresenter extends SingleSchemaBasePresenter<DecommissioningMainView> {
public static final String CREATE = "create";
public static final String GENERATED = "generated";
public static final String PENDING_VALIDATION = "pendingValidation";
public static final String TO_VALIDATE = "toValidate";
public static final String VALIDATED = "validated";
public static final String PENDING_APPROVAL = "pendingApproval";
public static final String TO_APPROVE = "toApprove";
public static final String APPROVED = "approved";
public static final String PROCESSED = "processed";
private transient RMSchemasRecordsServices rmRecordServices;
public DecommissioningMainPresenter(DecommissioningMainView view) {
super(view, DecommissioningList.DEFAULT_SCHEMA);
}
@Override
protected boolean hasPageAccess(String params, User user) {
return securityService().hasAccessToDecommissioningMainPage(user);
}
public List<String> getTabs() {
SearchServices service = searchServices();
List<String> result = new ArrayList<>();
for (String tabId : securityService().getVisibleTabsInDecommissioningMainPage(getCurrentUser())) {
if (CREATE.equals(tabId) || service.hasResults(getQueryForTab(tabId))) {
result.add(tabId);
}
}
return result;
}
public void tabSelected(String tabId) {
switch (tabId) {
case CREATE:
view.displayListCreation();
break;
case GENERATED:
case VALIDATED:
case APPROVED:
view.displayEditableTable(buildDataProvider(tabId));
break;
case PENDING_VALIDATION:
case TO_VALIDATE:
case PENDING_APPROVAL:
case TO_APPROVE:
case PROCESSED:
view.displayReadOnlyTable(buildDataProvider(tabId));
break;
default:
throw new ImpossibleRuntimeException("Unknown tabId + " + tabId);
}
}
public List<SearchType> getCriteriaForFoldersWithoutPlanifiedDate() {
return DecommissioningSearchConditionFactory.availableCriteriaForFoldersWithoutPlanifiedDate();
}
public List<SearchType> getCriteriaForFoldersWithPlanifiedDate() {
return DecommissioningSearchConditionFactory.availableCriteriaForFoldersWithPlanifiedDate();
}
public boolean isDocumentDecommissioningSupported() {
return new RMConfigs(modelLayerFactory.getSystemConfigurationsManager()).areDocumentRetentionRulesEnabled();
}
public List<SearchType> getCriteriaForDocuments() {
return DecommissioningSearchConditionFactory.availableCriteriaForDocuments();
}
public void creationRequested(SearchType type) {
view.navigate().to(RMViews.class).decommissioningListBuilder(type.toString());
}
public void displayButtonClicked(RecordVO entity) {
if (rmRecordServices().getDecommissioningList(entity.getId()).getDecommissioningListType().isFolderList()) {
view.navigate().to(RMViews.class).displayDecommissioningList(entity.getId());
} else {
view.navigate().to(RMViews.class).displayDocumentDecommissioningList(entity.getId());
}
}
public void editButtonClicked(RecordVO entity) {
view.navigate().to(RMViews.class).editDecommissioningList(entity.getId());
}
public void deleteButtonClicked(RecordVO entity) {
Record record = getRecord(entity.getId());
delete(record);
view.reloadCurrentTab();
}
public void backButtonClicked() {
view.navigate().to(RMViews.class).archiveManagement();
}
private LogicalSearchQuery getQueryForTab(String tabId) {
switch (tabId) {
case GENERATED:
if(presenterService().getCurrentUser(view.getSessionContext()).has(RMPermissionsTo.PROCESS_DECOMMISSIONING_LIST).onSomething()) {
return queryFactory().getGeneratedListsQuery(getCurrentUser());
} else {
return queryFactory().getGeneratedTransferListsQuery(getCurrentUser());
}
case PENDING_VALIDATION:
return queryFactory().getListsPendingValidationQuery(getCurrentUser());
case TO_VALIDATE:
return queryFactory().getListsToValidateQuery(getCurrentUser());
case VALIDATED:
return queryFactory().getValidatedListsQuery(getCurrentUser());
case PENDING_APPROVAL:
return queryFactory().getListsPendingApprovalQuery(getCurrentUser());
case TO_APPROVE:
return queryFactory().getListsToApproveQuery(getCurrentUser());
case APPROVED:
return queryFactory().getApprovedListsQuery(getCurrentUser());
case PROCESSED:
return queryFactory().getProcessedListsQuery(getCurrentUser());
default:
throw new ImpossibleRuntimeException("Unknown tabId: " + tabId);
}
}
private RecordVODataProvider buildDataProvider(final String tabId) {
MetadataSchema schema = rmRecordServices().decommissioningList.schema();
MetadataSchemaVO schemaVO = new MetadataSchemaToVOBuilder().build(schema, VIEW_MODE.TABLE, view.getSessionContext());
return new RecordVODataProvider(schemaVO, new RecordToVOBuilder(), modelLayerFactory, view.getSessionContext()) {
@Override
protected LogicalSearchQuery getQuery() {
return getQueryForTab(tabId);
}
};
}
private RMSchemasRecordsServices rmRecordServices() {
if (rmRecordServices == null) {
rmRecordServices = new RMSchemasRecordsServices(view.getCollection(), modelLayerFactory);
}
return rmRecordServices;
}
DecommissioningListQueryFactory queryFactory() {
return new DecommissioningListQueryFactory(collection, appLayerFactory);
}
private DecommissioningSecurityService securityService() {
return new DecommissioningSecurityService(collection, appLayerFactory);
}
String getDeleteConfirmMessage(RecordVO entity) {
String deleteConfirmMessage;
if (rmRecordServices.getDecommissioningList(entity.getId()).isApproved()) {
deleteConfirmMessage = $("DecommissioningMainView.deleteApprovedList");
} else {
deleteConfirmMessage = $("DecommissioningMainView.deleteList");
}
return deleteConfirmMessage;
}
public User getUser() {
return getCurrentUser();
}
}