#~ This program is free software; you can redistribute it and/or modify
#~ it under the terms of the GNU General Public License as published by
#~ the Free Software Foundation; version 2 of the License.

#~ This program is distributed in the hope that it will be useful,
#~ but WITHOUT ANY WARRANTY; without even the implied warranty of
#~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#~ GNU General Public License for more details.

# This script must run from a logic brick so it has access to the game engine api
# it assumes the root blender source directory is the current working directory
# 
# Currently it only prints missing modules and methods (not attributes)

import sys, os

BGE_API_DOC_PATH = 'source/gameengine/PyDoc'


mods = ['GameLogic', 'Rasterizer', 'GameKeys']
mods_dict = {}
for m in mods:
	mods_dict[m] = sys.modules[m]


import GameTypes
type_members = {}

for type_name in dir(GameTypes):
	if type_name.startswith('__'):
		continue
	
	type_object = getattr(GameTypes, type_name)
	
	members = []
	type_members[type_object.__name__] = members
	
	for member in type_object.__dict__.keys():
		if member.startswith('__'):
			continue
		
		# print type_object.__name__ + '.' + k
		members.append(member)



doc_dir= os.path.join(os.getcwd(), BGE_API_DOC_PATH)

if doc_dir not in sys.path:
	sys.path.append(doc_dir)


def check_attribute(class_ob, member):
	doc = class_ob.__doc__
	if not doc:
		return False
	
	for l in doc.split('\n'):
		l = l.strip()
		
		'''
			@ivar foo: blah blah
		to
			foo
			
		'''
		
		if l.startswith('@ivar') or l.startswith('@var'):
			var = l.split()[1].split(':')[0]
			
			if var == member:
				return True
	
	return False
	
	
	
	


print '\n\n\nChecking Docs'

PRINT_OK = False

pymod = sys.modules['GameTypes']
del sys.modules['GameTypes'] # temp remove
mod = __import__('GameTypes') # get the python module
reload(mod) # incase were editing it
sys.modules['GameTypes'] = pymod

for type_name in sorted(type_members.keys()):
	members = type_members[type_name]
	
	try:
		type_class = getattr(mod, type_name)
	except:
		print "missing class: %s.%s - %s" % (type_name, type_name, str(sorted(members)))
		continue
	
	for member in sorted(members):
		try:
			getattr(type_class, member)
			if PRINT_OK:
				print "\tfound: %s.%s" % (type_name, member)
		except:
			if check_attribute(type_class, member):
				if PRINT_OK:
					print "\tfound attr: %s.%s" % (type_name, member)
			else:
				print "\tmissing: %s.%s" % (type_name, member)


# Now check the modules
for mod_name, pymod in mods_dict.iteritems():
	print pymod
	del sys.modules[mod_name]
		
	# Now well get the python version
	pydoc = __import__(mod_name)
	pydoc = reload(pydoc) # avoid using the out dated pyc file only
	print pydoc.__file__
	
	for member in sorted(dir(pymod)):
		if hasattr(pydoc, member) or check_attribute(pydoc, member):
			if PRINT_OK:
				print "\tfound module attr: %s.%s" % (mod_name, member)
		else:
			print "\tmissing module attr: %s.%s" % (mod_name, member)
	
	# Restore real module
	sys.modules[mod_name] = pymod


sys.path.pop() # remove the pydoc dir from our import paths


