#!/usr/bin/env python3
#
#   Copyright 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.

# This is a mock third-party controller module used for unit testing ACTS.

import logging

MOBLY_CONTROLLER_CONFIG_NAME = "MagicDevice"


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


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


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


class MagicDevice(object):
    def __init__(self, config):
        self.magic = config

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

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