# -*- encoding: utf-8 -*-
from widgets import canvas, widget
from widgets import pyapp
from widgets import tempwin
from system import config
from system import utils
from system import eloop
import runtime
import manager
import time
import theme


class ScreenSaverContainer(widget.Widget):
	"""
	screen saver contents 관리 class
	"""
	def __init__(self, parent, width, height):
		self.__super.__init__(parent)

		self.bg = canvas.XGRect(self, size=(width, height), color=(50,50,50))
		self.bg.pos = 0, 0

		self.init_x = runtime.width / 2
		self.init_y = runtime.height / 2
		self.step_y = runtime.height / 10
		self.time_font_size = 100
		self.date_font_size = 16
		self.temp_font_size = 16

		self.first_time = time.time()
		self.direction = True
		self.amp_disabled = False
		self.idle_tag = None

		self.init_time()
		self.update_icons()
		self.timer_sec = eloop.Timer(999 , self.cb_timer_sec)
		self.timer_min = eloop.Timer(10 * 1000, self.cb_timer_min)
		self.init_func()

	def show(self):
		"""
		screen saver가 show될 때, overideing.
		(amp, led control)
		"""
		if self.idle_tag is not None:
			self.idle_tag = None

		self.idle_tag = eloop.Timer(1000 * 60 * 30, self.cb_idle)

		self.disable_amp()
		self.disable_led()

		self.__super.show()

	def init_func(self):
		"""
		screen saver가 호출될 때, callback
		"""
		if self.idle_tag is not None:
			self.idle_tag = None

		self.idle_tag = eloop.Timer(1000 * 60 * 30, self.cb_idle)

		self.disable_amp()
		self.disable_led()

	def hide(self):
		"""
		window hide 함수 overiding(led control).
		"""
		self.idle_tag = None

		#self.enable_amp()
		self.enable_led()

		self.__super.hide()

	def destroy(self):
		"""
		window hide 함수 overiding(led, amp control).
		"""
		self.idle_tag = None

		self.enable_amp()
		self.enable_led()

		self.__super.destroy()

	def init_time(self):
		"""
		screen saver layout
		"""
		#text_conf = {'align':'center center', 'color':theme.color.text, 'font_size':self.time_font_size,
		# 시간 칼라값을 임의로 최대한 밝게 변경함. 추후 GUI완결되면 조정바람.
		text_conf = {'align':'center center', 
			'color':theme.color.focused_text, 'font_size':self.time_font_size,
			'pos':(runtime.width / 2, runtime.height / 2)}
		self.time_label = canvas.XGText(self, text_conf)

		text_conf['font_size'] = self.date_font_size
		text_conf['pos'] = runtime.width / 2, runtime.height / 2 - 50
		self.date_label = canvas.XGText(self, text_conf)
		self.cb_timer_sec()

		text_conf['font_size'] = self.temp_font_size
		text_conf['pos'] = runtime.width / 2, runtime.height / 2 + 60
		self.temp_label = canvas.XGText(self, text_conf)

		self.update_temp()
		self.listen('sensor.temperature', self.update_temp, False)

	def update_temp(self, *args):
		"""
		온도 update func
		"""
		sign, temp = runtime.db['sensor.temperature']
		if sign:
			sign_op = '-'
		else:
			sign_op = ''
		temp = str(temp - 3)
		if sign and temp == '99':
			return
		if not config.target:
			sign_op = ''
			temp = '23'
		self.temp_label.text = _('Temp')+ ' %s%sºC' % (sign_op, temp)

	def update_icons(self):
		"""
		rss, email icon update func
		"""
		def rss_icon_update(*args):
			if args[0] and not self.rss_icon:
				imgs = config.img_global_dir+'slidepanel/rss_s.png'
				self.rss_icon = canvas.XGImage(self, imgs, align='left top')
				self.update_icons_pos()
			elif not args[0] and self.rss_icon:
				self.rss_icon.destroy()
				self.rss_icon = None
				self.update_icons_pos()

		def mail_icon_update(*args):
			if args[0] and not self.mail_icon:
				imgs = config.img_global_dir+'slidepanel/mail_s.png'
				self.mail_icon = canvas.XGImage(self, imgs, align='left top')
				self.update_icons_pos()
			elif not args[0] and self.mail_icon:
				self.mail_icon.destroy()
				self.mail_icon = None
				self.update_icons_pos()

		self.rss_icon = None
		self.mail_icon = None
		rss_icon_update(runtime.db['rss.current_count'])
		mail_icon_update(runtime.db['email.unread_count'])
		self.listen('rss.current_count', rss_icon_update)
		self.listen('email.unread_count', mail_icon_update)

	def update_icons_pos(self):
		"""
		rss, icon pos
		"""
		icons = (self.rss_icon, self.mail_icon)
		draw_icons = []
		icon_gap = 10
		total_width = icon_gap * -1
		for x in icons:
			if x: 
				draw_icons.append(x)
				total_width += (x.size[0] + icon_gap)
		if not draw_icons:
			return

		start_x = (runtime.width/2) - (total_width/2)
		start_y = self.time_label.pos[1] + (self.time_label.size[1]/2)
		for x in draw_icons:
			x.pos = start_x, start_y
			start_x += (x.size[0] + 10)

	def enable_amp(self):
		"""
		amp enable할 때의 func
		"""
		if manager.media.get_n_mediaobject(playing = True) > 0:
			if self.amp_disabled:
				manager.system.set_amp(True)
				self.amp_disabled = False
			return
		if self.amp_disabled:
			manager.system.set_amp(True)
		self.amp_diabled = False

	def disable_amp(self):
		"""
		amp disable할 때의 func
		"""
		if manager.media.get_n_mediaobject(playing = True) > 0:
			return
		manager.system.set_amp(False)
		self.amp_disabled = True

	def enable_led(self):
		"""
		led enable할 때의 func
		"""
		manager.system.set_led(True)

	def disable_led(self):
		"""
		led disable할 때의 func
		"""
		manager.system.set_led(False)

	def cb_idle(self):
		"""
		screen saver idle time이 지난 후의 callback
		"""
		self.disable_amp()
		return False

	def cb_timer_sec(self):
		"""
		screen saver 시간 표시 setting
		"""
		self.date_label.text = utils.strftime('%d %b %Y').title()
		self.time_label.text = time.strftime('%H:%M')
		return True

	def cb_timer_min(self):
		"""
		screen saver 전체 text pos 조정
		"""
		old_y = self.time_label.pos[1]
		font_size = self.time_font_size + 40

		if self.direction :
			if old_y + font_size / 2 + self.step_y < runtime.height  + 16:
				new_y = old_y + self.step_y
			else :
				new_y = old_y - self.step_y
				self.direction = False
		else :
			if old_y + font_size / 2 - self.step_y > font_size :
				new_y = old_y - self.step_y
			else :
				new_y = old_y + self.step_y
				self.direction = True
	
		self.time_label.pos = self.init_x, new_y
		self.date_label.pos = self.init_x, new_y - 50
		self.temp_label.pos = self.init_x, new_y + 60
		self.update_icons_pos()

		return True


