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 WepsTreeModelOp extends WepsTreeModelCrLmod implements PropertyChangeListener, FileFilter {

    private static final long serialVersionUID = 1L;

    WepsTreeNodeFile opsDbDir;
    WepsTreeNodeFile crlOpsDbDir;

    public WepsTreeModelOp(WepsTreeComboBox treeCombo, boolean useWaitCursor) {
        super(treeCombo, useWaitCursor);
    }    


    @Override
    protected void build() {
        super.build();
        
        if(ConfigData.checkParmValue(ConfigData.loopCheck,"1")) {
            try {
                TFile localOp = new TFile(ConfigData.getDefault().getDataParsed(ConfigData.LocalOpDB));
                if(localOp.exists() && localOp.isDirectory()) {
                    WepsTreeNodeFile localOpsDbDir = new WepsTreeNodeFile(localOp, this);
                    localOpsDbDir.setDisplayName("Local Operation Records");
                    addNode(localOpsDbDir);
                }
            } catch(NullPointerException e) {
                System.out.println("Warning: Local Operation Directory is undefined.");
            }
        }
        
        if(ConfigData.checkParmValue(ConfigData.shopCheck,"1")) {
            try {
                TFile sharedOp = new TFile(ConfigData.getDefault().getDataParsed(ConfigData.shopLocation));
                if(sharedOp.exists() && sharedOp.isDirectory()) {
                    WepsTreeNodeFile sharedOpsDbDir = new WepsTreeNodeFile(sharedOp, this);
                    sharedOpsDbDir.setDisplayName("Shared Operation Records");
                    addNode(sharedOpsDbDir);
                }
            } catch(NullPointerException e) {
                System.out.println("Warning: Shared Operation Directory is undefined.");
            }
        }
        
        if(ConfigData.checkParmValue("CD-system_oper_cb","1")) {
            try {
                //System.out.println("Op Check is 1");
                TFile sysOp = new TFile(ConfigData.getDefault().getDataParsed(ConfigData.SystemOpDB));
                if(sysOp.exists() && sysOp.isDirectory()) {
                    opsDbDir = new WepsTreeNodeFile (sysOp, this);
                    opsDbDir.setDisplayName("System Operation Records");
                    addNode(opsDbDir);
                }
            } catch(NullPointerException e) {
                System.out.println("Warning: System Operation Directory is undefined.");
            }
        }
        
        boolean uncategorized = ConfigData.checkParmValue(ConfigData.noCat,"1");
//        System.out.println("uncategorized is " + uncategorized);
        if(ConfigData.checkParmValue(ConfigData.cropCheck,"1")) {
            if(!uncategorized) {
//                System.out.println("Adding categorized CRLMOD directory");
                crlmodNode = new WepsTreeNodeCrLmod(lmodType.lmodOperation);
                crlmodNode.refreshChildren();
                addNode(crlmodNode);
                crlmodNode.getBackgroundPropertyChangeObject()
                            .addPropertyChangeListener(PROP_CSIP_BGCATALOG_COMPLETE, this);
//                TFile catFolder = new TFile(About.getOpDirCat());
//                crlOpsDbDir = new WepsTreeNodeFile (catFolder, this);
//                crlOpsDbDir.setDisplayName("CrLmod Operations");
//                addNode(crlOpsDbDir);
                
            } else {
                try {
                    System.out.println("Adding uncategorized CRLMOD directory");
                    TFile catFolder = new TFile(About.getOpDirUncat());
                    crlOpsDbDir = new WepsTreeNodeFile (catFolder, this);
                    crlOpsDbDir.setDisplayName("CRLMOD Operations");
                    addNode(crlOpsDbDir);
                } catch(NullPointerException e) {
                    System.out.println("Warning: Uncategorized CrLmod Operations Directory is missing.");
                }
            }
        }
        
        // For cached files.  Remove after dev? MEH.
        if (ConfigData.checkParmValue("CD-WS-csip-crlmod-Operation-ShowCacheItem","1")) {
            addFileNode (new TFile(About.getWepsCacheDir(), CsipLmodUtil.WepsCacheDirNameOp), 
                         "Cached CR" + CsipLmodUtil.getCrLmodName(lmodType.lmodOperation));
        }
    }
    
    @Override
    public void propertyChange(PropertyChangeEvent evt) {
        super.propertyChange(evt);
        if (null != evt.getPropertyName()) {
            switch (evt.getPropertyName()) {
                case ConfigData.SystemOpDB: {
                    String path = ConfigData.getDefault().getDataParsed(ConfigData.SystemOpDB);
                    if (path != null) {
                        opsDbDir.setFile(new TFile(path));
                    } else {
                        opsDbDir.setFile(null);
                    }
                    nodeStructureChanged(opsDbDir);
                    break;
                }
            }
        }
    }

    @Override
    public boolean accept(java.io.File file) {
        return ( file.isDirectory() || file.getName().toLowerCase().trim().endsWith(WepsFileTypes2.Operation.getExtension()) );
    }
    
    public void refresh() {
        build();
    }
}
