import config, runtime, os.path, utils, mmsconfig, uiconfig
from utils import get_file_size
from basemodel import ListStage, Stage, T9AddWordStage, SymbolSelectionStage, NotifyStage, YesNoStage
from baseui import EntryUI
from mmsutils import MMS_Unicode_len

class TemplateYesNo(YesNoStage):
	def __init__(self, message, yes_cb, no_cb, title='', icon=uiconfig.baloon_message_template_icon):
		YesNoStage.__init__(self, message, yes_cb, no_cb, title, icon)

class TemplateMessageNotify(NotifyStage):
	def __init__(self, msg, cb=None):
		NotifyStage.__init__(self, msg, uiconfig.baloon_message_template_icon, cb)

class Template:
	def __init__(self):
		self._list = []
		self._list_d = []
		self.cindex = -1

	def reload(self):
		from setting import setting
		if setting.lang == 'English':
			path = config.templatelist_path_english
		else:
			path = config.templatelist_path_spain

		if not os.path.exists(path):
			return

		self._list = []
		self._list_d = []

		for info in file(path):
			# RHC / [20060921_1]
			#info = info.strip()
			info = info[:-1]
			# RHC / [20060921_1]--
			if not info:
				continue
			# KA: [20070928] hangul
			# info = unicode(info, 'euc-kr').encode('utf-8')
			info = unicode(info, 'utf-8').encode('utf-8')
			# KA: [20070928] hangul --
			self._list.append(info)
			if MMS_Unicode_len(info) > mmsconfig.mms_text_listdisplay_max[0]:
				self._list_d.append(info[:mmsconfig.mms_text_listdisplay_max[1]]+'...')
			else:
				self._list_d.append(info)

	def save(self):
		from setting import setting
		if setting.lang == 'English':
			path = config.templatelist_path_english
		else:
			path = config.templatelist_path_spain

		ft=open(path, 'w')
		for info in self._list:
			ft.write(info+'\n')
		ft.close()

	def change(self, index, text):
		self._list[index] = text
		if len(text) >= 16:
			self._list_d.append(text+'...')
		else:
			self._list_d.append(text)
		self.save()

	def remove(self, index):
		self._list.pop(index)
		self.save()

	def removeall(self):
		self._list = []
		self._list_d = []
		self.save()

	def add(self, text):
		self._list.append(text)
		self.save()

def TemplateStage(edit=None):
	tlmgr = Template()
	tlmgr.reload()
	if edit:
		if not tlmgr._list_d:
			stage = TemplateMessageNotify(_('No template'))
		else:
			stage = _TemplateStage(tlmgr, edit)
	else:
		if not tlmgr._list_d:
			stage = TemplateEmptyStage(tlmgr, edit)
		else:
			stage = _TemplateStage(tlmgr, edit)
	return stage

class TemplateEmptyStage(Stage):
	name = 'tlempty'
	def __init__(self, tlmgr, edit=None):
		self.tlmgr = tlmgr
		self.edit = edit
		if self.edit:
			_title = _('INSERT TEMPLATE')
		else:
			_title = _('TEMPLATE')
		from baseui import BaloonMessageUI
		icon = uiconfig.baloon_message_template_icon
		self.ui = BaloonMessageUI(_('ADD'), _('BACK'),_title, icon, _('Template empty'))

	def handle_key(self, key):
		if key == config.Menu1:
			self.tlmgr.cindex = 0
			runtime.manager.stack_stage(TemplateEdit(self.tlmgr))
		elif key == config.Menu2:
			runtime.manager.back_stage()
		else:
			return False
		return True

class _TemplateStage(ListStage):
	name = 'tlstage'
	icon = uiconfig.message_template_icon
	def __init__(self, tlmgr, edit=None):
		self.tlmgr = tlmgr
		self.edit = edit
		if self.edit:
			_title = _('INSERT TEMPLATE')
		else:
			_title = _('TEMPLATE')
		ListStage.__init__(self, choice=('',), title=_title)

	def show(self):
		self.tlmgr.reload()
		if self.tlmgr._list_d:
			self.change_choice(tuple(self.tlmgr._list_d))
			if self.edit:
				self.ui.set_left(_('OK'))
			else:
				self.ui.set_left(_('OPTIONS'))
			ListStage.show(self)

		else:
			self.change_choice(('',))
			self.ui.set_left(_('ADD'))
			ListStage.show(self)
			Empty_Show()

	def activate(self, index):
		if self.edit:
			self.edit.insert_template(self.tlmgr._list[index])
		else:
			self.tlmgr.cindex = index
			if self.tlmgr._list_d:
				runtime.manager.stack_stage(TemplateOptionStage(self.tlmgr))
			else:
				runtime.manager.stack_stage(TemplateEdit(self.tlmgr))