class ScreenSaverOverlayWidget(tempwin.Overlay):
	"""
	screen saver overlay 관리 class
	"""
	width = runtime.width
	height = runtime.height
	enable_focus = False
	canvas_layer = config.screensaver_layer

	def __init__(self, parent):
		self.__super.__init__(parent)

		self.set_ev_area(0, 0, self.width, self.height)

	def make_content(self):
		"""
		ScreenSaverContainer class를 이용하여 layout 구성
		"""
		if runtime.db['settings.screensaveroff']:
			manager.system.set_lcd(False)
			return
		self.container = ScreenSaverContainer(self, self.width, self.height)

	def calc_pos(self):
		"""
		overlay pos return
		"""
		return 0, 0

	def handle_mouse_down(self, ev):
		pass

	def handle_mouse_move(self, ev):
		pass

	def handle_mouse_up(self, ev):
		"""
		mouse up event handler
		"""
		self.hide()
		self.run_callback('screensaver-mouse-up')


class ScreenSaverWindow(pyapp.Window):
	"""
	screen saver window class
	"""
	width = runtime.width
	height = runtime.height

	def __init__(self, app):
		self.__super.__init__(app)
		self.set_screen_type('fullscreen', False)

		self.bg = canvas.XGRect(self, size=(self.width, self.height), color=(50,50,50))
		self.bg.pos = 0, 0

		self.screensaver = ScreenSaverOverlayWidget(self)

		self.screensaver.add_callback('screensaver-mouse-up', self.screensaver_mouse_up)

	def screensaver_mouse_up(self):
		"""
		screen saver 상태에서 touch가 눌렸을 때 callback
		"""
		self.close()

		if runtime.db['settings.screensaveroff']:
			manager.system.set_lcd(True)


