#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
# Copyright 2020 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Script to wrap test_that script.

This script can login to the chromeos machine using the test private key.
"""


__author__ = "asharif@google.com (Ahmad Sharif)"

import argparse
import os
import sys

from cros_utils import command_executer
from cros_utils import misc


def Usage(parser, message):
    print("ERROR: %s" % message)
    parser.print_help()
    sys.exit(0)


def Main(argv):
    parser = argparse.ArgumentParser()
    parser.add_argument(
        "-c",
        "--chromeos_root",
        dest="chromeos_root",
        help="ChromeOS root checkout directory",
    )
    parser.add_argument(
        "-r", "--remote", dest="remote", help="Remote chromeos device."
    )
    options = parser.parse_args(argv)
    if options.chromeos_root is None:
        Usage(parser, "chromeos_root must be given")

    if options.remote is None:
        Usage(parser, "remote must be given")

    options.chromeos_root = os.path.expanduser(options.chromeos_root)

    command = "ls -lt /"
    ce = command_executer.GetCommandExecuter()
    ce.CrosRunCommand(
        command, chromeos_root=options.chromeos_root, machine=options.remote
    )

    version_dir_path, script_name = misc.GetRoot(sys.argv[0])
    version_dir = misc.GetRoot(version_dir_path)[1]

    # Tests to copy directories and files to the chromeos box.
    ce.CopyFiles(
        version_dir_path,
        "/tmp/" + version_dir,
        dest_machine=options.remote,
        dest_cros=True,
        chromeos_root=options.chromeos_root,
    )
    ce.CopyFiles(
        version_dir_path,
        "/tmp/" + version_dir + "1",
        dest_machine=options.remote,
        dest_cros=True,
        chromeos_root=options.chromeos_root,
    )
    ce.CopyFiles(
        sys.argv[0],
        "/tmp/" + script_name,
        recursive=False,
        dest_machine=options.remote,
        dest_cros=True,
        chromeos_root=options.chromeos_root,
    )
    ce.CopyFiles(
        sys.argv[0],
        "/tmp/" + script_name + "1",
        recursive=False,
        dest_machine=options.remote,
        dest_cros=True,
        chromeos_root=options.chromeos_root,
    )

    # Test to copy directories and files from the chromeos box.
    ce.CopyFiles(
        "/tmp/" + script_name,
        "/tmp/hello",
        recursive=False,
        src_machine=options.remote,
        src_cros=True,
        chromeos_root=options.chromeos_root,
    )
    ce.CopyFiles(
        "/tmp/" + script_name,
        "/tmp/" + script_name,
        recursive=False,
        src_machine=options.remote,
        src_cros=True,
        chromeos_root=options.chromeos_root,
    )
    board = ce.CrosLearnBoard(options.chromeos_root, options.remote)
    print(board)
    return 0


if __name__ == "__main__":
    Main(sys.argv[1:])
