/*
 * DifferFrame.java
 *
 * Created on May 30, 2006, 3:36 PM
 *
 */
package usda.weru.util.diff;

import java.awt.Cursor;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import de.schlichtherle.truezip.file.TFile;
import org.apache.log4j.Logger;
import usda.weru.mcrew.ManageData;
import usda.weru.util.Util;
import usda.weru.util.WepsFileChooser;
import usda.weru.util.diff.listbuilders.ManagementListBuilder;
import usda.weru.util.diff.listbuilders.WepsFileListBuilder;
import usda.weru.util.gui.DifferFrame_n;

/**
 *
 * @author Joseph Levin
 */
public class DifferFrame extends DifferFrame_n implements PropertyChangeListener {

    private static final long serialVersionUID = 1L;

    public static transient final Logger LOGGER = Logger.getLogger(DifferFrame.class);
    private String c_currentProjectPath;

    /** Creates a new instance of DifferFrame */
    public DifferFrame() {
        super();
    }

    /**
     *
     * @param evt
     */
    @Override
    protected void JC_filterChanged_actionPerformed(java.awt.event.ActionEvent evt) {
        updateFilters();
    }

    /**
     *
     * @param evt
     */
    @Override
    protected void JC_filterRemoved_actionPerformed(java.awt.event.ActionEvent evt) {
        updateFilters();
    }

    /**
     *
     * @param evt
     */
    @Override
    protected void JC_filterAdded_actionPerformed(java.awt.event.ActionEvent evt) {
        updateFilters();
    }

    /**
     *
     * @param evt
     */
    @Override
    protected void JC_filterSame_actionPerformed(java.awt.event.ActionEvent evt) {
        updateFilters();
    }

    private void updateFilters() {
        int filter = 0;
        if (JC_filterChanged.isSelected()) {
            filter += Differ.DIFF_CHANGED;
        }
        if (JC_filterAdded.isSelected()) {
            filter += Differ.DIFF_ADDED;
        }
        if (JC_filterRemoved.isSelected()) {
            filter += Differ.DIFF_REMOVED;
        }
        if (JC_filterSame.isSelected()) {
            filter += Differ.DIFF_SAME;
        }

        c_table.setFilter(filter);
    }

    /**
     *
     * @param evt
     */
    @Override
    protected void JB_compare_actionPerformed(java.awt.event.ActionEvent evt) {
        compareFiles();
    }

    /**
     *
     * @param evt
     */
    @Override
    protected void JB_swap_actionPerformed(java.awt.event.ActionEvent evt) {
        String temp = JTF_pathFileA.getText();
        JTF_pathFileA.setText(JTF_pathFileB.getText());
        JTF_pathFileB.setText(temp);
        updateFileTypeA();
        updateFileTypeB();
    }

    /**
     *
     * @param evt
     */
    @Override
    protected void JTF_pathFileB_focusLost(java.awt.event.FocusEvent evt) {
        JTF_pathFileB_actionPerformed(null);
    }

    /**
     *
     * @param evt
     */
    @Override
    protected void JTF_pathFileB_actionPerformed(java.awt.event.ActionEvent evt) {
        updateFileTypeB();
    }

    /**
     *
     * @param evt
     */
    @Override
    protected void JTF_pathFileA_focusLost(java.awt.event.FocusEvent evt) {
        JTF_pathFileA_actionPerformed(null);
    }

    /**
     *
     * @param evt
     */
    @Override
    protected void JTF_pathFileA_actionPerformed(java.awt.event.ActionEvent evt) {
        updateFileTypeA();
    }

    /**
     *
     * @param evt
     */
    @Override
    protected void JB_browseFileA_actionPerformed(java.awt.event.ActionEvent evt) {
        setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
        WepsFileChooser wfc = new WepsFileChooser(WepsFileChooser.Filetype.FILE, c_currentProjectPath, WepsFileChooser.OPEN);
        TFile startDirectory;
        if (JTF_pathFileA.getText().length() > 0) {
            //Use current file's parent
            startDirectory = new TFile(new TFile(JTF_pathFileA.getText()).getParentFile());
        } else if (JTF_pathFileB.getText().length() > 0) {
            startDirectory = new TFile(new TFile(JTF_pathFileB.getText()).getParentFile());
        } else {
            startDirectory = new TFile(c_currentProjectPath);
        }
        wfc.setCurrentDirectory(startDirectory);
        if (wfc.showDialog(this) == WepsFileChooser.APPROVE_OPTION) {
            JTF_pathFileA.setText(wfc.getSelectedFile().getPath());
            updateFileTypeA();
        }
        setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
    }

