#!/usr/bin/python

# Copyright (c) 2014 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.

import ast
import os

from utils import command_executer

class ImageDownloader(object):

  def __init__(self, logger_to_use=None, log_level="verbose",
               cmd_exec=None):
    self._logger = logger_to_use
    self.log_level = log_level
    self._ce = cmd_exec or command_executer.GetCommandExecuter(self._logger,
                                                   log_level = self.log_level)

  def _GetBuildID (self, chromeos_root, xbuddy_label):
    # Get the translation of the xbuddy_label into the real Google Storage
    # image name.
    command = ("cd ~/trunk/src/third_party/toolchain-utils/crosperf; "
               "python translate_xbuddy.py '%s'" % xbuddy_label)
    retval, build_id_tuple_str, _ = self._ce.ChrootRunCommand(chromeos_root,
                                                          command, True)
    build_id_tuple = ast.literal_eval(build_id_tuple_str)
    build_id = build_id_tuple[0]

    return build_id

  def _DownloadImage(self, chromeos_root, build_id):
    if self.log_level == "average":
      self._logger.LogOutput ("Preparing to download %s image to local directory." % build_id)

    # Make sure the directory for downloading the image exists.
    download_path = os.path.join(chromeos_root, "chroot/tmp",
                                 build_id)
    image_path = os.path.join(download_path, "chromiumos_test_image.bin")
    if not os.path.exists(download_path):
      os.makedirs(download_path)

    # Check to see if the image has already been downloaded.  If not,
    # download the image.
    status = 0
    if not os.path.exists(image_path):
      command = ("gsutil cp gs://chromeos-image-archive/%s"
                 "/chromiumos_test_image.tar.xz /tmp/%s" % (build_id,
                                                            build_id))

      if self.log_level != "verbose":
        self._logger.LogOutput ("CMD: %s" % command)
      status = self._ce.ChrootRunCommand(chromeos_root, command)

    if status == 0:
      return image_path
    else:
      return None

  def _UncompressImage(self, chromeos_root, build_id):
    # Check to see if the file has already been uncompresssed, etc.
    if os.path.exists(os.path.join(chromeos_root, "chroot/tmp", build_id,
                                   "chromiumos_test_image.bin")):
      return 0

    # Uncompress and untar the downloaded image.
    command = ("cd /tmp/%s ;unxz chromiumos_test_image.tar.xz; "
               "tar -xvf chromiumos_test_image.tar" % build_id)
    if self.log_level != "verbose":
      self._logger.LogOutput("CMD: %s" % command)
      print("(Uncompressing and un-tarring may take a couple of minutes..."
            "please be patient.)")
    retval = self._ce.ChrootRunCommand(chromeos_root, command)
    return retval


  def Run(self, chromeos_root, xbuddy_label):
    build_id = self._GetBuildID(chromeos_root, xbuddy_label)


    retval = 0
    image_path = self._DownloadImage(chromeos_root, build_id)
    if image_path:
      retval = self._UncompressImage(chromeos_root, build_id)
    else:
      retval = 1

    if retval == 0 and self.log_level != "quiet":
      self._logger.LogOutput("Using image from %s." % image_path)

    return retval, image_path
