import random
from xml.dom.minidom import Document,Node
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *

class Diagram:
    """
    Information for a diagram view of a L{psychsim.world.World}
    """
    def __init__(self,args=None):
        self.x = {}
        self.y = {}
        self.color = {}
        if isinstance(args,Node):
            self.parse(args)

    def getX(self,key):
        try:
            return self.x[key]
        except KeyError:
            return None

    def getY(self,key):
        try:
            return self.y[key]
        except KeyError:
            return None
    
    def getColor(self,key):
        """
        @warning: if no color exists, assigns a random color
        """
        if not key in self.color:
            self.color[key] = QColor(random.choice(QColor.colorNames()))
        return self.color[key]

    def setColor(self,key,value):
        if not isinstance(value,QColor):
            value = QColor(value)
        self.color[key] = value

    def clear(self):
        self.x.clear()
        self.y.clear()
        
    def __xml__(self):
        doc = Document()
        root = doc.createElement('diagram')
        for key,value in self.x.items():
            node = doc.createElement('x')
            node.setAttribute('key',key)
            node.appendChild(doc.createTextNode(str(value)))
            root.appendChild(node)
        for key,value in self.y.items():
            node = doc.createElement('y')
            node.setAttribute('key',key)
            node.appendChild(doc.createTextNode(str(value)))
            root.appendChild(node)
        for key,value in self.color.items():
            node = doc.createElement('color')
            if key:
                node.setAttribute('key',key)
            node.appendChild(doc.createTextNode(str(value.name())))
            root.appendChild(node)
        doc.appendChild(root)
        return doc

    def parse(self,root):
        assert root.tagName == 'diagram'
        node = root.firstChild
        while node:
            if node.nodeType == node.ELEMENT_NODE:
                key = str(node.getAttribute('key'))
                if not key:
                    key = None
                if node.tagName == 'x':
                    self.x[key] = float(node.firstChild.data)
                elif node.tagName == 'y':
                    self.y[key] = float(node.firstChild.data)
                elif node.tagName == 'color':
                    self.setColor(key,str(node.firstChild.data).strip())
                else:
                    raise NameError('Unknown element %s when parsing %s' % \
                        (node.tagName,self.__class__.__name__))
            node = node.nextSibling