from typing import List, Any, Dict

from ..menu.list_manager import ListManager
from ..menu.selection_menu import Selector, GeneralMenu
from ..menu.text_input import TextInput
from ..menu import Menu
"""
UI classes
"""

class SubvolumeList(ListManager):
	def __init__(self,prompt,list):
		self.ObjectNullAction = None # str(_('Add'))
		self.ObjectDefaultAction = str(_('Add'))
		super().__init__(prompt,list,None,self.ObjectNullAction,self.ObjectDefaultAction)

	def reformat(self, data: Any) -> List[Any]:
		def presentation(key :str, value :Dict):
			text = _(" Subvolume :{:16}").format(key)
			if isinstance(value,str):
				text += _(" mounted at {:16}").format(value)
			else:
				if value.get('mountpoint'):
					text += _(" mounted at {:16}").format(value['mountpoint'])
				else:
					text += (' ' * 28)
				if value.get('options',[]):
					text += _(" with option {}").format(', '.join(value['options']))
			return text

		return sorted(list(map(lambda x:presentation(x,data[x]),data)))

	def action_list(self):
		return super().action_list()

	def exec_action(self, data: Any):
		if self.target:
			origkey,origval = list(self.target.items())[0]
		else:
			origkey = None

		if self.action == str(_('Delete')):
			del data[origkey]
		else:
			if self.action == str(_('Add')):
				self.target = {}
				print(_('\n Fill the desired values for a new subvolume \n'))
				with SubvolumeMenu(self.target,self.action) as add_menu:
					for data in ['name','mountpoint','options']:
						add_menu.exec_option(data)
			else:
				SubvolumeMenu(self.target,self.action).run()

			data.update(self.target)


class SubvolumeMenu(GeneralMenu):
	def __init__(self,parameters,action=None):
		self.data = parameters
		self.action = action
		self.ds = {}
		self.ds['name'] = None
		self.ds['mountpoint'] = None
		self.ds['options'] = None
		if self.data:
			origkey,origval = list(self.data.items())[0]
			self.ds['name'] = origkey
			if isinstance(origval,str):
				self.ds['mountpoint'] = origval
			else:
				self.ds['mountpoint'] = self.data[origkey].get('mountpoint')
				self.ds['options'] = self.data[origkey].get('options')

		super().__init__(data_store=self.ds)

	def _setup_selection_menu_options(self):
		# [str(_('Add')),str(_('Copy')),str(_('Edit')),str(_('Delete'))]
		self._menu_options['name'] = Selector(str(_('Subvolume name ')),
			self._select_subvolume_name if not self.action or self.action in (str(_('Add')),str(_('Copy'))) else None,
			mandatory=True,
			enabled=True)
		self._menu_options['mountpoint'] = Selector(str(_('Subvolume mountpoint')),
			self._select_subvolume_mount_point if not self.action or self.action in (str(_('Add')),str(_('Edit'))) else None,
			enabled=True)
		self._menu_options['options'] = Selector(str(_('Subvolume options')),
			self._select_subvolume_options if not self.action or self.action in (str(_('Add')),str(_('Edit'))) else None,
			enabled=True)
		self._menu_options['save'] = Selector(str(_('Save')),
													exec_func=lambda n,v:True,
													enabled=True)
		self._menu_options['cancel'] = Selector(str(_('Cancel')),
													# func = lambda pre:True,
													exec_func=lambda n,v:self.fast_exit(n),
													enabled=True)
		self.cancel_action = 'cancel'
		self.save_action = 'save'
		self.bottom_list = [self.save_action,self.cancel_action]

	def fast_exit(self,accion):
		if self.option(accion).get_selection():
			for item in self.list_options():
				if self.option(item).is_mandatory():
					self.option(item).set_mandatory(False)
		return True

	def exit_callback(self):
		# we exit without moving data
		if self.option(self.cancel_action).get_selection():
			return
		if not self.ds['name']:
			return
		else:
			key = self.ds['name']
			value = {}
			if self.ds['mountpoint']:
				value['mountpoint'] = self.ds['mountpoint']
			if self.ds['options']:
				value['options'] = self.ds['options']
			self.data.update({key : value})

	def _select_subvolume_name(self,value):
		return TextInput(str(_("Subvolume name :")),value).run()

	def _select_subvolume_mount_point(self,value):
		return TextInput(str(_("Select a mount point :")),value).run()

	def _select_subvolume_options(self,value):
		# def __init__(self, title, p_options, skip=True, multi=False, default_option=None, sort=True):
		return Menu(str(_("Select the desired subvolume options ")),['nodatacow','compress'],
			skip=True,preset_values=value,multi=True).run()
