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

import fnmatch

from recipe_engine import recipe_api

CATAPULT_URL = 'https://chromeperf.appspot.com'


class CatapultApi(recipe_api.RecipeApi):
  """CatapultApi provides support for the Catapult infra tool."""

  FILE_PATTERN = '*.catapult_json'

  def __init__(self, *args, **kwargs):
    super(CatapultApi, self).__init__(*args, **kwargs)
    self._catapult = None

  def __call__(self, subcommand, *flags, **kwargs):
    """Return a catapult command step.

    Args:
      subcommand (str): The Catapult CLI command to run; e.g. 'make_histogram'
        or 'update'
      name (str): The name to use for this step.
    """
    self._ensure()
    cmd = [self._catapult, subcommand]
    cmd.extend(flags)
    name = kwargs.pop('name', 'catapult ' + subcommand)
    with self.m.context(infra_steps=True):
      return self.m.step(name, cmd, **kwargs)

  def _ensure(self):
    if self._catapult:
      return
    with self.m.step.nest('ensure catapult'):
      with self.m.context(infra_steps=True):
        cipd_dir = self.m.path['start_dir'].join('cipd', 'catapult')
        pkgs = self.m.cipd.EnsureFile()
        pkgs.add_package('fuchsia/infra/catapult/${platform}', 'latest')
        self.m.cipd.ensure(cipd_dir, pkgs)
        self._catapult = cipd_dir.join('catapult')

  def upload(self, input_file, timeout=None, **kwargs):
    """
    Uploads performance JSON data to a dashboard.

    Args:
      input_file (Path): Full path to the input file to upload.
      timeout (string): Optional request timeout duration string. e.g. 12s or
        1m.
      kwargs: Keyword argments passed to the returned step.

    Returns:
      A step to execute the upload subcommand.
    """
    args = ['upload', '-url', CATAPULT_URL]
    if timeout:
      args += ['-timeout', timeout]
    args.append(input_file)

    return self(*args, **kwargs)

  # TODO(olivernewman): Delete this method once the fuchsia_perf recipe is
  # removed, and just rely on glob searches for catapult files.
  def is_catapult_file(self, path):
    return fnmatch.fnmatch(path, self.FILE_PATTERN)
