# 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.

include_defs('//lib/local.defs')

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

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

  parts = id.split(':')
  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
  else:
    group, artifact, version = parts
    classifier = None

  # SNAPSHOT artifacts are handled differently on Google storage bucket:
  # 'SNAPSHOT' is discarded from the directory name. However on other
  # Maven repositories, most notable local repository located in
  # ~/.m2/repository (and is supported through MAVEN_LOCAL repository)
  # it must be preserved, otherwise the artifact wouldn't be found.
  # Atm the SNAPSHOT part is only discarded for Google storage bucket.
  if 'SNAPSHOT' in version and repository.startswith(GERRIT):
    file_version = version.replace('-SNAPSHOT', '')
    version = version.split('-SNAPSHOT')[0] + '-SNAPSHOT'
  else:
    file_version = version

  if classifier is not None:
    file_version += '-' + classifier

  jar = path.join(name, artifact.lower() + '-' + file_version)

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

  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,
      visibility = visibility,
    )
    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,
  )
