package me.teridax.jcash.gui;

import me.teridax.jcash.Logging;
import me.teridax.jcash.Main;
import me.teridax.jcash.banking.management.BankingManagementSystem;

import javax.swing.*;
import javax.swing.filechooser.FileNameExtensionFilter;

import static javax.swing.JFileChooser.APPROVE_OPTION;
import static me.teridax.jcash.lang.Translator.translate;

/**
 * Utility class for loading a BMS configuration from a csv file.
 */
public class Loader {

    /**
     * Filter that only allows for files with *.csv extension
     */
    private static final FileNameExtensionFilter FILE_FILTER = new FileNameExtensionFilter(translate("Comma separated value spreadsheet"), "csv", "CSV");

    private Loader() {
    }

    /**
     * Load a BMS from a csv file. Opens up a dialog which prompts the user to select a single file.
     * Once the file is selected this function will try to parse the contents to a BMS and return the instance.
     *
     * @return a valid BMS instance loaded from a file
     * @throws IllegalStateException When either no file is selected or the selected files content is invalid
     */
    public static BankingManagementSystem load() throws IllegalStateException {
        var fileChooser = new JFileChooser();
        fileChooser.setMultiSelectionEnabled(false);
        fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
        fileChooser.setFileFilter(FILE_FILTER);
        fileChooser.setDialogType(JFileChooser.OPEN_DIALOG);
        fileChooser.setAcceptAllFileFilterUsed(false);

        if (fileChooser.showDialog(Main.getInstance().getWindow(), translate("Load database")) == APPROVE_OPTION) {
            // parse file content
            try {
                return BankingManagementSystem.loadFromCsv(fileChooser.getSelectedFile().toPath());
            } catch (Exception e) {
                throw new IllegalStateException("Unable to load database", e);
            }
        }

        Logging.LOGGER.warning("no file selected");
        throw new IllegalStateException("No file selected");
    }
}
