/* sbt -- Simple Build Tool
 * Copyright 2009,2010  Mark Harrah
 */
package sbt
package impl

import StringUtilities.nonEmpty

trait DependencyBuilders
{
	final implicit def toGroupID(groupID: String): GroupID =
	{
		nonEmpty(groupID, "Group ID")
		new GroupID(groupID)
	}
	final implicit def toRepositoryName(name: String): RepositoryName =
	{
		nonEmpty(name, "Repository name")
		new RepositoryName(name)
	}
	final implicit def moduleIDConfigurable(m: ModuleID): ModuleIDConfigurable =
	{
		require(m.configurations.isEmpty, "Configurations already specified for module " + m)
		new ModuleIDConfigurable(m)
	}
}

final class GroupID private[sbt] (groupID: String)
{
	def % (artifactID: String) = groupArtifact(artifactID, CrossVersion.Disabled)
	def %% (artifactID: String): GroupArtifactID = groupArtifact(artifactID, CrossVersion.binary)

	@deprecated(deprecationMessage, "0.12.0")
	def %% (artifactID: String, crossVersion: String => String) = groupArtifact(artifactID, CrossVersion.binaryMapped(crossVersion))
	@deprecated(deprecationMessage, "0.12.0")
	def %% (artifactID: String, alternatives: (String, String)*) = groupArtifact(artifactID, CrossVersion.binaryMapped(Map(alternatives: _*) orElse { case s => s }))

	private def groupArtifact(artifactID: String, cross: CrossVersion) =
	{
		nonEmpty(artifactID, "Artifact ID")
		new GroupArtifactID(groupID, artifactID, cross)
	}

	private[this] def deprecationMessage = """Use the cross method on the constructed ModuleID.  For example: ("a" % "b" % "1").cross(...)"""
}
final class GroupArtifactID private[sbt] (groupID: String, artifactID: String, crossVersion: CrossVersion)
{
	def % (revision: String): ModuleID =
	{
		nonEmpty(revision, "Revision")
		ModuleID(groupID, artifactID, revision).cross(crossVersion)
	}
}
final class ModuleIDConfigurable private[sbt] (moduleID: ModuleID)
{
	def % (configuration: Configuration): ModuleID = %(configuration.name)

	def % (configurations: String): ModuleID =
	{
		nonEmpty(configurations, "Configurations")
		val c = configurations
		moduleID.copy(configurations = Some(c))
	}
}
final class RepositoryName private[sbt] (name: String)
{
	def at (location: String) =
	{
		nonEmpty(location, "Repository location")
		new MavenRepository(name, location)
	}
}