from bootstrapvz.base import Task
from .. import phases
from ..exceptions import TaskError


class CheckExternalCommands(Task):
	description = 'Checking availability of external commands'
	phase = phases.preparation

	@classmethod
	def run(cls, info):
		from ..tools import log_check_call
		from subprocess import CalledProcessError
		import re
		missing_packages = []
		for command, package in info.host_dependencies.items():
			try:
				log_check_call(['type ' + command], shell=True)
			except CalledProcessError:
				if re.match('^https?:\/\/', package):
					msg = ('The command `{command}\' is not available, '
					       'you can download the software at `{package}\'.'
					       .format(command=command, package=package))
				else:
					msg = ('The command `{command}\' is not available, '
					       'it is located in the package `{package}\'.'
					       .format(command=command, package=package))
				missing_packages.append(msg)
		if len(missing_packages) > 0:
			msg = '\n'.join(missing_packages)
			raise TaskError(msg)
