#!/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__]
	d['NetworkDeployments'].append('SliceDeployments')
	print json.dumps(d,indent=4)
	
	
