import lldb


class PythonObjectSyntheticChildProvider(object):

    def __init__(self, value, internal_dict):
        self.value = value
        self.values = self.make_children()
        self.built_values = {}
        self.bo = self.value.target.byte_order
        self.ps = self.value.target.addr_size

    def make_children(self):
        pass

    def num_children(self):
        return len(self.values)

    def get_child_index(self, name):
        i = 0
        for N, value in self.values:
            if N == name:
                return i
            i += 1
        return None

    def update(self):
        pass

    def has_children(self):
        return len(self.values) > 0

    def gen_child(self, name, value):
        data = None
        type = None
        if isinstance(value, int):
            data = lldb.SBData.CreateDataFromUInt32Array(
                self.bo, self.ps, [value])
            type = self.value.target.GetBasicType(lldb.eBasicTypeInt)
        elif isinstance(value, long):
            data = lldb.SBData.CreateDataFromUInt64Array(
                self.bo, self.ps, [value])
            type = self.value.target.GetBasicType(lldb.eBasicTypeLong)
        elif isinstance(value, float):
            data = lldb.SBData.CreateDataFromDoubleArray(
                self.bo, self.ps, [value])
            type = self.value.target.GetBasicType(lldb.eBasicTypeDouble)
        elif isinstance(value, str):
            data = lldb.SBData.CreateDataFromCString(self.bo, self.ps, value)
            type = self.value.target.GetBasicType(
                lldb.eBasicTypeChar).GetArrayType(
                len(value))
        if (data is not None) and (type is not None):
            return self.value.CreateValueFromData(name, data, type)
        return None

    def get_child_at_index(self, index):
        if index in self.built_values:
            return self.built_values[index]

        bv = None

        name, value = self.values[index]
        bv = self.gen_child(name, value)
        self.built_values[index] = bv
        return bv
