import json
import logging

from dmidecode import DMIParse
from json_repair import repair_json
from evidence.mixin_parse import BuildMix
from evidence.legacy_parse_details import get_lshw_child, ParseSnapshot
from utils.constants import CHASSIS_DH


logger = logging.getLogger('django')


def get_mac(lshw):
    try:
        if type(lshw) is dict:
            hw = lshw
        else:
            hw = json.loads(lshw)
    except json.decoder.JSONDecodeError:
        hw = json.loads(repair_json(lshw))

    nets = []
    get_lshw_child(hw, nets, 'network')

    nets_sorted = sorted(nets, key=lambda x: x['businfo'])

    if nets_sorted:
        mac = nets_sorted[0]['serial']
        logger.debug("The snapshot has the following MAC: %s" , mac)
        return mac


class Build(BuildMix):
    # This parse is for get info from snapshots created with
    # workbench-script but builded for send to devicehub-teal

    def get_details(self):
        dmidecode_raw = self.json["data"]["dmidecode"]
        self.dmi = DMIParse(dmidecode_raw)

        self.manufacturer = self.dmi.manufacturer().strip()
        self.model = self.dmi.model().strip()
        self.chassis = self.get_chassis_dh()
        self.serial_number = self.dmi.serial_number()
        self.sku = self.get_sku()
        self.typ = self.chassis
        self.version = self.get_version()

    def get_chassis_dh(self):
        chassis = self.get_chassis()
        lower_type = chassis.lower()
        for k, v in CHASSIS_DH.items():
            if lower_type in v:
                return k
        return self.default

    def get_sku(self):
        return self.dmi.get("System")[0].get("SKU Number", "n/a").strip()

    def get_chassis(self):
        return self.dmi.get("Chassis")[0].get("Type", '_virtual') #

    def get_version(self):
        return self.dmi.get("System")[0].get("Verson", '_virtual')

    def _get_components(self):
        data = ParseSnapshot(self.json)
        self.components = data.components