package usda.weru.remoteDataAccess;

import java.io.File;
import java.nio.file.Path;
import java.util.ArrayList;
import javax.swing.ProgressMonitor;
import usda.weru.remoteDataAccess.exceptions.RdaConnectException;

/**
 *
 * @author mhaas
 */
    
public class RdaHierarchicalItem  {
    protected String name;
    protected String parentPath;
    protected RdaHierarchicalItem parent;
    protected boolean isFile;
    protected ArrayList<RdaHierarchicalItem> children;
    protected boolean childrenLoaded;
    protected RdaInputController controller;

    public RdaHierarchicalItem(String name, RdaInputController controller) {
        this.name = name;
        this.parent = null;
        this.controller = controller;
        parentPath = null;
        isFile = false;
        children = new ArrayList<>();
        childrenLoaded = false;
    }

    public RdaHierarchicalItem(String name, RdaHierarchicalItem parent) {
        this(name, parent, true);
    }

    public RdaHierarchicalItem(String name, RdaHierarchicalItem parent, boolean isFile) {
        this.name = name;
        this.parent = parent;
        controller = parent.controller;
        parentPath = "";
        if (parent.parentPath != null) {
            if (parent.parentPath.length() > 0) {
                parentPath += parent.parentPath + "\\";
            }
            parentPath += parent.name;
        }
        this.isFile = isFile;
        children = new ArrayList<>();
        childrenLoaded = false;
        //System.out.println("RDA Hierarchical Item Name: " + this.name);
        //System.out.println("RDA Hierarchical Item Parent: " + this.parent.getName());
        //System.out.println("RDA Hierarchical Item Controller: " + this.controller.getInterfaceName());
    }

    public void setDestinationPath(Path destPath) {
        controller.controllerSetDestinationPath(destPath);
    }

    public int addChild(RdaHierarchicalItem child) {
        isFile = false;
        children.add(child);
        childrenLoaded = true;
        return children.size();
    }

    public void deleteChild(RdaHierarchicalItem child) {
        children.remove(child);
    }

    public void deleteChild(int idx) {
        children.remove(idx);
    }

    public int findChild(RdaHierarchicalItem child) {
        isFile = false;
        return children.indexOf(child);
    }

    public RdaHierarchicalItem getChild(String name) {
        int idx;
        RdaHierarchicalItem temp = new RdaHierarchicalItem(name, this);
        if ((idx = children.indexOf(temp)) > -1) {
            return children.get(idx);
        }
        return null;
    }

    public RdaHierarchicalItem getChild(int idx) {
        return children.get(idx);
    }

    public ArrayList<RdaHierarchicalItem> getChildren() {
        return children;
    }

    public RdaHierarchicalItem getParent() {
        return parent;
    }

    public String getName() {
        return name;
    }

    public void updateName(String newName) {
        name = newName;
    }

    public void updateParentPath(String newName) {
        parentPath = newName;
    }

    public boolean getChildrenLoaded() {
        return childrenLoaded;
    }

    public String getParentPath() {
        return parentPath;
    }

    public File getItemData() throws RdaConnectException {
        return controller.getFile(this);
    }
    
    public File getItemData(ProgressMonitor progress) throws RdaConnectException {
        return controller.getFile(this, progress);
    }

    public boolean isFile() {
        return (isFile);
    }

    @Override
    public boolean equals(Object obj) {
        if (obj instanceof RdaHierarchicalItem) {
            return this.name.equals(((RdaHierarchicalItem) obj).getName());
        }
        return false;
    }

    @Override
    public int hashCode() {
        return System.identityHashCode(this.name);
    }

    public ArrayList<String> getChildrenNames() {
        ArrayList<String> res = new ArrayList<>();

        children.forEach(child -> {
            res.add(child.getName());
        });
        return res;
    }

    public RdaHierarchicalItem getBottomPathItem(String path) {
        RdaHierarchicalItem subTree;
        ArrayList<RdaHierarchicalItem> subTreeChildren;
        int strIdx1 = 0;
        int strIdx2;
        int i;

        subTree = this;
        while (strIdx1 < path.length()) {
            if ((strIdx2 = path.indexOf('\\', strIdx1)) == -1) {
                strIdx2 = path.length();
            }
            subTreeChildren = subTree.getChildren();
            String pathItem = path.substring(strIdx1, strIdx2);
            if ((i = subTreeChildren.indexOf(pathItem)) == -1) {
                // parentPath traverse failed. stop.
                subTree = null;
                break;
            }
            subTree = subTreeChildren.get(i);
            strIdx1 = strIdx2;
        }
        
        return subTree;
    }
}
