/*
 * DifferFrame.java
 *
 * Created on May 30, 2006, 3:36 PM
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package usda.weru.util.diff;

import java.awt.Cursor;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import de.schlichtherle.io.File;
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 transient final Logger logger = Logger.getLogger(DifferFrame.class);
    private String c_currentProjectPath;
    /** Creates a new instance of DifferFrame */
    public DifferFrame() {
        super();
    }
    
    
    protected void JC_filterChanged_actionPerformed(java.awt.event.ActionEvent evt) {
        updateFilters();
    }
    
    protected void JC_filterRemoved_actionPerformed(java.awt.event.ActionEvent evt) {
        updateFilters();
    }
    
    protected void JC_filterAdded_actionPerformed(java.awt.event.ActionEvent evt) {
        updateFilters();
    }
    
    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);
    }
    
    protected void JB_compare_actionPerformed(java.awt.event.ActionEvent evt) {
        compareFiles();
    }
    
    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();
    }
    
    protected void JTF_pathFileB_focusLost(java.awt.event.FocusEvent evt) {
        JTF_pathFileB_actionPerformed(null);
    }
    
    protected void JTF_pathFileB_actionPerformed(java.awt.event.ActionEvent evt) {
        updateFileTypeB();
    }
    
    protected void JTF_pathFileA_focusLost(java.awt.event.FocusEvent evt) {
        JTF_pathFileA_actionPerformed(null);
    }
    
    protected void JTF_pathFileA_actionPerformed(java.awt.event.ActionEvent evt) {
        updateFileTypeA();
    }
    
    
    
    protected void JB_browseFileA_actionPerformed(java.awt.event.ActionEvent evt) {
        setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
        WepsFileChooser wfc =  new WepsFileChooser(WepsFileChooser.FILE, c_currentProjectPath, WepsFileChooser.OPEN);
        File startDirectory;
        if (JTF_pathFileA.getText().length() > 0){
            //Use current file's parent
            startDirectory = new File(new File(JTF_pathFileA.getText()).getParentFile());
        } else if (JTF_pathFileB.getText().length() > 0){
            startDirectory = new File(new File(JTF_pathFileB.getText()).getParentFile());
        } else{
            startDirectory = new File(c_currentProjectPath);
        }
        wfc.setCurrentDirectory(startDirectory);
        if (wfc.showDialog(this) == wfc.APPROVE_OPTION){
            JTF_pathFileA.setText(wfc.getSelectedFile().getPath());
            updateFileTypeA();
        }
        setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
    }
    
    protected void JB_browseFileB_actionPerformed(java.awt.event.ActionEvent evt) {
        setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
        WepsFileChooser wfc =  new WepsFileChooser(WepsFileChooser.FILE, c_currentProjectPath, WepsFileChooser.OPEN);
        File startDirectory;
        if (JTF_pathFileB.getText().length() > 0){
            //Use current file's parent
            startDirectory = new File(new File(JTF_pathFileB.getText()).getParentFile());
        } else if (JTF_pathFileA.getText().length() > 0){
            startDirectory = new File(new File(JTF_pathFileA.getText()).getParentFile());
        } else{
            startDirectory = new File(c_currentProjectPath);
        }
        wfc.setCurrentDirectory(startDirectory);
        if (wfc.showDialog(this) == wfc.APPROVE_OPTION){
            JTF_pathFileB.setText(wfc.getSelectedFile().getPath());
            updateFileTypeB();
        }
        setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
    }
    
    private void updateFileTypeA(){
        if (JTF_pathFileA.getText().length() > 0){
            File fileA = new File(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){
            File fileB = new File(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"){
            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;
                }
                
                File fileA = new File(JTF_pathFileA.getText());
                File fileB = new File(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();                        
        
    }
    
    public void setCursor(Cursor cursor) {
        super.setCursor(cursor);
        try{
            Thread.sleep(15);
        }catch(Exception e){
            logger.trace("Aborting setCursor()", e);
        }
    }
    
    protected void c_table_componentResized(java.awt.event.ComponentEvent evt) {
        c_table.autoResizeColumns();
    }
    
    //PropertyChange
    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);
        }
    }
    
    
}
