package com.constellio.app.entities.schemasDisplay;
import static java.util.Arrays.asList;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class SchemaDisplayConfig {
private final String schemaCode;
private final String collection;
private final List<String> displayMetadataCodes;
private final List<String> formMetadataCodes;
private final List<String> searchResultsMetadataCodes;
private final List<String> tableMetadataCodes;
public SchemaDisplayConfig(String collection, String schemaCode, List<String> displayMetadataCodes,
List<String> formMetadataCodes, List<String> searchResultsMetadataCodes, List<String> tableMetadataCodes) {
this.collection = collection;
this.schemaCode = schemaCode;
this.displayMetadataCodes = Collections.unmodifiableList(displayMetadataCodes);
this.formMetadataCodes = Collections.unmodifiableList(formMetadataCodes);
this.searchResultsMetadataCodes = Collections.unmodifiableList(searchResultsMetadataCodes);
this.tableMetadataCodes = Collections.unmodifiableList(tableMetadataCodes);
}
public List<String> getDisplayMetadataCodes() {
return displayMetadataCodes;
}
public List<String> getFormMetadataCodes() {
return formMetadataCodes;
}
public List<String> getSearchResultsMetadataCodes() {
return searchResultsMetadataCodes;
}
public List<String> getTableMetadataCodes() {
return tableMetadataCodes;
}
public String getSchemaCode() {
return schemaCode;
}
public String getCollection() {
return collection;
}
public SchemaDisplayConfig withDisplayMetadataCodes(List<String> displayMetadataCodes) {
return new SchemaDisplayConfig(collection, schemaCode, displayMetadataCodes, formMetadataCodes,
searchResultsMetadataCodes, tableMetadataCodes);
}
public SchemaDisplayConfig withFormMetadataCodes(List<String> formMetadataCodes) {
return new SchemaDisplayConfig(collection, schemaCode, displayMetadataCodes, formMetadataCodes,
searchResultsMetadataCodes, tableMetadataCodes);
}
public SchemaDisplayConfig withSearchResultsMetadataCodes(List<String> searchResultsMetadataCodes) {
return new SchemaDisplayConfig(collection, schemaCode, displayMetadataCodes, formMetadataCodes,
searchResultsMetadataCodes, tableMetadataCodes);
}
public SchemaDisplayConfig withTableMetadataCodes(List<String> tableMetadataCodes) {
return new SchemaDisplayConfig(collection, schemaCode, displayMetadataCodes, formMetadataCodes,
searchResultsMetadataCodes, tableMetadataCodes);
}
public SchemaDisplayConfig withNewSearchResultMetadataCode(String code) {
List<String> result = new ArrayList<>(searchResultsMetadataCodes);
result.add(code);
return withSearchResultsMetadataCodes(result);
}
public SchemaDisplayConfig withNewDisplayMetadataBefore(String metadataCode, String before) {
int index = displayMetadataCodes.indexOf(before);
if (index < 0 && !displayMetadataCodes.isEmpty()) {
index = displayMetadataCodes.size() - 1;
} else if (index < 0) {
index = 0;
}
List<String> displayMetadataCodes = new ArrayList<>();
displayMetadataCodes.addAll(this.displayMetadataCodes);
displayMetadataCodes.add(index, metadataCode);
return withDisplayMetadataCodes(displayMetadataCodes);
}
public SchemaDisplayConfig withNewDisplayMetadataQueued(String metadataCode) {
List<String> displayMetadataCodes = new ArrayList<>();
displayMetadataCodes.addAll(this.displayMetadataCodes);
displayMetadataCodes.add(metadataCode);
return withDisplayMetadataCodes(displayMetadataCodes);
}
public SchemaDisplayConfig withNewFormMetadata(String metadataCode) {
List<String> formMetadatas = new ArrayList<>();
formMetadatas.addAll(this.formMetadataCodes);
formMetadatas.add(metadataCode);
return withFormMetadataCodes(formMetadatas);
}
public SchemaDisplayConfig withNewFormAndDisplayMetadatas(String... metadataCodes) {
List<String> displayMetadatas = new ArrayList<>();
displayMetadatas.addAll(this.displayMetadataCodes);
displayMetadatas.addAll(asList(metadataCodes));
List<String> formMetadatas = new ArrayList<>();
formMetadatas.addAll(this.formMetadataCodes);
formMetadatas.addAll(asList(metadataCodes));
return withFormMetadataCodes(formMetadatas).withDisplayMetadataCodes(displayMetadatas);
}
public SchemaDisplayConfig withNewFormMetadatas(String... metadataCodes) {
List<String> formMetadatas = new ArrayList<>();
formMetadatas.addAll(this.formMetadataCodes);
formMetadatas.addAll(asList(metadataCodes));
return withFormMetadataCodes(formMetadatas);
}
public SchemaDisplayConfig withRemovedDisplayMetadatas(String... metadataCodes) {
List<String> displayMetadatas = new ArrayList<>();
displayMetadatas.addAll(this.displayMetadataCodes);
displayMetadatas.removeAll(asList(metadataCodes));
return withDisplayMetadataCodes(displayMetadatas);
}
public SchemaDisplayConfig withRemovedTableMetadatas(String... metadataCodes) {
List<String> tableMetadatas = new ArrayList<>();
tableMetadatas.addAll(this.tableMetadataCodes);
tableMetadatas.removeAll(asList(metadataCodes));
return withTableMetadataCodes(tableMetadatas);
}
public SchemaDisplayConfig withRemovedFormMetadatas(String... metadataCodes) {
List<String> formMetadatas = new ArrayList<>();
formMetadatas.addAll(this.formMetadataCodes);
formMetadatas.removeAll(asList(metadataCodes));
return withFormMetadataCodes(formMetadatas);
}
public SchemaDisplayConfig withNewFormMetadataBefore(String metadataCode, String before) {
int index = formMetadataCodes.indexOf(before);
List<String> formMetadatas = new ArrayList<>();
formMetadatas.addAll(this.formMetadataCodes);
formMetadatas.add(index, metadataCode);
return withFormMetadataCodes(formMetadatas);
}
public SchemaDisplayConfig withNewTableMetadatas(String... metadataCodes) {
List<String> tableMetadatas = new ArrayList<>();
tableMetadatas.addAll(this.tableMetadataCodes);
tableMetadatas.addAll(asList(metadataCodes));
return withTableMetadataCodes(tableMetadatas);
}
public SchemaDisplayConfig withCode(String toCode) {
List<String> displayMetadataCodes = listForCode(this.displayMetadataCodes, toCode);
List<String> formMetadataCodes = listForCode(this.formMetadataCodes, toCode);
List<String> searchResultsMetadataCodes = listForCode(this.searchResultsMetadataCodes, toCode);
List<String> tableMetadataCodes = listForCode(this.tableMetadataCodes, toCode);
return new SchemaDisplayConfig(collection, toCode, displayMetadataCodes, formMetadataCodes, searchResultsMetadataCodes,
tableMetadataCodes);
}
private List<String> listForCode(List<String> codes, String toCode) {
List<String> returnedCodes = new ArrayList<>();
for (String code : codes) {
returnedCodes.add(code.replace(this.schemaCode, toCode));
}
return returnedCodes;
}
}