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

sh_bang_template = (' && '.join([
  "echo '#!/bin/bash -e' > $OUT",
  'echo "# this script should run from the root of your workspace." >> $OUT',
  'echo "" >> $OUT',
  "echo 'if [[ \"${VERBOSE}\" ]]; then set -x ; fi' >> $OUT",
  'echo "" >> $OUT',
  'echo %s >> $OUT',
  'echo "" >> $OUT',
  'echo %s >> $OUT',
  # This is supposed to be handled by executable=True, but it doesn't
  # work. Bug?
  'chmod +x $OUT' ]))

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

  build_cmd = ['buck', 'build']

  # This is not using python_binary() to avoid the baggage and bugs
  # that PEX brings along.
  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.iteritems()):
      api_cmd.append('-s %s:%s:$(location %s)' % (a,type,t))
      api_targets.append(t)

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

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

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

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

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