package be.msyben.vinylManager.gui;

import be.msyben.vinylManager.controller.Controller;
import be.msyben.vinylManager.exceptions.VinylManagerException;
import be.msyben.vinylManager.gui.icon.Icons;
import be.msyben.vinylManager.properties.Language;
import be.msyben.vinylManager.properties.Preferences;
import be.msyben.vinylManager.tools.filter.FileFilterDirectory;
import be.msyben.vinylManager.tools.filter.FileFilterPDF;
import be.msyben.vinylManager.tools.filter.FileFilterXML;
import be.msyben.vinylManager.tools.WaitThread;
import be.msyben.vinylManager.tools.filter.*;
import be.msyben.vinylManager.tools.log.VinylManagerLogger;
import java.awt.Checkbox;
import java.awt.CheckboxGroup;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;

/**
 * Fenetre pour le choix d'exportation
 *
 * @author Mathieu Syben
 */
public class ExportWindow extends JFrame {

    /**
     * uid
     */
    private static final long serialVersionUID = 396612L;
    /**
     * Le controller
     */
    private Controller controller;
    /**
     * le groupe des Checkbox
     */
    private CheckboxGroup groupe = new CheckboxGroup();
    /**
     * la checkbox export xml
     */
    private Checkbox box1 = new Checkbox(Language.getInstance().get("export.xml"), groupe, true);
    /**
     * la checkbox export pdf court
     */
    private Checkbox box2 = new Checkbox(Language.getInstance().get("export.pdf.court"), groupe, false);
    /**
     * la checkbox export pdf long
     */
    private Checkbox box3 = new Checkbox(Language.getInstance().get("export.pdf.long"), groupe, false);
    /**
     * la checkbox export pdf long
     */
    private Checkbox box4 = new Checkbox(Language.getInstance().get("export.html"), groupe, false);
    /**
     * la checkbox export pdf long
     */
    private Checkbox box5 = new Checkbox(Language.getInstance().get("export.table"), groupe, false);
    private Checkbox box6 = new Checkbox(Language.getInstance().get("export.vm.lite"), groupe, false);
    /**
     * le bouton ok
     */
    private JButton ok = new JButton(Language.getInstance().get("button.valider"));
    /**
     * le bouton cancel
     */
    private JButton cancel = new JButton(Language.getInstance().get("button.annuler"));
    /**
     * Le thread d'attente
     */
    private WaitThread waitThread = new WaitThread();

    /**
     * Constructeur privé inutilisé
     */
    private ExportWindow() {
    }

    /**
     * Constructeur
     *
     * @param controller le controller
     */
    public ExportWindow(Controller controller) {
        super(Language.getInstance().get("export.window.title"));
        this.controller = controller;
        setIconImage(Icons.getInstance().icon.getImage());
        MainWindow.getInstance().setEnabled(false);
        this.setSize(550, 160); //On donne une taille à notre fenêtre
        this.setLocationRelativeTo(null); //On centre la fenêtre sur l'ecran
        this.setResizable(false); //On interdit la redimensionnement de la fenêtre
        this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); //On dit à l'application de se fermer

        putElements();

