package usda.weru.util.tree;

import de.schlichtherle.truezip.file.TFile;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.FileFilter;
import static usda.weru.remoteDataAccess.csip.CsipInputControllerCachingSupport.PROP_CSIP_BGCATALOG_COMPLETE;
import usda.weru.remoteDataAccess.csip.CsipLmodUtil;
import usda.weru.remoteDataAccess.csip.CsipLmodUtil.lmodType;
import usda.weru.util.ConfigData;
import usda.weru.util.About;
import usda.weru.util.wepsFileChooser2.WepsFileTypes2;

/**
 *
 * @author mhaas
 */
public class WepsTreeModelMan extends WepsTreeModelCrLmod implements PropertyChangeListener, FileFilter {

    private static final long serialVersionUID = 1L;

    public WepsTreeModelMan(WepsTreeComboBox treeCombo, boolean useWaitCursor) {
        this(treeCombo, true, true, useWaitCursor);
    }

    public WepsTreeModelMan(WepsTreeComboBox treeCombo, boolean includeProjectNode, boolean includeTemplateNode, boolean useWaitCursor) {
        super(treeCombo, includeProjectNode, includeTemplateNode, useWaitCursor);

    }

    public void configureListeners() {
        ConfigData.getDefault().addPropertyChangeListener(ConfigData.sysManTemp, this);
        ConfigData.getDefault().addPropertyChangeListener(ConfigData.locManTemp, this);
        ConfigData.getDefault().addPropertyChangeListener(ConfigData.shaManTemp, this);
    }

    @Override
    public void refresh() {
        build();
    }

    @Override
    protected void build() {
        super.build();
        
        if (ConfigData.checkParmValue(ConfigData.locManTemp, "1")) {
            TFile locMan = new TFile(ConfigData.getDefault().getDataParsed(ConfigData.LocalManDB));
            if (locMan.exists() && locMan.isDirectory()) {
                WepsTreeNodeFile localManDbDir = new WepsTreeNodeFile(locMan, this);
                localManDbDir.setDisplayName("Local Templates");
                addNode(localManDbDir);
            }
        }

        if (includeTemplateNode && ConfigData.checkParmValue(ConfigData.sysManTemp, "1")) {
            TFile cisMan = new TFile(ConfigData.getDefault().getDataParsed(ConfigData.ManTemp));
            if (cisMan.exists() && cisMan.isDirectory()) {
                addTemplateNode(cisMan, "System Templates");
            }
        }

        if (ConfigData.checkParmValue(ConfigData.shaManTemp, "1")) {
            TFile shaMan = new TFile(ConfigData.getDefault().getDataParsed(ConfigData.SharedManDB));
            if (shaMan.exists() && shaMan.isDirectory()) {
                addTemplateNode(shaMan, "Shared Templates");
            }
        }

        if (ConfigData.checkParmValue(ConfigData.crlmodEnabled, "1")) {
            // we are firing of too many of these...
            // If we set it up previously, clear it out
            // so it is release for garbage collection
            if (crlmodNode != null) {
                crlmodNode.removeAllChildren();
                crlmodNode.removeFromParent();
                crlmodNode.getBackgroundPropertyChangeObject()
                        .removePropertyChangeListener(PROP_CSIP_BGCATALOG_COMPLETE, this);
            }
            crlmodNode = new WepsTreeNodeCrLmod(lmodType.lmodManagement);
            crlmodNode.refreshChildren();
            addNode(crlmodNode);
            crlmodNode.getBackgroundPropertyChangeObject()
                    .addPropertyChangeListener(PROP_CSIP_BGCATALOG_COMPLETE, this);
        }
        // For cached files.  Remove after dev? MEH.
        if (ConfigData.checkParmValue("CD-WS-csip-crlmod-Management-ShowCacheItem", "1")) {
            addFileNode(new TFile(About.getWepsCacheDir(), CsipLmodUtil.WepsCacheDirNameMan),
                    "Cached CR" + CsipLmodUtil.getCrLmodName(lmodType.lmodManagement));
        }
    }

    @Override
    public void propertyChange(PropertyChangeEvent evt) {
        super.propertyChange(evt);
        if (null != evt.getPropertyName()) {
            switch (evt.getPropertyName()) {
                case ConfigData.ManTemp: {
                    String path = ConfigData.getDefault().getDataParsed(ConfigData.ManTemp);
                    if (templateNode != null) {
                        if (path != null) {
                            templateNode.setFile(new TFile(path));
                        } else {
                            templateNode.setFile(null);
                        }
                        nodeStructureChanged(templateNode);
                    }
                    break;
                }
            }
        }
    }

    @Override
    public boolean accept(java.io.File file) {
        return (file.isDirectory() || WepsFileTypes2.isManFileType(file.getName()));
        //return ( file.isDirectory() || file.getName().toLowerCase().trim().endsWith(WepsFileTypes2.Management.getExtension()) );
    }
}
