#
# Copyright 2018 The Cobalt Authors. All Rights Reserved.
#
# 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.
"""XB1 implementation of Starboard launcher abstraction."""

from __future__ import print_function

from starboard.tools import abstract_launcher
from starboard.xb1.tools import uwp_launcher
from starboard.xb1.tools import xb1_launcher

_UWP_XB1_MESSAGE = '****************************************************\n' + \
                   '*                    UWP on XB1                    *\n' + \
                   '****************************************************\n'

_UWP_WIN_MESSAGE = '****************************************************\n' + \
                   '*                  UWP on Windows                  *\n' + \
                   '****************************************************\n'


# This Launcher delegates either to an xb1 launcher or to a uwp launcher.
# The xb1 launcher runs tests on the xb1 remote device.
# The uwp launcher runs tests on the local windows device.
class Launcher(abstract_launcher.AbstractLauncher):
  """Run an application on XB1."""

  def __init__(self, platform, target_name, config, device_id, **kwargs):
    super().__init__(platform, target_name, config, device_id, **kwargs)
    if not device_id:
      raise ValueError('\nMissing device_id, please specify --device_id '
                       '<XboxIP> or --device_id win_uwp (running in Windows).')
    if device_id == 'win_uwp':
      self.output_file.write('\n' + _UWP_WIN_MESSAGE)
      self.delegate = uwp_launcher.Launcher(platform, target_name, config,
                                            device_id, **kwargs)
    else:
      # Assume the address points to an xbox.
      self.output_file.write('\n' + _UWP_XB1_MESSAGE)
      # Defer loading because depot_tools does not have the required
      # python requests library installed.
      # TODO: Install requests library depot_tools and update.
      self.delegate = xb1_launcher.Launcher(platform, target_name, config,
                                            device_id, **kwargs)

  # Run() and Kill() needs to be explicitly implemented per AbstractLauncher.
  def Run(self):
    return self.delegate.Run()

  def Kill(self):
    return self.delegate.Kill()

  # All other functions are automatically delegated using this function.
  def __getattr__(self, fname):
    return getattr(self.delegate, fname)

  def GetDeviceIp(self):
    """Gets the device IP. TODO: Implement."""
    return None

  def GetDeviceOutputPath(self):
    self.delegate.GetDeviceOutputPath()
