import os, datetime, sys, shlex, fnmatch

class LogFile:
	""" A log file class """
	f = None
	printOutput = False

	def __init__( self, fileName, mode, _printOutput ):
		self.printOutput = _printOutput
		self.f = open( fileName, mode )
		
	def Close( self ):
		self.f.close()
	
	def WriteLine( self, String ):
		if ( self.printOutput ):
			print( String )
		newString = String + "\n"
		self.f.write( newString )
	
def PrintUsage():
	print( "Usage:" )
	print( sys.executable + " <visual studio project> <output file>" )

##
## Main
##

log = LogFile( "unity_build_extract.log", 'a', True )

if len( sys.argv ) < 2:
	PrintUsage();
	sys.exit( 0 )



now = datetime.datetime.now()
log.WriteLine( "Extract started at " + now.strftime( "%Y-%m-%d %H:%M:%S" ) )

projectName = sys.argv[ 1 ]
log.WriteLine( "project to open: " + projectName )

outputFileName = sys.argv[ 2 ]
log.WriteLine( "extracting to: " + outputFileName )

includeName = []

# tokenize project file
try:
	f = open( projectName, "r" )
	string = f.read()
	lexer = shlex.shlex( string )
	lexer.whitespace += '"'
	lexer.whitespace_split = True
	for token in lexer:
		if fnmatch.fnmatch( token, "*.cpp" ):
			if not fnmatch.fnmatch( token, "*UnityBuild*" ):
				includeName.append( token )
	f.close()
except IOError, e:
	log.WriteLine( "failed to open " + projectName )
	sys.exit( 0 )

fixedIncludeName = []

# fix up the path
for include in includeName:
	fixedIncludeName.append( os.path.normpath( os.path.join( "..\\", include ) ) )

try:
	f = open( outputFileName, "w" )
	for include in fixedIncludeName:
		fileName = os.path.basename( include )
		f.write( "#pragma message( \"" + fileName + " START: \" __TIMESTAMP__ )\n" )
		f.write( "#include \"" + include + "\"\n" )
		f.write( "#pragma message( \"" + fileName + " END: \" __TIMESTAMP__ )\n" )
	f.close()
except IOError, e:
	log.WriteLine( "failed to open " + outputFileName )
	sys.exit( 0 )

log.Close()
