import os.path
import sys
import json
sys.path.append('/usr/share/sonic/platform/plugins')
import pddfparse


class ThermalUtil:
    def __init__(self):
        global pddf_obj
        global plugin_data
        with open(os.path.join(os.path.dirname(os.path.realpath(__file__)) + '/../pddf/pd-plugin.json')) as pd:
            plugin_data = json.load(pd)

        pddf_obj = pddfparse.PddfParse()
        self.platform = pddf_obj.get_platform()
        self.num_thermals = self.platform['num_temps']
        self.info = []

    def get_num_thermals(self):
        return (self.num_thermals)

    def get_thermal_info(self):
        list = []
        pddf_obj.get_device_list(list, "TEMP_SENSOR")
        list.sort()
        for dev in list:
            data = {}
            device_name = dev['dev_info']['device_name']
            topo_info = dev['i2c']['topo_info']
            label = "%s-i2c-%d-%x" % (topo_info['dev_type'],
                                      int(topo_info['parent_bus'], 0), int(topo_info['dev_addr'], 0))
            attr_list = dev['i2c']['attr_list']
            data['device_name'] = device_name
            data['label'] = label
            for attr in attr_list:
                attr_name = attr['attr_name']
                node = pddf_obj.get_path(device_name, attr_name)
                if node is None:
                    return False
                try:
                    with open(node, 'r') as f:
                        attr_value = int(f.read())
                except IOError:
                    return False
                data[attr_name] = attr_value/float(1000)
            self.info.append(data)

    def show_thermal_temp_values(self, idx):
        if idx < 1 or idx > self.num_thermals:
            print("Invalid temperature sensor idx %d" % idx)
            return None
        self.get_thermal_info()
        thermal_name = "TEMP"+"%d" % idx
        label = ""
        value = ""
        for temp in self.info:
            if thermal_name == temp['device_name']:
                label = temp['label']
                value = "temp1\t %+.1f C (high = %+.1f C, hyst = %+.1f C)" % (
                    temp['temp1_input'], temp['temp1_max'], temp['temp1_max_hyst'])
            else:
                continue

        return (label, value)

    def show_temp_values(self):
        self.get_thermal_info()
        for temp in self.info:
            print(temp['label'])
            print("temp1\t %+.1f C (high = %+.1f C, hyst = %+.1f C)" %
                  (temp['temp1_input'], temp['temp1_max'], temp['temp1_max_hyst']))

    def dump_sysfs(self):
        return pddf_obj.cli_dump_dsysfs('temp-sensors')