#!/usr/bin/env python
# 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.

from __future__ import print_function
from optparse import OptionParser
from os import path
import pipes

from sys import stderr
from util import check_output

def mvn(action):
  return ['mvn', '--file', path.join(root, 'fake_pom_%s.xml' % action)]

def mvn(action):
  return ['mvn', '--file', path.join(root, 'fake_pom_%s.xml' % action)]

opts = OptionParser()
opts.add_option('--repository', help='maven repository id')
opts.add_option('--url', help='maven repository url')
opts.add_option('-o')
opts.add_option('-g', help='maven group id')
opts.add_option('-a', help='action (valid actions are: install,deploy)')
opts.add_option('-v', help='package version')
opts.add_option('-s', action='append', help='triplet of artifactId:type:path')

args, ctx = opts.parse_args()
if not args.g:
  print('group is empty', file=stderr)
  exit(1)
if not args.v:
  print('version is empty', file=stderr)
  exit(1)

common = [
  '-DgroupId=%s' % args.g,
  '-Dversion=%s' % args.v,
]

root = path.abspath(__file__)
while not path.exists(path.join(root, '.buckconfig')):
  root = path.dirname(root)

if 'install' == args.a:
  cmd = mvn(args.a) + ['install:install-file'] + common
elif 'deploy' == args.a:
  cmd = mvn(args.a) + [
    'deploy:deploy-file',
    '-DrepositoryId=%s' % args.repository,
    '-Durl=%s' % args.url,
  ] + common
else:
  print("unknown action -a %s" % args.a, file=stderr)
  exit(1)

for spec in args.s:
  artifact, packaging_type, src = spec.split(':')
  cmds = cmd + [
    '-DartifactId=%s' % artifact,
    '-Dpackaging=%s' % packaging_type,
    '-Dfile=%s' % src,
  ]
  try:
    check_output(cmds)
  except Exception as e:
    cmds_str = ' '.join(pipes.quote(c) for c in cmds)
    print("%s command failed: `%s`: %s" % (args.a, cmds_str, e), file=stderr)
    exit(1)

with open(args.o, 'w') as fd:
  if args.repository:
    print('Repository: %s' % args.repository, file=fd)
  if args.url:
    print('URL: %s' % args.url, file=fd)
  print('Version: %s' % args.v, file=fd)
