# 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:'

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