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

"""Upload a single build command stats file to appengine."""

from __future__ import print_function

import logging
import re
import sys

from chromite.cbuildbot import constants
from chromite.lib import commandline
from chromite.lib import cros_build_lib
from chromite.lib import stats


FILE_LOAD_ERROR = 'Error loading %s'
UNCAUGHT_ERROR = 'Uncaught command stats exception.'


class LoadError(RuntimeError):
  """Error during loading of stats file."""


class StatsLoader(object):
  """Loads stats from a file."""

  @classmethod
  def LoadFile(cls, stat_file):
    """Return a Stats object constructed from contents of |stat_file|."""

    with open(stat_file, 'r') as f:
      first_line = f.readline().rstrip()
      match = re.match(r'Chromium OS .+ Version (\d+)$', first_line)
      if not match:
        raise LoadError('Stats file not in expected format')

      version = int(match.group(1))
      loader = cls._GetLinesLoader(version)
      if not loader:
        raise LoadError('Stats file version %s not supported.' % version)

      return loader(f.readlines())

  @classmethod
  def _GetLinesLoader(cls, version):
    LOADERS = (
        None,
        cls._LoadLinesV1,  # Version 1 loader (at index 1)
    )

    if version < len(LOADERS) and version >= 0:
      return LOADERS[version]

    return None

  @classmethod
  def _LoadLinesV1(cls, stat_lines):
    """Load stat lines in Version 1 format."""
    data = {}
    for line in stat_lines:
      # Each line has following format:
      # attribute_name Rest of line is value for attribute_name
      # Note that some attributes may have no value after their name.
      attr, _sep, value = line.rstrip().partition(' ')
      if not attr:
        attr = line.rstrip()

      data[attr] = value

    return stats.Stats(**data)


def main(argv):
  """Main function."""
  # This is not meant to be a user-friendly script.  It takes one and
  # only one argument, which is a build stats file to be uploaded
  epilog = (
      'This script is not intended to be run manually.  It is used as'
      ' part of the build command statistics project.'
  )
  in_golo = cros_build_lib.GetHostDomain().endswith(constants.GOLO_DOMAIN)
  debug_level = commandline.ArgumentParser.DEFAULT_LOG_LEVEL
  if in_golo:
    debug_level = 'debug'
  parser = commandline.ArgumentParser(
      epilog=epilog, default_log_level=debug_level)
  parser.add_argument(
      'build_stats_file', nargs=1, default=None)
  options = parser.parse_args(argv)

  try:
    cmd_stats = StatsLoader.LoadFile(options.build_stats_file[0])
  except LoadError:
    logging.error(FILE_LOAD_ERROR, options.build_stats_file[0],
                  exc_info=True)
    sys.exit(1)

  try:
    stats.StatsUploader.Upload(cmd_stats)
  except Exception:
    logging.error(UNCAUGHT_ERROR, exc_info=True)
    sys.exit(1)
