/*******************************************************************************
 * Copyright (c) 2019 École Polytechnique de Montréal
 *
 * All rights reserved. This program and the accompanying materials are
 * made available under the terms of the Eclipse Public License 2.0 which
 * accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *******************************************************************************/

package org.eclipse.tracecompass.incubator.analysis.core.weighted.tree;

import java.util.Collection;

import org.eclipse.jdt.annotation.Nullable;

/**
 * A basic interface for a tree structure, ie hierarchical data where each node
 * can be linked to a specific object.
 *
 * @author Geneviève Bastien
 */
public interface ITree {

    /**
     * Get the name of this tree element, it should be human-readable as it will
     * be displayed to the user
     *
     * @return The name of this tree element
     */
    String getName();

    /**
     * Get the parent of this tree element
     *
     * @return The parent of this object
     */
    @Nullable ITree getParent();

    /**
     * Get the children of this object
     *
     * @return A collection of children elements
     */
    Collection<ITree> getChildren();

    /**
     * Add a child to this tree object. This method should make sure to set the
     * parent of the child to the curent object
     *
     * @param child
     *            The child object
     */
    void addChild(ITree child);

    /**
     * Set the parent of this tree object
     *
     * @param parent
     *            The parent of the object, it can be <code>null</code> if there
     *            is no parent
     */
    void setParent(@Nullable ITree parent);

    /**
     * Create a new element that is a copy of the current object. This copy
     * should copy only the object's data, not the hierarchy as callers of this
     * method may want to create a new hierarchy for those elements.
     *
     * @return a new element, copy of the current element
     */
    ITree copyElement();

    /**
     * Get the depth of this object, recursively with its children. An object
     * with no children would have a depth of 1.
     *
     * @param tree
     *            The object for which to get the depth
     * @return The depth
     */
    static int getDepth(ITree tree) {
        Collection<ITree> children = tree.getChildren();
        if (children.isEmpty()) {
            return 1;
        }
        int depth = 1;
        for (ITree child : children) {
            depth = Math.max(depth, getDepth(child) + 1);
        }
        return depth;
    }

}
