#!/usr/bin/env python
#
# Copyright 2016 Google Inc.
#
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.


"""Tool for managing assets."""


import argparse
import asset_utils
import os
import shutil
import subprocess
import sys

FILE_DIR = os.path.dirname(os.path.abspath(__file__))
INFRA_BOTS_DIR = os.path.realpath(os.path.join(FILE_DIR, os.pardir))

sys.path.insert(0, INFRA_BOTS_DIR)
import utils


def add(args):
  """Add a new asset."""
  asset_utils.Asset.add(args.asset_name,
                        asset_utils.MultiStore(gsutil=args.gsutil))


def remove(args):
  """Remove an asset."""
  asset_utils.Asset(args.asset_name,
                    asset_utils.MultiStore(gsutil=args.gsutil)).remove()


def download(args):
  """Download the current version of an asset."""
  asset = asset_utils.Asset(args.asset_name,
                            asset_utils.MultiStore(gsutil=args.gsutil))
  asset.download_current_version(args.target_dir)


def upload(args):
  """Upload a new version of the asset."""
  asset = asset_utils.Asset(args.asset_name,
                            asset_utils.MultiStore(gsutil=args.gsutil))
  asset.upload_new_version(args.target_dir, commit=args.commit,
                           extra_tags=args.extra_tags)


def main(argv):
  parser = argparse.ArgumentParser(description='Tool for managing assets.')
  subs = parser.add_subparsers(help='Commands:')

  prs_add = subs.add_parser('add', help='Add a new asset.')
  prs_add.set_defaults(func=add)
  prs_add.add_argument('asset_name', help='Name of the asset.')
  prs_add.add_argument('--gsutil')

  prs_remove = subs.add_parser('remove', help='Remove an asset.')
  prs_remove.set_defaults(func=remove)
  prs_remove.add_argument('asset_name', help='Name of the asset.')
  prs_remove.add_argument('--gsutil')

  prs_download = subs.add_parser(
      'download', help='Download the current version of an asset.')
  prs_download.set_defaults(func=download)
  prs_download.add_argument('asset_name', help='Name of the asset.')
  prs_download.add_argument('--target_dir', '-t', required=True)
  prs_download.add_argument('--gsutil')

  prs_upload = subs.add_parser(
      'upload', help='Upload a new version of an asset.')
  prs_upload.set_defaults(func=upload)
  prs_upload.add_argument('asset_name', help='Name of the asset.')
  prs_upload.add_argument('--target_dir', '-t', required=True)
  prs_upload.add_argument('--gsutil')
  prs_upload.add_argument('--commit', action='store_true')
  prs_upload.add_argument(
    '--extra_tags', nargs='+',
    help='Additional tags for the CIPD package, "key:value"')

  args = parser.parse_args(argv)
  args.func(args)


if __name__ == '__main__':
  main(sys.argv[1:])
