package com.constellio.app.modules.rm.ui.pages.decommissioning;
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.DecommissioningService;
import com.constellio.app.modules.rm.ui.builders.FolderDetailToVOBuilder;
import com.constellio.app.modules.rm.ui.entities.FolderDetailVO;
import com.constellio.app.modules.rm.wrappers.DecommissioningList;
import com.constellio.app.modules.rm.wrappers.structures.DecomListFolderDetail;
import com.constellio.app.modules.rm.wrappers.structures.DecomListValidation;
import com.constellio.app.modules.rm.wrappers.structures.FolderDetailWithType;
import com.constellio.app.ui.entities.RecordVO;
import com.constellio.app.ui.pages.base.BasePresenter;
import com.constellio.app.ui.pages.base.SchemaPresenterUtils;
import com.constellio.model.entities.records.Record;
import com.constellio.model.entities.records.wrappers.User;
import com.constellio.model.services.records.RecordServicesException;
import org.apache.commons.lang3.StringUtils;
import java.io.IOException;
import java.util.*;
public class OrderDecommissioningListPresenter extends BasePresenter<OrderDecommissioningListView> {
private Map<String, FolderDetailVO> folderDetailVOs;
private List<String> codeTitles;
private String recordId;
private transient RMSchemasRecordsServices rmRecordsServices;
private transient DecommissioningService decommissioningService;
private transient DecommissioningList decommissioningList;
private transient FolderDetailToVOBuilder folderDetailToVOBuilder;
private TableType type;
public enum TableType {
TO_VALIDATE, PACKAGEABLE, PROCESSABLE, EXCLUDED
}
public OrderDecommissioningListPresenter(OrderDecommissioningListView view) {
super(view);
codeTitles = new ArrayList<>();
}
public OrderDecommissioningListPresenter forParams(String params) {
if (StringUtils.isNotBlank(params)) {
String[] parts = params.split("/", 2);
String recordID = parts[0];
String type = parts[1];
forRecordId(recordID);
forType(type);
init();
}
return this;
}
public void forRecordId(String recordId) {
this.recordId = recordId;
}
public void forType(String type) {
this.type = TableType.valueOf(type);
}
public RecordVO getDecommissioningList() {
return presenterService().getRecordVO(recordId, RecordVO.VIEW_MODE.DISPLAY, view.getSessionContext());
}
private void readObject(java.io.ObjectInputStream stream)
throws IOException, ClassNotFoundException {
stream.defaultReadObject();
init();
}
private void init() {
folderDetailVOs = new HashMap<>();
for (FolderDetailWithType folderDetail : getLimitedFolderDetailsWithType()) {
FolderDetailVO folderDetailVO = folderDetailToVOBuilder().build(folderDetail);
folderDetailVOs.put(folderDetail.getFolderId(), folderDetailVO);
codeTitles.add(folderDetail.getFolderId());
}
}
@Override
protected boolean hasPageAccess(String params, User user) {
return user.has(RMPermissionsTo.EDIT_DECOMMISSIONING_LIST).globally();
}
public void displayButtonClicked(RecordVO recordVO) {
view.navigate().to(RMViews.class).displayDecommissioningList(recordVO.getId());
}
public void deleteButtonClicked(RecordVO recordVO) {
Record record = recordServices().getDocumentById(recordVO.getId());
recordServices().logicallyDelete(record, User.GOD);
recordServices().physicallyDelete(record, User.GOD);
view.navigate().to().listFacetConfiguration();
}
public void cancelButtonClicked() {
view.navigate().to(RMViews.class).displayDecommissioningList(decommissioningList().getId());
}
public void swap(String value, int offset) {
int current = codeTitles.indexOf(value);
try {
Collections.swap(codeTitles, current, current + offset);
} catch (Exception e) {
//
}
}
public void saveButtonClicked() {
List<DecomListFolderDetail> result = getAllFolderDetailsWithType();
List<DecomListFolderDetail> sortedResult = new ArrayList<>();
for(String id: codeTitles) {
for(DecomListFolderDetail folder: result) {
if(folder.getFolderId().equals(id)) {
sortedResult.add(folder);
break;
}
}
}
for(DecomListFolderDetail folder: result) {
if(!sortedResult.contains(folder)) {
sortedResult.add(folder);
}
}
try {
recordServices().update(decommissioningList().setFolderDetails(sortedResult));
} catch (RecordServicesException e) {
e.printStackTrace();
}
view.navigate().to(RMViews.class).displayDecommissioningList(decommissioningList().getId());
}
public String getLabelForCode(FolderDetailVO folderDetailVO) {
return recordServices().getDocumentById(folderDetailVO.getFolderId()).getTitle();
}
public Record toRecord(RecordVO recordVO) {
SchemaPresenterUtils schemaPresenterUtils = new SchemaPresenterUtils(recordVO.getSchema().getCode(),
view.getConstellioFactories(), view.getSessionContext());
return schemaPresenterUtils.toRecord(recordVO);
}
public List<FolderDetailVO> getFolderDetails() {
if (codeTitles == null) {
FolderDetailToVOBuilder builder = folderDetailToVOBuilder();
List<FolderDetailVO> result = new ArrayList<>();
for (FolderDetailWithType folder : getLimitedFolderDetailsWithType()) {
result.add(builder.build(folder));
}
return result;
} else {
FolderDetailToVOBuilder builder = folderDetailToVOBuilder();
List<FolderDetailVO> result = new ArrayList<>();
for (FolderDetailWithType folder : getLimitedFolderDetailsWithType()) {
result.add(builder.build(folder));
}
List<FolderDetailVO> sortedResult = new ArrayList<>();
for(String id: codeTitles) {
for(FolderDetailVO folderDetailVO: result) {
if(folderDetailVO.getFolderId().equals(id)) {
sortedResult.add(folderDetailVO);
break;
}
}
}
return sortedResult;
}
}
FolderDetailToVOBuilder folderDetailToVOBuilder() {
if (folderDetailToVOBuilder == null) {
folderDetailToVOBuilder = new FolderDetailToVOBuilder(rmRecordsServices());
}
return folderDetailToVOBuilder;
}
public DecommissioningList decommissioningList() {
if (decommissioningList == null) {
decommissioningList = rmRecordsServices().getDecommissioningList(recordId);
}
return decommissioningList;
}
DecommissioningService decommissioningService() {
if (decommissioningService == null) {
decommissioningService = new DecommissioningService(view.getCollection(), appLayerFactory);
}
return decommissioningService;
}
RMSchemasRecordsServices rmRecordsServices() {
if (rmRecordsServices == null) {
rmRecordsServices = new RMSchemasRecordsServices(view.getCollection(), appLayerFactory);
}
return rmRecordsServices;
}
public List<DecomListValidation> getValidations() {
return decommissioningList().getValidations();
}
private List<FolderDetailWithType> getFoldersToValidate() {
List<FolderDetailWithType> result = new ArrayList<>();
for (FolderDetailWithType folder : decommissioningList().getFolderDetailsWithType()) {
if (folder.isIncluded()) {
result.add(folder);
}
}
return result;
}
private List<FolderDetailWithType> getPackageableFolders() {
List<FolderDetailWithType> result = new ArrayList<>();
for (FolderDetailWithType folder : decommissioningList().getFolderDetailsWithType()) {
if (folder.isIncluded() && !decommissioningService().isFolderProcessable(decommissioningList(), folder) && !folder.getDetail().isPlacedInContainer()) {
result.add(folder);
}
}
return result;
}
private List<FolderDetailWithType> getProcessableFolders() {
List<FolderDetailWithType> result = new ArrayList<>();
for (FolderDetailWithType folder : decommissioningList().getFolderDetailsWithType()) {
if (folder.isIncluded() && (decommissioningService().isFolderProcessable(decommissioningList(), folder) || folder.getDetail().isPlacedInContainer())) {
result.add(folder);
}
}
return result;
}
private List<FolderDetailWithType> getExcludedFolders() {
List<FolderDetailWithType> result = new ArrayList<>();
for (FolderDetailWithType folder : decommissioningList().getFolderDetailsWithType()) {
if (folder.isExcluded()) {
result.add(folder);
}
}
return result;
}
private List<FolderDetailWithType> getLimitedFolderDetailsWithType() {
switch (type) {
case TO_VALIDATE:
return getFoldersToValidate();
case PACKAGEABLE:
return getPackageableFolders();
case PROCESSABLE:
return getProcessableFolders();
case EXCLUDED:
return getExcludedFolders();
default:
return new ArrayList<>();
}
}
private List<DecomListFolderDetail> getAllFolderDetailsWithType() {
return decommissioningList().getFolderDetails();
}
}