import confluent.messages as msg
import confluent.config.attributes as allattributes

def retrieve(nodes, element, configmanager, inputdata):
    attributes = configmanager.get_node_attributes(nodes)
    if element[-1] == 'all':
        for node in nodes:
            for attribute in sorted(allattributes.node.iterkeys()):
                if attribute in attributes[node]: #have a setting for it
                    val = attributes[node][attribute]
                elif attribute == 'groups': # no setting, provide a blank
                    val = []
                else: # no setting, provide a blank
                    val = {'value': '', 'cryptvalue': ''}
                if attribute.startswith('secret.'):
                    yield msg.CryptedAttributes(node,
                        {attribute: val})
                elif isinstance(val, list):
                    yield msg.ListAttributes(node,
                        {attribute: val})
                else:
                    yield msg.Attributes(node,
                        {attribute: val['value']})
    elif element[-1] == 'current':
        for node in attributes.iterkeys():
            for attribute in sorted(attributes[node].iterkeys()):
                currattr = attributes[node][attribute]
                if 'value' in currattr:
                    yield msg.Attributes(node,
                        {attribute: currattr['value']})
                elif 'cryptvalue' in currattr:
                    yield msg.CryptedAttributes(node,
                        {attribute: currattr['cryptvalue']})
                elif isinstance(currattr, list):
                    yield msg.ListAttributes(node,
                        {attribute: currattr})
                else:
                    print repr(currattr)
                    raise Exception("BUGGY ATTRIBUTE FOR NODE")


def update(nodes, element, configmanager, inputdata):
    updatedict = {}
    for node in nodes:
        updatenode = inputdata.get_attributes(node)
        if updatenode:
            updatedict[node] = updatenode
    configmanager.set_node_attributes(updatedict)
    return retrieve(nodes, element, configmanager, inputdata)