class TemplateOptionStage(ListStage):
	title = _('OPTIONS')
	choice = (_('Add new'), _('Edit'), _('Delete'), _('Delete all'))
	icon = uiconfig.message_template_icon
	def __init__(self, mgr):
		self.tlmgr = mgr
		ListStage.__init__(self)

	def activate(self, index):
		if index == 0:
			if len(self.tlmgr._list) >= 20:
				runtime.manager.stack_stage(TemplateMessageNotify(_('Template is full')))
			else:
				runtime.manager.stack_stage(TemplateEdit(self.tlmgr))
		elif index == 1:
			runtime.manager.stack_stage(TemplateEdit(self.tlmgr, isadd=False))
		elif index == 2:
			if len(self.tlmgr._list) <= 0:
				runtime.manager.stack_stage(TemplateMessageNotify(_('No template')))
			else:
				runtime.manager.stack_stage(TemplateYesNo(_('Delete template?'), self.d_yes_cb, self.d_no_cb))
		elif index == 3:
			if len(self.tlmgr._list) <= 0:
				runtime.manager.stack_stage(TemplateMessageNotify(_('No template')))
			else:
				runtime.manager.stack_stage(TemplateYesNo(_('Delete all template?'), self.a_yes_cb, self.a_no_cb))

	def d_yes_cb(self):
		isempty = False
		if len(self.tlmgr._list_d) == 1:
			isempty = True
		self.tlmgr.remove(self.tlmgr.cindex)
		if isempty:
			runtime.manager.back_stage('tlstage', isshow=False)
			runtime.manager.back_stage()
		else:
			runtime.manager.back_stage('tlstage')

	def d_no_cb(self):
		runtime.manager.back_stage()

	def a_yes_cb(self):
		self.tlmgr.removeall()
		runtime.manager.back_stage('tlstage', isshow=False)
		runtime.manager.back_stage()

	def a_no_cb(self):
		runtime.manager.back_stage()

class TemplateEdit(Stage):
	def __init__(self, mgr, isadd=True):
		self.tlmgr = mgr
		self.isadd = isadd
		# RHC / [20060921_1]
		self.addSuccess = False
		# RHC / [20060921_1]--
		if self.isadd:
			_title = _('ADD NEW')
		else:
			_title = _('EDIT')

		self.ui = EntryUI(_('OK'), _('BACK'), _title, _('Insert text'))
		self.ui.set_automata(*utils.get_def_automata())			#ÀÔ·Â ¹æ½Ä ¼³Á¤
		self.automata_idx = utils.get_def_automata_idx()			#ÀÔ·Â ¹æ½Ä index
		self.ui.set_max(255)
		if not self.isadd:
			self.ui.set_text(self.tlmgr._list[self.tlmgr.cindex])

	def show(self):
		Stage.show(self)
		if self.isadd and len(self.ui.get_text()) <= 0:
			self.ui.set_left('')

	def activate_menu1(self):
		text = self.ui.get_text()
		if self.isadd:
			if text:
				def cb():
					fstage = runtime.manager.find_stage('tlstage')
					if fstage:
						runtime.manager.back_stage('tlstage')
					else:
						fstage = runtime.manager.find_stage('tlempty')
						if fstage:
							runtime.manager.back_stage('tlempty')
							# RHC / [20060921_1]
							if self.addSuccess:
								runtime.manager.change_stage(_TemplateStage(self.tlmgr))
							else:
								runtime.manager.change_stage(TemplateEmptyStage(self.tlmgr))
							# RHC / [20060921_1]--
						else:
							runtime.manager.back_stage(name='', isshow=False)
							runtime.manager.change_stage(_TemplateStage(self.tlmgr))
				# RHC / [20060921_1]
				trimedText = text.strip()
				if len(trimedText) == 0:
					runtime.manager.change_stage(TemplateMessageNotify(_('Blank line not allowed'), cb))
				else:
					self.tlmgr.add(text)
					self.addSuccess = True
					runtime.manager.change_stage(TemplateMessageNotify(_('Template is added'), cb))
				# RHC / [20060921_1]--
			else:
				if self.isadd:
					return
				else:
					runtime.manager.back_stage()
		else:
			if text:
				# RHC / [20060921_1]
				trimedText = text.strip()
				if len(trimedText) == 0:
					runtime.manager.change_stage(TemplateMessageNotify(_('Blank line not allowed')))
				else:
					self.tlmgr.change(self.tlmgr.cindex, text)
					runtime.manager.change_stage(TemplateMessageNotify(_('Template is edited')))
				# RHC / [20060921_1]--
			else:
				runtime.manager.back_stage()

	def insert_symbol(self, s):
		before_text = self.ui.get_text()
		self.ui.insert_text(s)
		after_text = self.ui.get_text()
		if before_text == after_text:
			runtime.manager.change_stage(NotifyStage(_('Max length exceeded'), uiconfig.baloon_message_icon))
		else:
			runtime.manager.back_stage()

	def t9_add_word(self, word):
		self.ui.edit.t9_add_word(word)

	def handle_key(self, key):
		if key == config.Menu1:	#options Menu(left key)
			if self.ui.is_t9_add_word_mode():
				runtime.manager.stack_stage(T9AddWordStage(self))
				return True

			self.ui.reset_automata()
			self.activate_menu1()
		elif key == config.Menu2:
			if self.ui.handle_key(key):
				if self.isadd and len(self.ui.get_text()) <= 0:
					self.ui.set_left('')
				else:
					self.ui.set_left(_('OK'))
				return True
			runtime.manager.back_stage()
		# KA: [20070928] hangul editing
			'''
		elif key == '#':
			if self.ui.is_t9_add_word_mode():
				return True

			self.automata_idx = utils.get_automata_idx(*self.ui.automata)
			self.automata_idx += 1
			if self.automata_idx >= len(config.automata_list):
				self.automata_idx = 0
			name, casemode = config.automata_list[self.automata_idx]
			self.ui.set_automata(name, casemode)
		elif key == '*' and not self.ui.is_t9_editing_mode():
			self.ui.reset_automata()
			runtime.manager.stack_stage(SymbolSelectionStage(self, isentry=True))
			return True
			'''
		# KA: [20070928] hangul editing--	
		else:
			ret = self.ui.handle_key(key)
			try:
				if self.isadd and len(self.ui.get_text()) <= 0:
					self.ui.set_left('')
				else:
					self.ui.set_left(_('OK'))
			except:
				pass
			return ret
		return True



