# -*- encoding: utf-8 -*-
from widgets import pyapp, widget, canvas
from system.debug import trace, warning, error
from system import eloop
import config, manager, runtime, theme

from widgets.button import ImageButton
from widgets.extend.settingswidget import ImageTextListButton, CommonTextImageButton
import videoplayerwin
import os

class AlarmPlayerWin(videoplayerwin.VideoPlayerWin):
	"""
	video alarm 을 위한 Window
	"""
	def __init__(self, app, options, uid):
		self.__super.__init__(app, options, uid)
		self._opt_item = None
		self.hide_control_lock = True
		from widgets import media
		self._repeat = media.AVWindow.REPEAT_ONE
		self.dialog = None

		self.control.make_left_btn(_('Delete'))
		x, y = self.control.center_btn.pos
		self.control.center_btn.pos = x, y+22
		self.add_callback('win-hide', self.pre_win_hide)
		self.add_callback('win-destroy', self.pre_win_destroy)

	#FIXME njh : self.hide_control_lock에 의해 제어할 때 win hide가 되었는데도 
	# self.control이 떠져 있음. 이를 방지
	def pre_win_hide(self):
		"""
		hide 시 control hide
		"""
		self.hide_control()

	def pre_win_destroy(self):
		"""
		destroy 시 dialog destroy
		"""
		self.destroy_dialog()

	def destroy_dialog(self):
		"""
		destroy dialog
		"""
		if self.dialog:
			self.dialog.close()
			self.dialog = None

	def handle_player(self, control, *args):
		"""
		control 의 event handler
		"""
		if control == 'menu_left':
			def dialog_cb(result):
				self.dialog = None
				if result == 0:
					self.send_message_to_alarm_app('cb_delete')

			from widgets.dialog import YesNoDialog
			self.dialog = YesNoDialog('confirm', _('Delete alarm?'))
			self.dialog.add_callback('dialog-result', dialog_cb)
		elif control == 'menu_right':
			self.not_close_send_message_to_alarm_app('set_volume', self.curr_vol_level)

		self.__super.handle_player(control, *args)

	def adecoder_not_supported(self):
		"""
		not supported audio codec
		"""
		self._on_not_supported()

	def vdecoder_not_supported(self):
		"""
		not supported video codec
		"""
		self._on_not_supported()

	def _on_not_supported(self):
		"""
		not supported popup
		"""
		self.error(-2, _('Not Supported'))

	def error(self, code, msg):
		"""
		show error popup
		"""
		if not msg:
			msg = _('Server response\ntime out')

		self.__super.error(code, msg)

	def on_errpop_closed(self):
		"""
		closed errop popup
		"""
		self._err_pop = None
		self.stop()

	def get_close_enable(self):
		"""
		바로가기 눌렀을때 시나리오에 따름
		"""
		return False

	def hide(self):
		"""
		hide control
		"""
		self._hide_control_timer()
		self.__super.hide()

	def _hide_control_timer(self):
		"""
		lock or unlock that hide control by timer
		"""
		if self.hide_control_lock:
			self.hide_control_lock = False
			return
		self.__super._hide_control_timer()

	def display_window(self):
		"""
		alarm 정보 display
		"""
		def cb_frequency():
			self.send_message_to_alarm_app('cb_frequency')

		def cb_type():
			self.send_message_to_alarm_app('cb_type')

		def cb_time():
			self.send_message_to_alarm_app('cb_time')

		def cb_icon():
			now_state = self.alarm_image.get_state()
			if now_state:
				setting_state = True
				self.alarm_image.set_state(0)
			else:
				setting_state = False
				self.alarm_image.set_state(1)
			manager.app.get_app_by_name('alarm').handle_message('alarmplayer-setting', 'change_enable', setting_state)

		self.set_title(self.alarm_data['Title'])

		weeklist = self.alarm_data['Freq']
		select_text_color = theme.color.focused_text
		unselect_text_color = theme.color.text
		weektext = [_('Monday')[0], _('Tuesday')[0], _('Wednesday')[0],
					_('Thursday')[0], _('Friday')[0], _('Saturday')[0], _('Sunday')[0]]
		colorlist = [unselect_text_color]*7
		for x in weeklist:
			colorlist[x] = select_text_color
		self.week_bt = ImageTextListButton(self.control, (66, 35-runtime.indicator_height), weektext, colorlist, cb_frequency, (183, 28))

		text_conf = {'align' : 'left center', 'font_size':16, 'pos':(8, 14), 'text':self.alarm_data['SubTitle'], 'color':theme.color.focused_text}
		self.type_bt = CommonTextImageButton(self.control, cb_type, text_conf, (66, 65-runtime.indicator_height), (243, 28))
		self.type_bt.text_color = theme.color.focused_text

		text_conf = {'align' : 'center center', 'font_size':14, 'pos':(28, 14), 'text':'%02d:%02d' % (self.alarm_data['Time']), 'color':theme.color.focused_text}
		self.time_bt = CommonTextImageButton(self.control, cb_time, text_conf, (252, 35-runtime.indicator_height), (57, 28))
		self.time_bt.text_color = theme.color.focused_text

		imgs = [config.img_global_dir + 'alarm/alarm_icon%s.png'%str for str in ('', '_dim', '')]
		self.alarm_image = ImageButton(self.control, imgs, cb_icon)
		self.alarm_image.pos = 28, 48-runtime.indicator_height
		if self.alarm_data['Enable']:
			self.alarm_image.set_state(0)
		else:
			self.alarm_image.set_state(1)

	def not_close_send_message_to_alarm_app(self, *args, **kwds):
		"""
		alarm application 에 이벤트 전달
		"""
		manager.app.run('alarm', 'alarmplayer-setting',
				ignore_proxy=True, pre_send_message=True, *args, **kwds)

	def send_message_to_alarm_app(self, *args, **kwds):
		"""
		alarm application 에 이벤트 전달 후 종료
		"""
		manager.app.run('alarm', 'alarmplayer-setting',
				ignore_proxy=True, pre_send_message=True, *args, **kwds)
		self.close()

	def set_items(self, items):
		"""
		item 설정
		"""
		self.__super.set_items(items)
		self.alarm_data = self.get_item()
		self.display_window()
		self.control.soft_btn.set_text('right', _('Back'))

	def new_avplayer(self):
		"""
		player 생성
		"""
		p = self.__super.new_avplayer()
		p.set_audio_group('alarm')
		return p

	def reset_volume(self):
		"""
		volume 초기화
		"""
		if self._options & videoplayerwin.OPTS_LAY_VOL:
			item = self.get_item()
			vol = item['Volume']
			self.curr_vol_level = vol
			self.control.set_vol(vol)
			self.submit_volume_level(vol)

	def submit_volume_level(self, level):
		"""
		volume 설정
		"""
		self.curr_vol_level = level
		self.__super.submit_volume_level(level)

