#!/usr/bin/python

import os
import pdb
import sys
import json

sys.path.append('.')

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "planetstack.settings")

from django.db.models.fields.related import ForeignKey

# defaults
app = "core"
output = "-json"

# syntax: dmdot [-json | -dot] [app_name]

# poor man's argument parser
for arg in sys.argv[1:]:
    if arg.startswith("-"):
        output = arg
    else:
        app = arg

app = app + ".models"
#models_module = imp.load_source(app, ".")
models_module = __import__(app)
for part in app.split(".")[1:]:
    if hasattr(models_module, "PlCoreBase"):
        break
    models_module = getattr(models_module,part)

PlCoreBase = getattr(models_module,"PlCoreBase")

model_classes = []
class_names = []
lower_class_names = {}
for classname in dir(models_module):
        c = getattr(models_module, classname, None)
	if type(c)==type(PlCoreBase):
		model_classes.append(c)
		class_names.append(c.__name__)
                lower_class_names[c.__name__.lower()] = c

# django doesn't use the correct case in field.name.title() for objects that
# have CamelCased class names. So, compare everything in lower case.

if (output=='-dot'):
	print "digraph plstack {";
	for c in model_classes:
		fields = c._meta.fields
		for f in fields:
			if type(f)==ForeignKey and f.name.lower() in lower_class_names:
                                linked_class = lower_class_names[f.name.lower()]
				print '\t"%s"->"%s";'%(c.__name__,linked_class.__name__)
	print "}\n";
elif (output=='-json'):
	d = {}
	for c in model_classes:
		fields = c._meta.fields
		for f in fields:
			if type(f)==ForeignKey and f.name.lower() in lower_class_names:
                                linked_class = lower_class_names[f.name.lower()]
				try:
					d[c.__name__].append(linked_class.__name__)
				except KeyError:
					d[c.__name__]=[linked_class.__name__]
	print json.dumps(d,indent=4)
	
	
