from pythonforandroid.recipe import Recipe
from pythonforandroid.logger import shprint
from pythonforandroid.util import current_directory
from os.path import exists, join
import sh
import glob


class LibffiRecipe(Recipe):
	name = 'libffi'
	version = 'v3.2.1'
	url = 'https://github.com/atgreen/libffi/archive/{version}.zip'

	patches = ['remove-version-info.patch']

	def get_host(self, arch):
		with current_directory(self.get_build_dir(arch.arch)):
			host = None
			with open('Makefile') as f:
				for line in f:
					if line.startswith('host = '):
						host = line.strip()[7:]
						break

			if not host or not exists(host):
				raise RuntimeError('failed to find build output! ({})'
				                   .format(host))
			
			return host

	def should_build(self, arch):
		# return not bool(glob.glob(join(self.ctx.get_libs_dir(arch.arch),
		#                                'libffi.so*')))
		return not exists(join(self.ctx.get_libs_dir(arch.arch), 'libffi.so'))
		# return not exists(join(self.ctx.get_python_install_dir(), 'lib',
		#                        'libffi.so'))

	def build_arch(self, arch):
		env = self.get_recipe_env(arch)
		with current_directory(self.get_build_dir(arch.arch)):
			if not exists('configure'):
				shprint(sh.Command('./autogen.sh'), _env=env)
			shprint(sh.Command('autoreconf'), '-vif', _env=env)
			shprint(sh.Command('./configure'), '--host=' + arch.toolchain_prefix,
			        '--prefix=' + self.ctx.get_python_install_dir(),
			        '--enable-shared', _env=env)
			shprint(sh.make, '-j5', 'libffi.la', _env=env)


			# dlname = None
			# with open(join(host, 'libffi.la')) as f:
			# 	for line in f:
			# 		if line.startswith('dlname='):
			# 			dlname = line.strip()[8:-1]
			# 			break
			# 
			# if not dlname or not exists(join(host, '.libs', dlname)):
			# 	raise RuntimeError('failed to locate shared object! ({})'
			# 	                   .format(dlname))

			# shprint(sh.sed, '-i', 's/^dlname=.*$/dlname=\'libffi.so\'/', join(host, 'libffi.la'))

			shprint(sh.cp, '-t', self.ctx.get_libs_dir(arch.arch),
			        join(self.get_host(arch), '.libs', 'libffi.so')) #,
			        # join(host, 'libffi.la'))

	def get_include_dirs(self, arch):
		return [join(self.get_build_dir(arch.arch), self.get_host(arch), 'include')]


recipe = LibffiRecipe()