package comeon.ui.add;
import au.com.bytecode.opencsv.CSVReader;
import comeon.model.Template;
import comeon.templates.Templates;
import javax.swing.*;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Path;
class AddController implements PropertyChangeListener {
private final DefaultListModel<File> mediaListModel;
private final DefaultComboBoxModel<String> metadataExpressionModel;
private final DefaultComboBoxModel<Template> templateModel;
private AddModel model;
private AddMediaPanel view;
public AddController(final Templates templates) {
this.mediaListModel = new DefaultListModel<>();
this.metadataExpressionModel = new DefaultComboBoxModel<>();
this.templateModel = new DefaultComboBoxModel<>();
templates.getTemplates().forEach(this.templateModel::addElement);
}
public void registerModel(final AddModel model) {
this.model = model;
this.model.addPropertyChangeListener(this);
if (this.templateModel.getSelectedItem() != null) {
this.model.setTemplate((Template) this.templateModel.getSelectedItem());
}
}
public void registerView(final AddMediaPanel view) {
this.view = view;
}
DefaultListModel<File> getMediaListModel() {
return mediaListModel;
}
public DefaultComboBoxModel<String> getMetadataExpressionModel() {
return metadataExpressionModel;
}
public DefaultComboBoxModel<Template> getTemplateModel() {
return templateModel;
}
public void setUseMetadata(final Boolean useMetadata) {
model.setUseMetadata(useMetadata);
}
public void setMetadataFile(final Path metadataFile) {
model.setMetadataFile(metadataFile);
}
public void setMediaFiles(final File[] mediaFiles) {
model.setMediaFiles(mediaFiles);
}
public void setMediaExpression(final String mediaExpression) {
model.setMediaExpression(mediaExpression);
}
public void setMetadataExpression(final String metadataExpression) {
model.setMetadataExpression(metadataExpression);
}
public String getMediaRegexp() {
return model.getMediaRegexp();
}
public void setMediaRegexp(final String mediaRegexp) {
model.setMediaRegexp(mediaRegexp);
}
public void setMediaSubstitution(final String mediaSubstitution) {
model.setMediaSubstitution(mediaSubstitution);
}
public String getMediaSubstitution() {
return model.getMediaSubstitution();
}
public void setTemplate(final Template template) {
model.setTemplate(template);
}
public char getSeparator() {
return model.getSeparator();
}
public void setSeparator(final char separator) {
model.setSeparator(separator);
}
public char getQuote() {
return model.getQuote();
}
public void setQuote(final char quote) {
model.setQuote(quote);
}
public char getEscape() {
return model.getEscape();
}
public void setEscape(final char escape) {
model.setEscape(escape);
}
public int getSkipLines() {
return model.getSkipLines();
}
public void setSkipLines(final int skipLines) {
model.setSkipLines(skipLines);
}
public boolean isStrictQuotes() {
return model.isStrictQuotes();
}
public void setStrictQuotes(final boolean strictQuotes) {
model.setStrictQuotes(strictQuotes);
}
public boolean isIgnoreLeadingWhiteSpace() {
return model.isIgnoreLeadingWhiteSpace();
}
public void setIgnoreLeadingWhiteSpace(final boolean ignoreLeadingWhiteSpace) {
model.setIgnoreLeadingWhiteSpace(ignoreLeadingWhiteSpace);
}
public Charset getCharset() {
return model.getCharset();
}
public void setCharset(final Charset charset) {
model.setCharset(charset);
}
@Override
public void propertyChange(final PropertyChangeEvent evt) {
if (AddModel.Properties.USE_METADATA.name().equals(evt.getPropertyName())) {
if ((Boolean) evt.getNewValue()) {
view.activateMetadataZone();
} else {
view.deactivateMetadataZone();
}
} else if (AddModel.Properties.MEDIA_FILES.name().equals(evt.getPropertyName())) {
mediaListModel.removeAllElements();
final File[] files = (File[]) evt.getNewValue();
for (final File file : files) {
mediaListModel.addElement(file);
}
}
}
public void updateMetadataFileHeader() {
final Path location = model.getMetadataFile();
try {
final String[] columns = this.peekMetadataFileHeader(location);
metadataExpressionModel.removeAllElements();
for (final String column : columns) {
metadataExpressionModel.addElement(column);
}
SwingUtilities.invokeLater(() -> view.updateMetadataFileLocation(location.toString()));
} catch (final IOException e) {
//TODO handle exception
}
}
private String[] peekMetadataFileHeader(final Path metadataFile) throws IOException {
try (final CSVReader reader = new CSVReader(Files.newBufferedReader(metadataFile, model.getCharset()), model.getSeparator(), model.getQuote(), model.getEscape(), model.getSkipLines(),
model.isStrictQuotes(), model.isIgnoreLeadingWhiteSpace())) {
return reader.readNext();
}
}
}