#!/usr/bin/env python3
#
# Copyright (C) 2016 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may not
# use this file except in compliance with the License. You may obtain a copy of
# the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under
# the License.
"""
Script for initializing a cmd line tool for PTS and other purposes.
Required custom config parameters:
'target_mac_address': '00:00:00:00:00:00'

Optional config parameters:
'sim_conf_file' : '/path_to_config/'
"""
from acts_contrib.test_utils.bt.BluetoothBaseTest import BluetoothBaseTest
from cmd_input import CmdInput
from queue import Empty

import os
import uuid

from acts_contrib.test_utils.tel.tel_test_utils import setup_droid_properties


class BtCmdLineTest(BluetoothBaseTest):
    target_mac_address = ""

    def setup_class(self):
        super().setup_class()
        if not "target_mac_address" in self.user_params.keys():
            self.log.warning("Missing user config \"target_mac_address\"!")
            self.target_mac_address = ""
        else:
            self.target_mac_address = self.user_params[
                "target_mac_address"].upper()

        self.android_devices[0].droid.bluetoothSetLocalName("CMD LINE Test")
        if len(self.android_devices) > 1:
            #Setup for more complex testcases
            if not "sim_conf_file" in self.user_params.keys():
                self.log.error(
                    "Missing mandatory user config \"sim_conf_file\"!")
                return False
            sim_conf_file = self.user_params["sim_conf_file"][0]
            # If the sim_conf_file is not a full path, attempt to find it
            # relative to the config file.
            if not os.path.isfile(sim_conf_file):
                sim_conf_file = os.path.join(
                    self.user_params[Config.key_config_path.value],
                    sim_conf_file)
                if not os.path.isfile(sim_conf_file):
                    log.error("Unable to load user config " + sim_conf_file +
                              " from test config file.")
                    return False
            for ad in self.android_devices:
                setup_droid_properties(self.log, ad, sim_conf_file)
            music_path_str = "music_path"
            android_music_path = "/sdcard/Music/"
            if music_path_str not in self.user_params:
                self.log.error("Need music for A2DP testcases")
                return False
            music_path = self.user_params[music_path_str]
            self._add_music_to_primary_android_device(music_path,
                                                      android_music_path)
        return True

    def _add_music_to_primary_android_device(self, music_path,
                                             android_music_path):
        music_list = []
        for dirname, dirnames, filenames in os.walk(music_path):
            for filename in filenames:
                file = os.path.join(dirname, filename)
                #TODO: Handle file paths with spaces
                self.android_devices[0].adb.push("{} {}".format(
                    file, android_music_path))

    def test_pts_cmd_line_helper(self):
        cmd_line = CmdInput()
        cmd_line.setup_vars(self.android_devices, self.target_mac_address,
                            self.log)
        cmd_line.cmdloop()
        return True