        setVisible(true);
    }

    /**
     * Ajoute les éléments dans la fenêtre
     */
    private void putElements() {

        Container c = this.getContentPane();
        c.setLayout(null);
        c.setSize(550, 160);

        JLabel choixL = new JLabel(Language.getInstance().get("export.choix") + " :");
        choixL.setBounds(5, 5, 150, 20);
        c.add(choixL);

        box1.setBounds(155, 10, 200, 15);
        box2.setBounds(155, 25, 200, 15);
        box3.setBounds(155, 40, 200, 15);
        box4.setBounds(155, 55, 200, 15);
        box5.setBounds(155, 70, 300, 15);
        box6.setBounds(155, 85, 300, 15);
        c.add(box1);
        c.add(box2);
        c.add(box3);
        c.add(box4);
        c.add(box5);
        c.add(box6);

        ok.setBounds(380, 5, 100, 25);
        c.add(ok);
        ok.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                exporter();
            }
        });
        cancel.setBounds(380, 35, 100, 25);
        c.add(cancel);
        cancel.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                dispose();
                MainWindow.getInstance().setEnabled(true);
            }
        });
    }

    /**
     * Réalise l'export
     */
    private void exporter() {
        if (box1.getState()) {
            choixFichierExportXml();
        }
        if (box2.getState()) {
            choixFichierExportPdfShort();
        }
        if (box3.getState()) {
            choixFichierExportPdfLong();
        }
        if (box4.getState()) {
            choixFichierExportHtml();
        }
        if (box5.getState()) {
            displayTableExport();
        }
        if (box6.getState()) {
            choixFichierExportVmLite();
        }
    }

    /**
     * Ferme cette fenêtre et affiche celle de l'export
     */
    private void displayTableExport() {
        dispose();
        TableExportGui teg  = new TableExportGui(controller);
        MainWindow.getInstance().setOpenWindow(teg);
    }
    
    /**
     * choix du fichier pour l'export xml
     */
    private void choixFichierExportHtml() {
        try {
            setEnabled(false);
            JFileChooser fc = new JFileChooser(Preferences.getInstance().get(Preferences.PATH_EXPORT, System.getProperty("user.home")));
            fc.setDialogTitle(Language.getInstance().get("export.dialog.title"));
            fc.setMultiSelectionEnabled(false);
            fc.setAcceptAllFileFilterUsed(false);
            fc.setFileFilter(new FileFilterDirectory());
            fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);

            int res = fc.showOpenDialog(this);
            setEnabled(true);
            if (res == JFileChooser.APPROVE_OPTION) {
                File f = fc.getSelectedFile();
                if (f.exists()) {

                    if (f.isDirectory()) {
                        Preferences.getInstance().set(Preferences.PATH_EXPORT, f.getAbsolutePath());
                        if (f.listFiles().length == 0) {
                            exporterHtml(f);
                        } else {
                            int result = JOptionPane.showConfirmDialog(this, Language.getInstance().get("export.html.not.empty.dialog").replace("%1", f.getName()), Language.getInstance().get("export.overwrite.title"), JOptionPane.YES_NO_OPTION);

                            switch (result) {
                                case JOptionPane.YES_OPTION:
                                    exporterHtml(f);
                                    break;
                                case JOptionPane.NO_OPTION:
                                    break;
                            }
                        }

                    } else {
                        new ErrorWindow(this, Language.getInstance().get("error.export.message"));
                    }

                } else {
                    new ErrorWindow(this, Language.getInstance().get("error.export.message"));
                }
            }

        } catch (Exception e) {
            VinylManagerLogger.log( e);
            new ErrorWindow(this, Language.getInstance().get("error.export.message"), e);
        }
    }

    /**
     * choix du fichier pour l'export xml
     */
    private void choixFichierExportXml() {

        try {
            setEnabled(false);
            JFileChooser fc = new JFileChooser(Preferences.getInstance().get(Preferences.PATH_EXPORT, System.getProperty("user.home")));
            fc.setDialogTitle(Language.getInstance().get("export.dialog.title"));
            fc.setMultiSelectionEnabled(false);
            fc.setAcceptAllFileFilterUsed(false);
            fc.setFileFilter(new FileFilterXML());
            int res = fc.showSaveDialog(this);
            setEnabled(true);
            if (res == JFileChooser.APPROVE_OPTION) {
                File f = fc.getSelectedFile();
                Preferences.getInstance().set(Preferences.PATH_EXPORT, f.getParentFile().getAbsolutePath());
                if (!f.getAbsolutePath().toLowerCase().endsWith(".xml")) {
                    f = new File(f.getAbsolutePath() + ".xml");
                }

                if (f.exists()) {
                    int result = JOptionPane.showConfirmDialog(this, Language.getInstance().get("export.overwrite.dialog").replace("%1", f.getName()), Language.getInstance().get("export.overwrite.title"), JOptionPane.YES_NO_OPTION);

                    switch (result) {
                        case JOptionPane.YES_OPTION:
                            exporterXML(f);
                            break;

                        case JOptionPane.NO_OPTION:
                            break;
                    }

                } else {
                    exporterXML(f);
                }

            }

        } catch (Exception e) {
            VinylManagerLogger.log( e);
            new ErrorWindow(this, Language.getInstance().get("error.export.message"), e);
        }

    }

    /**
     * choix du fichier pour l'export csv
     */
    /*private void choixFichierExportCsv() {

        try {
            setEnabled(false);
            JFileChooser fc = new JFileChooser(Preferences.getInstance().get(Preferences.PATH_EXPORT, System.getProperty("user.home")));
            fc.setDialogTitle(Language.getInstance().get("export.dialog.title"));
            fc.setMultiSelectionEnabled(false);
            fc.setAcceptAllFileFilterUsed(false);
            fc.setFileFilter(new FileFilterCSV());
            int res = fc.showSaveDialog(this);
            setEnabled(true);
            if (res == JFileChooser.APPROVE_OPTION) {
                File f = fc.getSelectedFile();
                Preferences.getInstance().set(Preferences.PATH_EXPORT, f.getParentFile().getAbsolutePath());
                if (!f.getAbsolutePath().toLowerCase().endsWith(".csv")) {
                    f = new File(f.getAbsolutePath() + ".csv");
                }

                if (f.exists()) {
                    int result = JOptionPane.showConfirmDialog(this, Language.getInstance().get("export.overwrite.dialog").replace("%1", f.getName()), Language.getInstance().get("export.overwrite.title"), JOptionPane.YES_NO_OPTION);

                    switch (result) {
                        case JOptionPane.YES_OPTION:
                            exporterCSV(f);
                            break;

                        case JOptionPane.NO_OPTION:
                            break;
                    }

                } else {
                    exporterCSV(f);
                }

            }

        } catch (Exception e) {
            VinylManagerLogger.log( e);
            new ErrorWindow(this, Language.getInstance().get("error.export.message"), e);
        }

    }*/

    /**
     * choix du fichier pour l'export vm lite
     */
    private void choixFichierExportVmLite() {

        try {
            setEnabled(false);
            JFileChooser fc = new JFileChooser(Preferences.getInstance().get(Preferences.PATH_EXPORT, System.getProperty("user.home")));
            fc.setDialogTitle(Language.getInstance().get("export.dialog.title"));
            fc.setMultiSelectionEnabled(false);
            fc.setAcceptAllFileFilterUsed(false);
            fc.setFileFilter(new FileFilterVM());
            int res = fc.showSaveDialog(this);
            setEnabled(true);
            if (res == JFileChooser.APPROVE_OPTION) {
                File f = fc.getSelectedFile();
                Preferences.getInstance().set(Preferences.PATH_EXPORT, f.getParentFile().getAbsolutePath());
                if (!f.getAbsolutePath().toLowerCase().endsWith(".vm")) {
                    f = new File(f.getAbsolutePath() + ".vm");
                }

                if (f.exists()) {
                    int result = JOptionPane.showConfirmDialog(this, Language.getInstance().get("export.overwrite.dialog").replace("%1", f.getName()), Language.getInstance().get("export.overwrite.title"), JOptionPane.YES_NO_OPTION);

                    switch (result) {
                        case JOptionPane.YES_OPTION:
                            exporterVmLite(f);
                            break;

                        case JOptionPane.NO_OPTION:
                            break;
                    }

                } else {
                    exporterVmLite(f);
                }

            }

        } catch (Exception e) {
            VinylManagerLogger.log( e);
            new ErrorWindow(this, Language.getInstance().get("error.export.message"), e);
        }

    }

    /**
     * choix du fichier pour l'export pdf court
     */
    private void choixFichierExportPdfShort() {

        try {
            setEnabled(false);
            JFileChooser fc = new JFileChooser(Preferences.getInstance().get(Preferences.PATH_EXPORT, System.getProperty("user.home")));
            fc.setDialogTitle(Language.getInstance().get("export.dialog.title"));
            fc.setMultiSelectionEnabled(false);
            fc.setAcceptAllFileFilterUsed(false);
            fc.setFileFilter(new FileFilterPDF());
            int res = fc.showSaveDialog(this);
            setEnabled(true);
            if (res == JFileChooser.APPROVE_OPTION) {
                File f = fc.getSelectedFile();
                Preferences.getInstance().set(Preferences.PATH_EXPORT, f.getParentFile().getAbsolutePath());
                if (!f.getAbsolutePath().toLowerCase().endsWith(".pdf")) {
                    f = new File(f.getAbsolutePath() + ".pdf");
                }

                if (f.exists()) {
                    int result = JOptionPane.showConfirmDialog(this, Language.getInstance().get("export.overwrite.dialog").replace("%1", f.getName()), Language.getInstance().get("export.overwrite.title"), JOptionPane.YES_NO_OPTION);

                    switch (result) {
                        case JOptionPane.YES_OPTION:
                            exportPdfCourt(f);
                            break;

                        case JOptionPane.NO_OPTION:
                            break;
                    }

                } else {
                    exportPdfCourt(f);
                }

            }

        } catch (Exception e) {
            VinylManagerLogger.log( e);
            new ErrorWindow(this, Language.getInstance().get("error.export.message"), e);
        }

    }

    /**
     * choix du fichier pour l'export pdf long
     */
    private void choixFichierExportPdfLong() {

        try {
            setEnabled(false);
            JFileChooser fc = new JFileChooser(Preferences.getInstance().get(Preferences.PATH_EXPORT, System.getProperty("user.home")));
            fc.setDialogTitle(Language.getInstance().get("export.dialog.title"));
            fc.setMultiSelectionEnabled(false);
            fc.setAcceptAllFileFilterUsed(false);
            fc.setFileFilter(new FileFilterPDF());
            int res = fc.showSaveDialog(this);
            setEnabled(true);
            if (res == JFileChooser.APPROVE_OPTION) {
                File f = fc.getSelectedFile();
                Preferences.getInstance().set(Preferences.PATH_EXPORT, f.getParentFile().getAbsolutePath());
                if (!f.getAbsolutePath().toLowerCase().endsWith(".pdf")) {
                    f = new File(f.getAbsolutePath() + ".pdf");
                }

                if (f.exists()) {
                    int result = JOptionPane.showConfirmDialog(this, Language.getInstance().get("export.overwrite.dialog").replace("%1", f.getName()), Language.getInstance().get("export.overwrite.title"), JOptionPane.YES_NO_OPTION);

                    switch (result) {
                        case JOptionPane.YES_OPTION:
                            exportPdfLong(f);
                            break;

                        case JOptionPane.NO_OPTION:
                            break;
                    }

                } else {
                    exportPdfLong(f);
                }

            }

        } catch (Exception e) {
            VinylManagerLogger.log( e);
            new ErrorWindow(this, Language.getInstance().get("error.export.message"), e);
        }

    }
    /**
     * L'exception possible lancée depuis un autre thread
     */
    private VinylManagerException exception = null;

    /**
     * Set de l'exception
     *
     * @param exception l'exception
     */
    public void setException(VinylManagerException exception) {
        this.exception = exception;
    }

    /**
     * Traitement à effectuer avant un import
     */
    private void preImport() {
        waitThread.start();
        ok.setEnabled(false);
        cancel.setEnabled(false);
        box1.setEnabled(false);
        box2.setEnabled(false);
        box3.setEnabled(false);
        box4.setEnabled(false);
        box5.setEnabled(false);
        box6.setEnabled(false);
        setException(null);
    }

    /**
     * Traitement à effectuer après un import
     */
    private void postImport() {
        ok.setEnabled(true);
        cancel.setEnabled(true);
        box1.setEnabled(true);
        box2.setEnabled(true);
        box3.setEnabled(true);
        box4.setEnabled(true);
        box5.setEnabled(true);
        box6.setEnabled(true);
        waitThread.arrete();
        if (exception == null) {
            dispose();
            MainWindow.getInstance().setEnabled(true);
        } else {
            new ErrorWindow(this, Language.getInstance().get("error.export.message"), exception);
        }

    }

    /**
     * Exporte en html
     *
     * @param f le réperoire de destination
     * @throws VinylManagerException en cas d'erreur
     */
    private void exporterHtml(final File f) {
        preImport();
        new Thread() {
            @Override
            public void run() {
                try {
                    controller.exporterHtml(f);
                } catch (VinylManagerException ex) {
                    VinylManagerLogger.log(ex);
                    setException(ex);
                }
                postImport();

            }
        }.start();

    }

    /**
     * Exporte en xml
     *
     * @param f le fichier de destination
     * @throws VinylManagerException en cas d'erreur
     */
    private void exporterXML(final File f) {
        preImport();
        new Thread() {
            @Override
            public void run() {
                controller.exporterXML(f);
                postImport();

            }
        }.start();

    }

    /**
     * Exporte en csv
     *
     * @param f le fichier de destination
     * @throws VinylManagerException en cas d'erreur
     */
    /*private void exporterCSV(final File f) {
        preImport();
        new Thread() {
            @Override
            public void run() {
                controller.exporterCSV(f);
                postImport();

            }
        }.start();

    }*/

    /**
     * Exporte en vm lite.
     *
     * @param f le fichier de destination
     * @throws VinylManagerException en cas d'erreur
     */
    private void exporterVmLite(final File f) {
        preImport();
        new Thread() {
            @Override
            public void run() {
                try {
                    controller.exporterVmLite(f);
                } catch (VinylManagerException ex) {
                    VinylManagerLogger.log(ex);
                    new ErrorWindow(ExportWindow.this, Language.getInstance().get("error.export.message"), ex);
                } finally {
                    postImport();
                }

            }
        }.start();

    }

    /**
     * Exporte en pdf court
     *
     * @param f le fichier de destination
     * @throws VinylManagerException en cas d'erreur
     */
    private void exportPdfCourt(final File f)
            throws VinylManagerException {
        preImport();

        new Thread() {
            @Override
            public void run() {
                try {
                    controller.exportPdfCourt(f);
                } catch (VinylManagerException ex) {
                    VinylManagerLogger.log(ex);
                    setException(ex);
                }

                postImport();
            }
        }.start();
    }

    /**
     * Exporte en pdf long
     *
     * @param f le fichier de destination
     * @throws VinylManagerException en cas d'erreur
     */
    private void exportPdfLong(final File f)
            throws VinylManagerException {
        preImport();
        new Thread() {
            @Override
            public void run() {
                try {
                    controller.exportPdfLong(f);
                } catch (VinylManagerException ex) {
                    VinylManagerLogger.log(ex);
                    setException(ex);
                }

                postImport();
            }
        }.start();
    }
}