    /**
     *
     * @param evt
     */
    @Override
    protected void JB_browseFileB_actionPerformed(java.awt.event.ActionEvent evt) {
        setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
        WepsFileChooser wfc = new WepsFileChooser(WepsFileChooser.Filetype.FILE, c_currentProjectPath, WepsFileChooser.OPEN);
        TFile startDirectory;
        if (JTF_pathFileB.getText().length() > 0) {
            //Use current file's parent
            startDirectory = new TFile(new TFile(JTF_pathFileB.getText()).getParentFile());
        } else if (JTF_pathFileA.getText().length() > 0) {
            startDirectory = new TFile(new TFile(JTF_pathFileA.getText()).getParentFile());
        } else {
            startDirectory = new TFile(c_currentProjectPath);
        }
        wfc.setCurrentDirectory(startDirectory);
        if (wfc.showDialog(this) == WepsFileChooser.APPROVE_OPTION) {
            JTF_pathFileB.setText(wfc.getSelectedFile().getPath());
            updateFileTypeB();
        }
        setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
    }

    private void updateFileTypeA() {
        if (JTF_pathFileA.getText().length() > 0) {
            TFile fileA = new TFile(JTF_pathFileA.getText());
            int typeA = WepsFileListBuilder.typeOfFile(fileA);
            JL_typeFileA.setText(nameOfType(typeA));
        } else {
            JL_typeFileA.setText(" ");
        }
    }

    private void updateFileTypeB() {
        if (JTF_pathFileB.getText().length() > 0) {
            TFile fileB = new TFile(JTF_pathFileB.getText());
            int typeB = WepsFileListBuilder.typeOfFile(fileB);
            JL_typeFileB.setText(nameOfType(typeB));
        } else {
            JL_typeFileB.setText(" ");
        }
    }

    private String nameOfType(int type) {
        switch (type) {
            case WepsFileListBuilder.MANAGEMENT:
                return "Management File";
            case WepsFileListBuilder.ROTATION:
                return "Rotation File";
            case WepsFileListBuilder.PROJECT_DIR:
                return "Project Directory";
            case WepsFileListBuilder.RUN:
                return "Run File";
            case WepsFileListBuilder.RUN_DIR:
                return "Run Directory";
            case WepsFileListBuilder.SOIL:
                return "Soil File";
            case WepsFileListBuilder.CROP:
                return "Crop File";
            case WepsFileListBuilder.OPERATION:
                return "Operation File";
            default:
                return "Unknown File Type";
        }
    }

    private void compareFiles() {
        g_progressBar.setVisible(true);
        JP_table.setVisible(false);
        JP_filters.setVisible(false);
        setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
        Thread task = new Thread("Diff File Comparer") {
            @Override
            public void run() {
                int matchFlags = 0;
                if (JC_matchDate.isSelected()) {
                    matchFlags |= ManagementListBuilder.MATCH_DATE;
                }
                if (JC_matchOperation.isSelected()) {
                    matchFlags |= ManagementListBuilder.MATCH_OPERATION;
                }
                if (JC_matchCrop.isSelected()) {
                    matchFlags |= ManagementListBuilder.MATCH_CROP;
                }
                if (JC_matchOr.isSelected()) {
                    matchFlags |= ManagementListBuilder.MATCH_OR;
                }

                TFile fileA = new TFile(JTF_pathFileA.getText());
                TFile fileB = new TFile(JTF_pathFileB.getText());

                DiffEngine differ = new DiffEngine();

                differ.mapObjectListBuilder(ManageData.class, new ManagementListBuilder(matchFlags));

                differ.setObjects(fileA, fileB);
                differ.buildNodeList();
                differ.diffNodeList();
                c_table.getDataSource().setRootNode(differ.getNodeList());
                updateFilters();
                c_table.expandChangedNodes();
                setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
                g_progressBar.setVisible(false);
                JP_table.setVisible(true);
                JP_filters.setVisible(true);
            }
        };

        task.start();

    }

    /**
     *
     * @param cursor
     */
    @Override
    public void setCursor(Cursor cursor) {
        super.setCursor(cursor);
        try {
            Thread.sleep(15);
        } catch (InterruptedException e) {
            LOGGER.trace("Aborting setCursor()", e);
        }
    }

    /**
     *
     * @param evt
     */
    @Override
    protected void c_table_componentResized(java.awt.event.ComponentEvent evt) {
        c_table.autoResizeColumns();
    }

    //PropertyChange
    /**
     *
     * @param e
     */
    @Override
    public void propertyChange(PropertyChangeEvent e) {
        String property = e.getPropertyName();
        Object value = e.getNewValue();
        if (property.equals(usda.weru.util.ConfigData.CurrentProj)) {
            c_currentProjectPath = Util.parse(value != null ? value.toString() : null);
        }
    }

}
