from abstract import AbstractPartition
import os.path
from bootstrapvz.common.tools import log_check_call


class Mount(object):
	"""Represents a mount into the partition
	"""
	def __init__(self, source, destination, opts):
		"""
		:param str,AbstractPartition source: The path from where we mount or a partition
		:param str destination: The path of the mountpoint
		:param list opts: List of options to pass to the mount command
		"""
		self.source      = source
		self.destination = destination
		self.opts        = opts

	def mount(self, prefix):
		"""Performs the mount operation or forwards it to another partition

		:param str prefix: Path prefix of the mountpoint
		"""
		mount_dir = os.path.join(prefix, self.destination)
		# If the source is another partition, we tell that partition to mount itself
		if isinstance(self.source, AbstractPartition):
			self.source.mount(destination=mount_dir)
		else:
			log_check_call(['mount'] + self.opts + [self.source, mount_dir])
		self.mount_dir = mount_dir

	def unmount(self):
		"""Performs the unmount operation or asks the partition to unmount itself
		"""
		# If its a partition, it can unmount itself
		if isinstance(self.source, AbstractPartition):
			self.source.unmount()
		else:
			log_check_call(['umount', self.mount_dir])
		del self.mount_dir

	def __getstate__(self):
		state = self.__dict__.copy()
		state['__class__'] = self.__module__ + '.' + self.__class__.__name__
		return state

	def __setstate__(self, state):
		for key in state:
			self.__dict__[key] = state[key]
