Import('env')
Import('compile_targets')

from os.path import dirname, basename, join, isfile
from os import walk
from glob import iglob

compile_target_files = [str(x[0]) for x in compile_targets]

def getAllFiles(root_dir, python_only=False, recursive=True):
    if recursive:
        for root, dirnames, filenames in walk(root_dir):
            for filename in filenames:
                if not python_only or filename.endswith('.py'):
                	yield join(root, filename)
                
    else:
        for filename in iglob(join(root_dir,'*')):
            if not isfile(filename):
                continue
			
            if not python_only or filename.endswith('.py'):
                yield filename
	

def installFile(file_name, build_target='install'):	
	#Don't do compile targets
	if file_name in compile_target_files:
		return
	#ignore pyc and pyo. We get them from the py build.
	if file_name.endswith('.pyc') or  file_name.endswith('.pyo'):
		return
		
	if basename(file_name).startswith('.'):
		return
	
	target = File(file_name)
	if file_name.endswith('.py'):
		compiled_name = file_name+'c'
		result = env.Command(compiled_name, file_name, CompilePython('$TARGET', '$SOURCE'))
		if GetOption("clean"):
			env.Default(result)
		Alias(build_target, env.Install(env['PREFIX']+dirname(file_name), result))
	else:
		Alias(build_target, env.Install(env['PREFIX']+dirname(file_name), target))

#Contrib
# for file_name in getAllFiles('contrib/ZSI-2.1-a1/ZSI'):
# 	installFile(file_name)
# 
# installFile('contrib/ZSI-2.1-a1/Copyright')
	
#ProPKA	
for file_name in getAllFiles('propka30/'):
	installFile(file_name)

#Whole directories
for dir_name in ('dat/', 'doc/', 'examples/', 'jmol/', 'images/', 'ZSI/', '3dmol/'):
    for file_name in getAllFiles(dir_name):
        installFile(file_name)

#Compiled Targets
for target in compile_targets:
	file_name = str(target[0])
	if file_name.endswith('.py'):
		compiled_name = file_name+'c'
		result = env.Command(compiled_name, file_name, CompilePython('$TARGET', '$SOURCE'))
		if GetOption("clean"):
			env.Default(result)
		Alias('install', env.Install(env['PREFIX']+dirname(file_name), result))
	else:
		Alias('install', env.Install(env['PREFIX']+dirname(file_name), target))

#PDB2PKA	
for file_name in getAllFiles('pdb2pka/'):
	installFile(file_name)
	
#Main Program
for dir_name in ('src/',
                 'extensions/'):
	for file_name in getAllFiles(dir_name, python_only=True):
		installFile(file_name)
		
Alias('install', env.Install(env['PREFIX'], 'pdb2pqr.py'))
Alias('install', env.Install(env['PREFIX'], 'pdb2pqr.cgi'))
Alias('install', env.InstallAs(env['PREFIX']+'/index.html', 'html/server.html'))

for file_name in ('AppService_client.py',
				  'AppService_services.py',
				  'AppService_services_types.py',
				  'AppService_types.py',
				  'AUTHORS',
				  'ChangeLog.md',
				  'COPYING',
				  'main.py',
				  'main_cgi.py',
				  'NEWS',
				  'pka.py',
				  'pdb2pqr.css',
				  'README.md'):
	installFile(file_name)
	
Alias('install', env.Command(env['PREFIX']+'tmp', None,
							[Mkdir('$TARGET'),
			 				Chmod('$TARGET', 0777)]))

#Testing stuff to test installed pdb2pqr	
for dir_name in ('tests/',
                 'scons/',
                 'site_scons/'):
	for file_name in getAllFiles(dir_name):
		installFile(file_name, build_target='install-tests')
		
Alias('install-tests', env.Install(env['PREFIX']+'scons/', 'scons/scons.py'))
Alias('install-tests', env.Install(env['PREFIX']+'site_scons/', 'site_scons/site_init.py'))

installFile('SConstruct', build_target='install-tests')

Alias('install-tests', 'install')
	
#Depends('install', DEFAULT_TARGETS)
#Requires('install', DEFAULT_TARGETS)

