# Copyright (C) 2016 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.

sh_bang_template = (" && ".join([
    "echo '#!/bin/bash -e' > $@",
    "echo \"# this script should run from the root of your workspace.\" >> $@",
    "echo \"\" >> $@",
    "echo 'if [[ \"$$VERBOSE\" ]]; then set -x ; fi' >> $@",
    "echo \"\" >> $@",
    "echo %s >> $@",
    "echo \"\" >> $@",
    "echo %s >> $@",
]))

def maven_package(
    version,
    repository = None,
    url = None,
    jar = {},
    src = {},
    doc = {},
    war = {}):

  build_cmd = ['bazel', 'build']
  mvn_cmd = ['python', 'tools/maven/mvn.py', '-v', version]
  api_cmd = mvn_cmd[:]
  api_targets = []
  for type,d in [('jar', jar), ('java-source', src), ('javadoc', doc)]:
    for a,t in sorted(d.items()):
      api_cmd.append('-s %s:%s:$(location %s)' % (a,type,t))
      api_targets.append(t)

  native.genrule(
    name = 'gen_api_install',
    cmd = sh_bang_template % (
      ' '.join(build_cmd + api_targets),
      ' '.join(api_cmd + ['-a', 'install'])),
    srcs = api_targets,
    outs = ['api_install.sh'],
    executable = True,
    testonly = 1,
  )

  if repository and url:
    native.genrule(
      name = 'gen_api_deploy',
      cmd = sh_bang_template % (
        ' '.join(build_cmd + api_targets),
        ' '.join(api_cmd + ['-a', 'deploy',
                            '--repository', repository,
                            '--url', url])),
      srcs = api_targets,
      outs = ['api_deploy.sh'],
      executable = True,
      testonly = 1,
    )

  war_cmd = mvn_cmd[:]
  war_targets = []
  for a,t in sorted(war.items()):
    war_cmd.append('-s %s:war:$(location %s)' % (a,t))
    war_targets.append(t)

  native.genrule(
    name = 'gen_war_install',
    cmd = sh_bang_template % (' '.join(build_cmd + war_targets),
                              ' '.join(war_cmd + ['-a', 'install'])),
    srcs = war_targets,
    outs = ['war_install.sh'],
    executable = True,
  )

  if repository and url:
    native.genrule(
      name = 'gen_war_deploy',
      cmd = sh_bang_template % (
          ' '.join(build_cmd + war_targets),
          ' '.join(war_cmd + [
        '-a', 'deploy',
        '--repository', repository,
        '--url', url])),
      srcs = war_targets,
      outs = ['war_deploy.sh'],
      executable = True,
    )
