# Lint as: python2, python3
# Copyright 2015 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.


from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import logging
import os.path
import subprocess
import tempfile

def copy_private_bucket(host, bucket, filename, destination, timeout_s=30):
    """
    Copies files/directories from a private google storage location to the DUT.
    Uses a test server box as a temp location.
    We do this because it's easier than trying to get the client DUT
    authenticated. The Test server is already authenticated, so copy to the test
    server and then send file to client.

    @param host: Autotest host machine object.
    @param bucket: path to name of gs bucket.
    @param filename: string, name of the file or dir in 'bucket' to copy.
    @param destination: path in DUT where the file should be copied to.
    @param timeout_s: int, timeout in seconds to wait for copy to finish

    """

    assert (bucket.startswith('gs://'))

    src = os.path.join(bucket, filename)

    log("SOURCE path: " + src)

    with tempfile.NamedTemporaryFile(suffix='.wpr') as tempsource:
        tempsourcepath = tempsource.name

        args = ['gsutil', 'cp', src, tempsourcepath]
        log("Copying to temporary test server destination : " + tempsourcepath)

        p = subprocess.Popen(args,
                             stdout=subprocess.PIPE,
                             stderr=subprocess.PIPE)

        output = p.communicate()

        log("STDOUT | " + output[0].decode('utf-8'))
        log("STDERR | " + output[1].decode('utf-8'))

        if p.returncode:
            raise subprocess.CalledProcessError(returncode=p.returncode,
                                                cmd=args)

        host.send_file(tempsourcepath, os.path.join(destination, filename))
        log("Sent file to DUT : " + host.hostname)


def log(message):
    """
    Wraps around logging.debug() and adds a prefix to show that messages are
    coming from this utility.

    @param message: string, the message to log.

    """
    message = "| gs wrapper | " + message
    logging.debug(message)