# Copyright 2016 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

from recipe_engine import recipe_api

import string

class GitClApi(recipe_api.RecipeApi):
  def __call__(self, subcmd, args, name=None, **kwargs):
    if not name:
      name = 'git_cl ' + subcmd

    if kwargs.get('suffix'):
      name = name + ' (%s)' % kwargs.pop('suffix')

    my_loc = self.c.repo_location if self.c else None
    with self.m.context(cwd=self.m.context.cwd or my_loc):
      return self.m.python(
          name, self.repo_resource('git_cl.py'), [subcmd] + args,
          **kwargs)

  def get_description(self, patch_url=None, codereview=None, **kwargs):
    """DEPRECATED. Consider using gerrit.get_change_description instead."""
    args = ['-d']
    if patch_url or codereview:
      assert patch_url and codereview, (
          'Both patch_url and codereview must be provided')
      args.append('--%s' % codereview)
      args.append(patch_url)

    return self('description', args, stdout=self.m.raw_io.output(), **kwargs)

  def set_description(self, description, patch_url=None, codereview=None, **kwargs):
    args = ['-n', '-']
    if patch_url or codereview:
      assert patch_url and codereview, (
          'Both patch_url and codereview must be provided')
      args.append(patch_url)
      args.append('--%s' % codereview)

    return self(
        'description', args, stdout=self.m.raw_io.output(),
        stdin=self.m.raw_io.input_text(description),
        name='git_cl set description', **kwargs)

  def upload(self, message, upload_args=None, **kwargs):
    upload_args = upload_args or []

    upload_args.extend(['--message-file', self.m.raw_io.input_text(message)])

    return self('upload', upload_args, **kwargs)

  def issue(self, **kwargs):
    return self('issue', [], stdout=self.m.raw_io.output(), **kwargs)

