package org.onlab.jdvue;

import java.util.*;

import static com.google.common.base.Objects.toStringHelper;

/**
 * Simple abstraction of a Java source file for the purpose of tracking
 * dependencies and requirements.
 *
 * @author Thomas Vachuska
 */
public class JavaSource extends JavaEntity {

    private String path;
    private JavaPackage javaPackage;

    private final Set<String> importNames = new HashSet<>();
    private Set<JavaEntity> imports;

    /**
     * Creates a new Java source entity.
     *
     * @param name java source file name
     * @param path source file path
     */
    JavaSource(String name, String path) {
        super(name);
        this.path = path;
    }

    /**
     * Returns the Java package for this Java source.
     *
     * @return Java package
     */
    public JavaPackage getPackage() {
        return javaPackage;
    }

    /**
     * Sets the Java package for this Java source.
     *
     * @param javaPackage Java package
     */
    void setPackage(JavaPackage javaPackage) {
        if (this.javaPackage == null) {
            this.javaPackage = javaPackage;
        }
    }

    /**
     * Returns the set of resolved imports for this Java source
     *
     * @return set of imports
     */
    public Set<JavaEntity> getImports() {
        return imports;
    }

    /**
     * Sets the set of resolved imported Java entities for this source.
     *
     * @param imports set of resolved Java entities imported by this source
     */
    void setImports(Set<JavaEntity> imports) {
        if (this.imports == null) {
            this.imports = Collections.unmodifiableSet(new HashSet<>(imports));
        }
    }

    /**
     * Adds a name of an imported, but unresolved, Java entity name.
     *
     * @param name name of an imported Java entity
     */
    void addImportName(String name) {
        importNames.add(name);
    }

    /**
     * Returns the set of imported, but unresolved, Java entity names.
     *
     * @return set of imported Java entity names
     */
    Set<String> getImportNames() {
        return importNames;
    }

    @Override
    public String toString() {
        return toStringHelper(this)
                .add("name", name())
                .add("javaPackage", (javaPackage != null ? javaPackage.name() : ""))
                .add("importNames", importNames.size())
                .add("imports", (imports != null ? imports.size() : 0))
                .toString();
    }

}
