"""

 http://www.graphviz.org/doc/info/attrs.html

   

"""

from sys import stderr
import re

from objectmodel import ObjectModel, Class, Property
import qname
import langio

class Error(RuntimeError):
   pass

class Generator (langio.ModelGenerator):
    """
 
    >>> import loader
    >>> m = loader.load('test-data/poscond2.asn')
    
    >>> import graphviz
    >>> g = graphviz.Generator(model=m)

    >>> g.run()

    """

    def __init__(self, **kwargs):
       super(Generator, self).__init__(**kwargs)

    def qname(self, obj) :
       return self.map.qname(getattr(obj, "name", obj))


    def qqname(self, obj) :
       return '"'+self.qname(obj)+'"'

    def run(self):
       counts = self.model.namespaces_with_count(self.map)
       self.default_short = counts[-1][1]
       self.map.bind('', self.map.getLong(self.default_short))

       self.out("digraph {\n")
       self.out('    fontname = "Bitstream Vera Sans"\n')
       self.out('    rankdir = BT\n')
       self.out('\n')
       self.out('node [ style=filled, shape=rectangle, fillcolor=bisque, fontname = "Bitstream Vera Sans" ]')
       self.out('\n')
       
       for c in self.model.classes:
          for sub in self.model.subclassesForClass(c):
             self.out('    '+self.qqname(sub)+" -> "+self.qqname(c))
             self.out('    [ arrowhead="empty" ]\n')

       for prop in self.model.properties:
          if prop.list or prop.multi:
             suffix = "*"
          else:
             suffix = ""
          self.out('    '+self.qqname(prop.to)+" -> "+self.qqname(prop.domain))
          self.out('    [ arrowhead = "diamond" ')
          self.out('      taillabel = "%s%s" ]\n' %
                   (suffix, self.qname(prop)))
             

       self.out("\n}\n")


    def outPropertyInner(self, prop):
       name = self.qname(prop.name)

       self.out("element", name, "{")
       self.out(self.qname(prop.to) + suffix)
       self.out("}\n")
       
    def outProperty(self, prop):

       name = self.qname(prop.name)

       self.out(name, "= ")
       self.outPropertyInner(prop)

       

      
if __name__ == "__main__":
    import doctest, sys
    doctest.testmod(sys.modules[__name__])
