# Copyright (C) 2013 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

GERRIT = 'GERRIT:'
GERRIT_API = 'GERRIT_API:'
MAVEN_CENTRAL = 'MAVEN_CENTRAL:'
MAVEN_LOCAL = 'MAVEN_LOCAL:'
MAVEN_SNAPSHOT = 'MAVEN_SNAPSHOT:'

def define_license(name):
  n = 'LICENSE-' + name
  genrule(
    name = n,
    cmd = 'ln -s $SRCS $OUT',
    srcs = [n],
    out = n,
    visibility = ['PUBLIC'],
  )

def maven_jar(
    name,
    id,
    license,
    exclude = [],
    exclude_java_sources = False,
    unsign = False,
    deps = [],
    exported_deps = [],
    sha1 = '', bin_sha1 = '', src_sha1 = '',
    repository = MAVEN_CENTRAL,
    attach_source = True,
    visibility = ['PUBLIC'],
    local_license = False):
  from os import path

  def maven_snapshot(parts):
    if len(parts) != 4:
      raise NameError('%s:\nexpected id="groupId:artifactId:version:snapshot]"'
                      % id)
    group, artifact, version, snapshot = parts
    jar = path.join(name,
      version + '-SNAPSHOT',
      '-'.join([artifact.lower(), version, snapshot]))
    url = '/'.join([
      repository,
      group.replace('.', '/'),
      artifact,
      version + '-SNAPSHOT',
      '-'.join([artifact.lower(), version, snapshot])])
    return jar, url

  def maven_release(parts):
    if len(parts) not in [3, 4]:
      raise NameError('%s:\nexpected id="groupId:artifactId:version[:classifier]"'
                      % id)
    if len(parts) == 4:
      group, artifact, version, classifier = parts
      file_version = version + '-' + classifier
    else:
      group, artifact, version = parts
      file_version = version

    jar = path.join(name, artifact.lower() + '-' + file_version)
    url = '/'.join([
      repository,
      group.replace('.', '/'),
      artifact,
      version,
      artifact + '-' + file_version])

    return jar, url

  parts = id.split(':')
  if repository.startswith(MAVEN_SNAPSHOT):
    jar, url = maven_snapshot(parts)
  else:
    jar, url = maven_release(parts)

  binjar = jar + '.jar'
  binurl = url + '.jar'

  srcjar = jar + '-src.jar'
  srcurl = url + '-sources.jar'

  cmd = ['$(exe //tools:download_file)', '-o', '$OUT', '-u', binurl]
  if sha1:
    cmd.extend(['-v', sha1])
  elif bin_sha1:
    cmd.extend(['-v', bin_sha1])
  for x in exclude:
    cmd.extend(['-x', x])
  if exclude_java_sources:
    cmd.append('--exclude_java_sources')
  if unsign:
    cmd.append('--unsign')

  genrule(
    name = '%s__download_bin' % name,
    cmd = ' '.join(cmd),
    out = binjar,
  )
  license = ':LICENSE-' + license
  if not local_license:
    license = '//lib' + license
  license = [license]

  if src_sha1 or attach_source:
    cmd = ['$(exe //tools:download_file)', '-o', '$OUT', '-u', srcurl]
    if src_sha1:
      cmd.extend(['-v', src_sha1])
    genrule(
      name = '%s__download_src' % name,
      cmd = ' '.join(cmd),
      out = srcjar,
    )
    prebuilt_jar(
      name = '%s_src' % name,
      binary_jar = ':%s__download_src' % name,
      deps = license,
      visibility = visibility,
    )
  else:
    srcjar = None
    genrule(
      name = '%s_src' % name,
      cmd = ':>$OUT',
      out = '__%s__no_src' % name,
    )

  if exported_deps:
    prebuilt_jar(
      name = '%s__jar' % name,
      deps = deps + license,
      binary_jar = ':%s__download_bin' % name,
      source_jar = ':%s__download_src' % name if srcjar else None,
    )
    java_library(
      name = name,
      exported_deps = exported_deps + [':' + name + '__jar'],
      visibility = visibility,
    )
  else:
    prebuilt_jar(
      name = name,
      deps = deps + license,
      binary_jar = ':%s__download_bin' % name,
      source_jar = ':%s__download_src' % name if srcjar else None,
      visibility = visibility,
    )


def merge_maven_jars(
    name,
    srcs,
    visibility = []):

  def cmd(jars):
    return ('$(location //tools:merge_jars) $OUT '
            + ' '.join(['$(location %s)' % j for j in jars]))

  genrule(
    name = '%s__merged_bin' % name,
    cmd = cmd(['%s__download_bin' % s for s in srcs]),
    out = '%s__merged.jar' % name,
  )
  genrule(
    name = '%s__merged_src' % name,
    cmd = cmd(['%s__download_src' % s for s in srcs]),
    # tools/eclipse/project.py requires -src.jar suffix.
    out = '%s__merged-src.jar' % name,
  )
  prebuilt_jar(
    name = name,
    binary_jar = ':%s__merged_bin' % name,
    source_jar = ':%s__merged_src' % name,
    visibility = visibility,
  )
