# Copyright 2019 Lenovo Corporation
#
# 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.

import aiohmi.redfish.oem.dell.main as dell
import aiohmi.redfish.oem.generic as generic
import aiohmi.redfish.oem.lenovo.main as lenovo
import aiohmi.redfish.oem.ami.main as ami
import aiohmi.redfish.oem.megware.main as megware
import aiohmi.redfish.oem.openbmc.main as openbmc

OEMMAP = {
    'Lenovo': lenovo,
    'Dell': dell,
    'AMI': ami,
    'Ami': ami,
    'Megware': megware,
    # bmcweb spells its oem key OpenBmc on the manager and OpenBMC elsewhere
    'OpenBMC': openbmc,
    'OpenBmc': openbmc,
}


async def get_oem_handler(sysinfo, sysurl, webclient, cache, cmd, rootinfo={}):
    if rootinfo.get('Vendor', None) in OEMMAP:
        return await OEMMAP[rootinfo['Vendor']].get_handler(sysinfo, sysurl,
                                                            webclient, cache, cmd, rootinfo)
    for oem in sysinfo.get('Oem', {}):
        if oem in OEMMAP:
            return await OEMMAP[oem].get_handler(sysinfo, sysurl, webclient, cache,
                                                 cmd, rootinfo)
    for oem in sysinfo.get('Links', {}).get('OEM', []):
        if oem in OEMMAP:
            return await OEMMAP[oem].get_handler(sysinfo, sysurl, webclient, cache,
                                                 cmd, rootinfo)
    # The manager document names the vendor on implementations that do not say
    # so at the service root or on the system, so consult it before settling for
    # generic. During the early invocation the client cannot fetch it through
    # cmd yet, so ask for it directly.
    bmcinfo = {}
    if rootinfo:
        managers = rootinfo.get('Managers', {}).get('@odata.id', None)
        if managers:
            mgrcol, status = await webclient.grab_json_response_with_status(
                managers)
            if status == 200:
                for manager in mgrcol.get('Members', []):
                    mgrinfo, status = await webclient.grab_json_response_with_status(
                        manager['@odata.id'])
                    if status == 200:
                        bmcinfo = mgrinfo
                    break
    else:
        bmcinfo = await cmd.bmcinfo()
    for oem in bmcinfo.get('Oem', {}):
        if oem in OEMMAP:
            return await OEMMAP[oem].get_handler(sysinfo, sysurl, webclient, cache,
                                                 cmd, rootinfo)
    return await generic.OEMHandler.create(sysinfo, sysurl, webclient, cache, cmd._gpool, rootinfo)
