package usda.weru.util.tree;

import java.awt.EventQueue;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.FileFilter;
import javax.swing.tree.TreeNode;
import static usda.weru.remoteDataAccess.csip.CsipInputControllerCachingSupport.PROP_CSIP_BGCATALOG_COMPLETE;
import static usda.weru.remoteDataAccess.csip.CsipInputControllerCachingSupport.PROP_CSIP_BGCATALOG_STARTING;
import usda.weru.util.ConfigData;
import usda.weru.util.wepsFileChooser2.WepsFileTypes2;
import usda.weru.weps.RunFileData;
import usda.weru.weps.Weps;
import static usda.weru.weps.gui.ConfigPanel_n.CSIP_PRISM_POLYGONSIZE_PROP;
import static usda.weru.remoteDataAccess.csip.crlmod.CsipInputContCrLmodBgCache.PROP_CSIP_BGFILLCACHE_COMPLETE_EXTERNAL;

public class WepsTreeModelPrism extends WepsTreeModel implements PropertyChangeListener, FileFilter {

    private static final long serialVersionUID = 1L;

    WepsTreeNodePrism csipPrismNode;

    public WepsTreeModelPrism(WepsTreeComboBox treeCombo, boolean useWaitCursor) {
        this (treeCombo, true, true, useWaitCursor);
    }
    
    public WepsTreeModelPrism(WepsTreeComboBox treeCombo, boolean includeProjectNode, boolean includeTemplateNode, boolean useWaitCursor) {
        super(treeCombo, includeProjectNode, includeTemplateNode,useWaitCursor);

        if (Weps.getInstance().getRunFileData() != null) {
            Weps.getInstance().getRunFileData().addPropertyChangeListener(RunFileData.StrLatLong, this);
            ConfigData.getDefault().addPropertyChangeListener(CSIP_PRISM_POLYGONSIZE_PROP, this);
        }
        
        build();
        
        setUseWaitCursor(true);
    }

    @Override
    public void build() {
        super.build();
         
        csipPrismNode = new WepsTreeNodePrism();
        addNode(csipPrismNode);
        csipPrismNode.getBackgroundPropertyChangeObject()
                    .addPropertyChangeListener(PROP_CSIP_BGCATALOG_STARTING, this);
        csipPrismNode.getBackgroundPropertyChangeObject()
                    .addPropertyChangeListener(PROP_CSIP_BGCATALOG_COMPLETE, this);
    }
    
    @Override
    public void propertyChange(PropertyChangeEvent evt) {
        super.propertyChange(evt);
        String propertyName = evt.getPropertyName();
        if (propertyName != null) {
            if (propertyName.contentEquals(PROP_CSIP_BGCATALOG_STARTING)) {
                isLoading = true;
            } else if (propertyName.contentEquals(PROP_CSIP_BGCATALOG_COMPLETE)) {
                csipPrismNode.refreshChildren();
                this.nodeStructureChanged(csipPrismNode);
                isLoading = false;
            } else if (propertyName.contentEquals(PROP_CSIP_BGFILLCACHE_COMPLETE_EXTERNAL)) {
                csipPrismNode.refreshChildren();
                this.nodeStructureChanged(csipPrismNode);
                isLoading = false;
            }
        }
    }

    @Override
    public void nodeStructureChanged(final TreeNode node) {
        try {
            super.nodeStructureChanged(node);
        } catch (Exception e) {
            EventQueue.invokeLater(new Runnable() {

                @Override
                public void run() {
                    //use the super so if the second time there is still an exception then the user will be alerted.
                    WepsTreeModelPrism.super.nodeStructureChanged(node);
                }
            });
        }
    }

    @Override
    public boolean accept(java.io.File file) {
        return ( file.isDirectory() || file.getName().toLowerCase().trim().endsWith(WepsFileTypes2.Prism.getExtension()) );
    }

}
