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

"""Helper functions to upload data to logdog."""

import logging
import os
import sys

from pylib import constants
from pylib.utils import decorators

sys.path.insert(
    0,
    os.path.abspath(
        os.path.join(constants.DIR_SOURCE_ROOT, 'third_party', 'logdog')))
from logdog import bootstrap  # pylint: disable=import-error


@decorators.NoRaiseException(default_return_value='',
                             exception_message=('Ignore this exception. '
                                                'crbug.com/675666'))
def text(name, data, content_type=None):
  """Uploads text to logdog.

  Args:
    name: Name of the logdog stream.
    data: String with data you want to upload.
    content_type: The optional content type of the stream. If None, a
      default content type will be chosen.

  Returns:
    Link to view uploaded text in logdog viewer.
  """
  logging.info('Writing text to logdog stream, %s', name)
  with get_logdog_client().text(name, content_type=content_type) as stream:
    stream.write(data)
    return stream.get_viewer_url()


@decorators.NoRaiseException(default_return_value=None,
                             exception_message=('Ignore this exception. '
                                                'crbug.com/675666'))
def open_text(name):
  """Returns a file like object which you can write to.

  Args:
    name: Name of the logdog stream.

  Returns:
    A file like object. close() file when done.
  """
  logging.info('Opening text logdog stream, %s', name)
  return get_logdog_client().open_text(name)


@decorators.NoRaiseException(default_return_value='',
                             exception_message=('Ignore this exception. '
                                                'crbug.com/675666'))
def binary(name, binary_path):
  """Uploads binary to logdog.

  Args:
    name: Name of the logdog stream.
    binary_path: Path to binary you want to upload.

  Returns:
    Link to view uploaded binary in logdog viewer.
  """
  logging.info('Writing binary to logdog stream, %s', name)
  with get_logdog_client().binary(name) as stream:
    with open(binary_path, 'r') as f:
      stream.write(f.read())
      return stream.get_viewer_url()


@decorators.NoRaiseException(default_return_value='',
                             exception_message=('Ignore this exception. '
                                                'crbug.com/675666'))
def get_viewer_url(name):
  """Get Logdog viewer URL.

  Args:
    name: Name of the logdog stream.

  Returns:
    Link to view uploaded binary in logdog viewer.
  """
  return get_logdog_client().get_viewer_url(name)


@decorators.Memoize
def get_logdog_client():
  logging.info('Getting logdog client.')
  return bootstrap.ButlerBootstrap.probe().stream_client()
