# Copyright 2016 Google Inc.
# 
# 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.

# This is a second mock third-party controller module used for testing Mobly's
# handling of multiple controller modules.

import logging

MOBLY_CONTROLLER_CONFIG_NAME = "AnotherMagicDevice"


def create(configs):
  objs = []
  for c in configs:
    if isinstance(c, dict):
      c.pop("serial")
    objs.append(AnotherMagicDevice(c))
  return objs


def destroy(objs):
  print("Destroying other magic")


def get_info(objs):
  infos = []
  for obj in objs:
    infos.append(obj.who_am_i())
  return infos


class AnotherMagicDevice(object):
  """This controller supports adding controller's info during test.

  It is used for testing that this info is correctly recorded by Mobly.
  """
  def __init__(self, config):
    self.magic = config

  def get_magic(self):
    logging.info("My other magic is %s.", self.magic)
    return self.magic

  def set_magic(self, extra_magic):
    self.magic['extra_magic'] = extra_magic

  def who_am_i(self):
    return {"MyOtherMagic": self.magic}
