#!/usr/bin/env python3
#
# Copyright 2022 The Fuchsia Authors
#
# 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 antlion.

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}