class AlarmOutWin(videoplayerwin.VideoPlayerWin):
	"""
	video alarm 시 Window
	"""
	snooze_time = 5*60*1000
	#snooze_time = 10*1000#테스트
	increse_vol_limit_sec = 1*60

	def __init__(self, app, options, uid):
		self.__super.__init__(app, options, uid)
		self._opt_item = None
		self._avplayer.set_background(True)
		manager.timer.insert_activating_alarm(self)
		self.app.always_top = True
		self.increase_timer = None
		self.max_volume = 0
		self.snooze_timer = None
		runtime.events.connect('alarm.activated', self.new_alarm_active)
		self.add_callback('win-destroy', self.pre_win_destroy)
		self.control.make_left_btn(_('Snooze'))
		manager.system.set_amp(True)

	def adecoder_not_supported(self):
		"""
		not supported audio codec
		"""
		self._on_not_supported()

	def vdecoder_not_supported(self):
		"""
		not supported video codec
		"""
		self._on_not_supported()

	def _on_not_supported(self):
		"""
		not supproted popup
		"""
		self.error(-2, _('Not Supported'))

	def error(self, *args):
		"""
		default buzz when error
		"""
		self.app.always_top = False
		manager.timer.activate_default_buzz(self.data)
		self.stop()
		self.close()

	def handle_player(self, control, *args):
		"""
		snooze handler
		"""
		if control == 'menu_left':
			self.cb_snooze()

		self.__super.handle_player(control, *args)

	def try_change_pm_fsm(self, pm_fsm):
		"""
		screen saver 진입설정
		"""
		return False

	def pre_win_destroy(self):
		"""
		알람 종료시 이벤트 받지 않음
		"""
		self.app.always_top = False
		runtime.events.disconnect('alarm.activated', self.new_alarm_active)
		manager.timer.remove_activating_alarm(self)

	def new_alarm_active(self):
		"""
		새로운 알람이 울릴경우 기존의 것 종료
		"""
		self.close()

	def cb_snooze(self):
		"""
		snooze 처리
		"""
		self.stop()
		self.stop_increase_timer()
		self.control.soft_btn.lsb.set_disabled(True)
		self.control.force_stop()
		self.snooze_timer = eloop.Timer(self.snooze_time, self.active_alarm_by_snooze)

	def active_alarm_by_snooze(self):
		"""
		snooze 후 timer 에 의해 다시 울림
		"""
		self.stop()
		self.play()
		self.start_increase_timer()
		self.control.soft_btn.lsb.set_disabled(False)
		return False

	def start_increase_timer(self):
		"""
		시간이 지남에 따라 volume 증가
		"""
		def increase_vol():
			vol = self.get_volume()
			if vol >= self.max_volume:
				return False

			vol += 1
			self.set_volume(vol)
			return True

		if self.max_volume <= 1:
			return
		
		self.set_volume(1)
		timer_sec = self.increse_vol_limit_sec/(self.max_volume-1)
		self.increase_timer = eloop.Timer(timer_sec*1000, increase_vol)

	def stop_increase_timer(self):
		"""
		volume 이 최대값이면 timer 종료
		"""
		self.increase_timer = None

	def set_volume(self, vol):
		"""
		volume 설정
		"""
		self.submit_volume_level(vol)
		self.control.volume_ctrl.set_volume(vol)
	
	def get_volume(self):
		"""
		현재 volume 값
		"""
		grp = self._avplayer.get_audio_group()
		return manager.audio.volume.get_volume_level(grp)


	# Override
	def open(self):
		"""
		item open
		"""
		if not self.__super.open():
			return False
		return True

	def set_items(self, items):
		"""
		item 설정
		"""
		self.__super.set_items(items)
		item = self.get_item()
		self.data = item['Infos']
		self.max_volume = self.data['volume']
		self.change_title()

	def new_avplayer(self):
		"""
		player 생성
		"""
		p = self.__super.new_avplayer()
		p.set_audio_group('alarmout')
		return p

	def reset_volume(self):
		"""
		volume 초기화
		"""
		if self._options & videoplayerwin.OPTS_LAY_VOL:
			item = self.get_item()
			vol = 1
			self.curr_vol_level = vol
			self.control.set_vol(vol)
			self.submit_volume_level(vol)
			self.start_increase_timer()

	def change_title(self):
		"""
		각 상황의 title 설정
		"""
		alarm_type = self.data['type']
		txt = ''
		if alarm_type == 'Favorite Broadcasts':
			txt = self.data['type_detail']['title']
		elif alarm_type == 'My Files':
			txt = os.path.basename(self.data['type_detail'])
		elif alarm_type == 'Daily motion':
			txt = _('Daily motion')
		elif alarm_type == 'Web TV':
			txt = self.data['type_detail']['title']
		self.set_subject(txt)

