package org.jboss.shrinkwrap.resolver.api.maven;

import org.jboss.shrinkwrap.resolver.api.maven.coordinate.MavenCoordinate;

/**
 * Resolved Maven-based artifact's metadata
 *
 * @author <a href="mailto:alr@jboss.org">Andrew Lee Rubinger</a>
 * @author <a href="mailto:kpiwko@redhat.com">Karel Piwko</a>
 * @author <a href="mailto:mmatloka@gmail.com">Michal Matloka</a>
 */
public interface MavenArtifactInfo {

    /**
     * Returns the defined coordinate (i.e. address) of this resolved artifact.
     *
     * @return The defined coordinate (i.e. address) of this resolved artifact.
     */
    MavenCoordinate getCoordinate();

    /**
     * Returns the resolved "version" portion of this artifact's coordinates; SNAPSHOTs may declare a version field (as
     * represented by {@link MavenResolvedArtifact#getResolvedVersion()}), which must resolve to a versioned snapshot version
     * number. That resolved version number is reflected by this field. In the case of true versions (i.e.
     * non-SNAPSHOTs), this call will be equal to {@link MavenCoordinate#getVersion()}.
     *
     * @return The resolved "version" portion of this artifact's coordinates
     */
    String getResolvedVersion();

    /**
     * Returns whether this artifact is using a SNAPSHOT version.
     *
     * @return Whether this artifact is using a SNAPSHOT version.
     */
    boolean isSnapshotVersion();

    /**
     * Returns the file extension of this artifact, i.e. ("jar")
     *
     * @return The file extension, which is never null
     */
    String getExtension();

    /**
     * Returns artifacts dependencies.
     *
     * @return Artifacts dependencies.
     */
    MavenArtifactInfo[] getDependencies();

    /**
     * Returns the scope information of this artifact
     *
     * @return the scope information of this artifact
     */
    ScopeType getScope();

    /**
     * Returns true if artifact is optional.
     *
     * @return return true if artifact is optional.
     */
    boolean isOptional();
}
