#!/usr/bin/env python
# -*- coding: utf-8 -*-
import Tkinter
import ttk 
import tkMessageBox
import tkFileDialog
import os
import sys
import threading
import time
import webbrowser
from Module import youkuClass
from Module import tudouClass
from Module import sohuClass
from Module import letvClass
from Module import bilibiliClass
from Module import acfunClass
from Module import iqiyiClass
from Library import fileProcesserClass
from Library import updateClass
from Library import cfgClass

class GUI :

	def __init__ (self) :
		self.masterTitle = 'Video Downloader'
		self.fileList = []
		self.version = ''
		self.appVer = ''
		self.appUrl = ''
		self.gitUrl = ''
		self.feedUrl = ''

		self.CfgClass = cfgClass.Config()
		self.cfg = self.CfgClass.get()

	def __mainWindow (self) :
		self.master = Tkinter.Tk();

		self.master.title(self.masterTitle)
		self.master.resizable(width = 'false', height = 'false')

		self.__menu()
		self.__topBox()
		self.__autoUpdate()

	def __menu (self) :
		menubar = Tkinter.Menu(self.master)

		fileMenu = Tkinter.Menu(menubar, tearoff = 0)
		fileMenu.add_command(label = "Config", command = self.__configPanel)
		fileMenu.add_command(label = "Close", command = self.master.quit)
		menubar.add_cascade(label = "File", menu = fileMenu)

		aboutMenu = Tkinter.Menu(menubar, tearoff = 0)
		aboutMenu.add_command(label = "Info", command = self.__showInfo)
		aboutMenu.add_command(label = "Check Update", command = self.__chkUpdate)
		menubar.add_cascade(label = "About", menu = aboutMenu)

		helpMenu = Tkinter.Menu(menubar, tearoff = 0)
		helpMenu.add_command(label = "GitHub", command = lambda target = self.gitUrl : webbrowser.open_new(target))
		helpMenu.add_command(label = "Release Notes", command = lambda target = self.appUrl : webbrowser.open_new(target))
		helpMenu.add_command(label = "Send Feedback", command = lambda target = self.feedUrl : webbrowser.open_new(target))
		menubar.add_cascade(label = "Help", menu = helpMenu)

		self.master.config(menu = menubar)

	def __topBox (self) :
		self.mainTop = Tkinter.Frame(self.master, bd = 10)
		self.mainTop.grid(row = 0, column = 0, sticky = '')		

		self.urlInput = Tkinter.Entry(self.mainTop, width = 50)
		self.urlInput.grid(row = 0, column = 0)

		s = self.__selector(self.mainTop)
		s.grid(row = 0, column = 1)

		self.__searchBtn()

	def __selector (self, position) :
		self.selectorVal = Tkinter.StringVar()
		self.selectorVal.set("HD")

		videoType = ['HD', '超清', '高清']

		s = ttk.Combobox(position, width = 5, textvariable = self.selectorVal, state='readonly', values = videoType)

		return s	

	def __showResult (self) :
		self.mainFoot = Tkinter.Frame(self.master, bd = 10)
		self.mainFoot.grid(row = 1, column = 0, sticky = '')		

		self.__searchBtn(False)
		self.resultWindow = Tkinter.Text(self.mainFoot, height = 5, width = 70, highlightthickness = 0)
		self.resultWindow.grid(row = 0, sticky = '')

		threading.Thread(target = self.__getUrl).start()

		self.dlZone = Tkinter.Button(self.mainFoot, text = '下载', command = self.__download)
		self.dlZone.grid(row = 1, column = 0, sticky = 'ew')

		self.mainFoot.update()

	def __getUrl (self) :
		url = self.urlInput.get()
		result = True
		if 'youku' in url :
			getClass = youkuClass.ChaseYouku()
		elif 'sohu' in url :
			getClass = sohuClass.ChaseSohu()
		elif 'letv' in url :
			getClass = letvClass.ChaseLetv()
		elif 'tudou' in url :
			getClass = tudouClass.ChaseTudou()
			getClass.videoLink = url
			url = getClass.chaseUrl()
			getClass = youkuClass.ChaseYouku()
		elif 'bilibili' in url :
			getClass = bilibiliClass.ChaseBilibili()
		elif 'acfun' in url :
			getClass = acfunClass.ChaseAcfun()
		elif 'iqiyi' in url :
			getClass = iqiyiClass.ChaseIqiyi()
		else :
			result = False

		if result :
			result = ''
			videoType = self.selectorVal.get()

			if videoType == u'HD' :
				videoType = 's'
			elif videoType == u'超清' :
				videoType = 'h'
			elif videoType == u'高清' :
				videoType = 'n'
			else :
				videoType = 's'

			getClass.videoLink = url
			getClass.videoType = videoType
			urlList = getClass.chaseUrl()

			if urlList['stat'] == 0 :
				self.fileList = urlList['msg']
				i = 1
				for x in urlList['msg']:
					result += '第' + str(i) + '段:\n' + str(x) + '\n'
					i += 1
			else :
				result = urlList['msg']
		else :
			result = '链接地址不再分析范围内!'

		self.resultWindow.insert('end', result)

		self.__searchBtn()

	def __download (self) :
		self.FPC = fileProcesserClass.FileProcesser()
		if len(self.fileList) > 0 :
			self.dlZone.grid_forget()
			self.dlStat = Tkinter.StringVar()
			self.dlZone = Tkinter.Label(self.mainFoot, textvariable = self.dlStat, width = 30, anchor = 'center')
			self.dlZone.grid(row = 1, column = 0, sticky = 'ew')

			self.FPC.download(self.fileList, self.cfg['path'])
			self.__dlZoneUpdate()

	def __dlZoneUpdate (self) :
		self.dlStat.set(self.FPC.process)

		self.timer = self.master.after(1000, self.__dlZoneUpdate)

	def __searchBtn (self, stat = True) :
		if stat :
			self.sBtn = Tkinter.Button(self.mainTop, text = '搜索', width = 10, command = self.__showResult)
			self.sBtn.grid(row = 0, column = 2)
		else :
			self.sBtn = Tkinter.Button(self.mainTop, text = '分析中...', width = 10, command = '')
			self.sBtn.grid(row = 0, column = 2)

	def __showInfo (self) :
		self.slave = Tkinter.Tk();

		self.slave.title('Info')
		self.slave.resizable(width = 'false', height = 'false')

		info = [
			'Support: www.youku.com\nwww.tudou.com\ntv.sohu.com\nwww.letv.com\nwww.bilibili.com\nwww.acfun.tv\nwww.iqiyi.com',
			'Website: http://evilcult.github.io/Video-Downloader/',
			'Special Thanks: bunnyswe(https://github.com/bunnyswe)\nliuyug(https://github.com/liuyug)'
		]

		label = Tkinter.Label(self.slave, text="Video Downloader", font = ("Helvetica", "16", 'bold'), anchor = 'center')
		label.grid(row = 0, pady = 10)

		information = Tkinter.Text(self.slave, height = 10, width = 50, highlightthickness = 0, font = ("Helvetica", "14"))
		information.grid(row = 1, padx = 10, pady = 5)
		for n in info :
			information.insert('end', n.split(': ')[0] + '\n')
			information.insert('end', n.split(': ')[1] + '\r')

		label = Tkinter.Label(self.slave, text="Version: " + self.version, font = ("Helvetica", "12"), anchor = 'center')
		label.grid(row = 2)
		label = Tkinter.Label(self.slave, text="Author: Ray H.", font = ("Helvetica", "12"), anchor = 'center')
		label.grid(row = 3)

	def __configPanel (self) :
		self.slave = Tkinter.Toplevel();

		self.slave.title("Config")
		self.slave.resizable(width = 'false', height = 'false')

		l1 = Tkinter.Label(self.slave, text = '下载目录:')
		l1.grid(row = 0)

		self.filePath = Tkinter.StringVar()
		self.filePath.set(self.cfg['path'])
		e1 = Tkinter.Entry(self.slave, textvariable = self.filePath)
		e1.grid(row = 0, column = 1, columnspan = 3)

		b1 = Tkinter.Button(self.slave, text = '选择', command = self.__chooseCfgFolder)
		b1.grid(row = 0, column = 4, sticky = 'e')

		l2 = Tkinter.Label(self.slave, text = '检查更新:')
		l2.grid(row = 1)

		self.chkUpdateTime = Tkinter.IntVar()
		self.chkUpdateTime.set(int(self.cfg['udrate']))
		r1 = Tkinter.Radiobutton(self.slave, text="每天", variable=self.chkUpdateTime, value=1)
		r1.grid(row = 1, column = 1, sticky = 'e')
		r2 = Tkinter.Radiobutton(self.slave, text="每周", variable=self.chkUpdateTime, value=2)
		r2.grid(row = 1, column = 2, sticky = 'e')
		r3 = Tkinter.Radiobutton(self.slave, text="每月", variable=self.chkUpdateTime, value=3)
		r3.grid(row = 1, column = 3, sticky = 'e')

		b2 = Tkinter.Button(self.slave, text = '更新', command = self.__setConfig)
		b2.grid(row = 2, column = 1, sticky = 'e')

		b3 = Tkinter.Button(self.slave, text = '取消', command = self.slave.destroy)
		b3.grid(row = 2, column = 2, sticky = 'e')

	def __chooseCfgFolder (self) :
		path = tkFileDialog.askdirectory(initialdir="/",title='请选择文件夹')
		self.filePath.set(path.strip())

	def __setConfig (self):
		newCfg = {
			"path": self.filePath.get(),
			"udrate": self.chkUpdateTime.get()
		}

		result = self.CfgClass.update(newCfg)

		if result['stat'] == 1 :
			self.cfg['path'] = newCfg['path']
			self.cfg['udrate'] = newCfg['udrate']
			self.slave.destroy()
			tkMessageBox.showinfo('成功', '更新成功')
		else :
			self.__error(result['stat'])

	def __error(self,errNum):
		if errNum == 2:
			tkMessageBox.showinfo('失败', '更新失败!\n选择的下载目录不存在!')
		elif errNum == 3:
			tkMessageBox.showinfo('失败', '更新失败!\n更新频率选择错误!')
		else :
			tkMessageBox.showinfo('失败', '更新失败!\n未知错误!')

	def __chkUpdate (self) :
		Updater = updateClass.Update()

		info = Updater.check(self.appVer)

		self.slave = Tkinter.Tk();

		self.slave.title('Update')
		self.slave.resizable(width = 'false', height = 'false')

		if info['update'] == True :
			label = Tkinter.Label(self.slave, text = info['version'], font = ("Helvetica", "16", 'bold'), anchor = 'center')
			label.grid(row = 0, pady = 10)

			information = Tkinter.Text(self.slave, height = 10, width = 60, highlightthickness = 0, font = ("Helvetica", "14"))
			information.grid(row = 1, padx = 10, pady = 5)
			information.insert('end', info['msg']);

			btn = Tkinter.Button(self.slave, text = 'Download', width = 10, command = lambda target = info['dUrl'] : webbrowser.open_new(target))
			btn.grid(row = 2, pady = 10)
		else :
			label = Tkinter.Label(self.slave, text = self.version, font = ("Helvetica", "16", 'bold'), anchor = 'center')
			label.grid(row = 0, pady = 10)

			label = Tkinter.Label(self.slave, height = 3, width = 60, text = info['msg'], font = ("Helvetica", "14"), anchor = 'center')
			label.grid(row = 1, pady = 10)

		now = int(time.time())
		self.CfgClass.lastUd(now)

	def __autoUpdate (self) :
		now = int(time.time())
		if self.cfg['udrate'] == 1:
			updateTime = int(self.cfg['udtime']) + 86400
		elif self.cfg['udrate'] == 2:
			updateTime = int(self.cfg['udtime']) + 86400 * 7
		elif self.cfg['udrate'] == 3:
			updateTime = int(self.cfg['udtime']) + 86400 * 30
		else :
			updateTime = int(self.cfg['udtime']) + 86400 * 7

		if updateTime < now :
			Updater = updateClass.Update()

			info = Updater.check(self.appVer)

			self.CfgClass.lastUd(now)

			if info['update'] == True :
				self.slave = Tkinter.Tk();

				self.slave.title('Update')
				self.slave.resizable(width = 'false', height = 'false')

				label = Tkinter.Label(self.slave, text = info['version'], font = ("Helvetica", "16", 'bold'), anchor = 'center')
				label.grid(row = 0, pady = 10)

				information = Tkinter.Text(self.slave, height = 10, width = 60, highlightthickness = 0, font = ("Helvetica", "14"))
				information.grid(row = 1, padx = 10, pady = 5)
				information.insert('end', info['msg']);

				btn = Tkinter.Button(self.slave, text = 'Download', width = 10, command = lambda target = info['dUrl'] : webbrowser.open_new(target))
				btn.grid(row = 2, pady = 10)

	def run (self) :
		self.__mainWindow()
		self.master.mainloop()