// GraphTea Project: http://github.com/graphtheorysoftware/GraphTea
// Copyright (C) 2012 Graph Theory Software Foundation: http://GraphTheorySoftware.com
// Copyright (C) 2008 Mathematical Science Department of Sharif University of Technology
// Distributed under the terms of the GNU Lesser General Public License (LGPL): http://www.gnu.org/licenses/

/*
 * BaseVertex.java
 *
 * Created on November 13, 2004, 8:31 PM
 */

package graphtea.library;

import java.util.List;
import java.util.ArrayList;

/**
 * The base class for all vertices. By default each vertex has a integer property
 * named color.
 *
 * @author Omid Aladini
 */

public class BaseVertex {
    protected BaseVertexProperties prop;
    private ArrayList<Integer> subgraphIds = null;
    private Integer id;

    public BaseVertex(BaseVertexProperties prop) {
        this.prop = prop;
    }

    public BaseVertex() {
        prop = new BaseVertexProperties(0, false);
    }

    @Override
    public String toString() {
        return "v" + id;
    }

    public BaseVertex getCopy() {
        return new BaseVertex(this.prop);
    }

    /**
     * Returns the color of the vertex.
     *
     * @return The color associated with the vertex.
     */
    public int getColor() {
        return prop.color;
    }

    /**
     * Sets the color of the vertex.
     *
     * @param color Sets colorings as the color of the vertex.
     */
    public void setColor(int color) {
        prop.color = color;
    }


    /**
     * Returns true if the vertex is already marked.
     *
     * @return Returns true if the vertex is already marked.
     */
    public boolean getMark() {
        return prop.mark;
    }

    /**
     * Flag whether it is marked.
     *
     * @param mark whether the vertex is marked.
     */
    public void setMark(boolean mark) {
        prop.mark = mark;
    }

    /**
     * Returns the index of the vertex in the graph.
     *
     * @return Returns the index of the vertex in the graph.
     */
    public int getId() {
        return id;
    }

    /**
     * Returns the index of the vertex in the graph that belongs to a specified subgraph.
     *
     * @return Returns the index of the vertex in the graph that belongs to a specified subgraph..
     */
    int getSubgraphId(int subgraphIndex) {
        return subgraphIds.get(subgraphIndex - 1);
    }

    void informNewSubgraph() {
        if (subgraphIds == null)
            subgraphIds = new ArrayList<>();
        subgraphIds.add(0);
    }

    /**
     * Sets the index of the vertex in the graph.
     *
     * @param id the index of the vertex to be set.
     */
    void setId(int id) {
        this.id = id;
    }

    /**
     * Sets the index of the vertex in the graph that belongs to a specified subgraph.
     *
     * @return Sets the index of the vertex in the graph that belongs to a specified subgraph..
     */
    int setSubgraphId(int subgraphIndex, int id) {
        return subgraphIds.set(subgraphIndex - 1, id);
    }

    /**
     * Sets properties object for this vertex; Overwrites the existing.
     *
     * @param prop The property object to set.
     */
    public void setProp(BaseVertexProperties prop) {
        this.prop = prop;
    }

    /**
     * Returns property object for this vertex.
     *
     * @return Returns property object for this vertex.
     */
    public BaseVertexProperties getProp() {
        return prop;
    }

}
