import hashlib
from datetime import MINYEAR

from server import *

def gen_atomid(value):
	return 'urn:md5:'+hashlib.md5(value.encode('utf-8')).hexdigest().upper()

def fixdate(value):
	if not isinstance(value, datetime):
		return datetime(MINYEAR, 1, 1)
	return value

@app.route('/feed')
@app.route('/<handle>/feed')
@handle_errors(None, 'Diese Veranstaltung existiert nicht!', 404, IndexError)
def feed(handle=None):
	course = {'id': None, 'title': 'Neueste Videos', 'time_created': None, 'time_updated': None}
	course['atomid'] = gen_atomid('FROM videos SELECT *')
	if handle:
		course = query('SELECT * FROM courses WHERE handle = ? AND visible', handle)[0]
		course['atomid'] = gen_atomid('Video AG, courses['+str(course['id'])+']: '+course['handle'])
	course_id = course['id']
	entries = query(f'''
			SELECT lectures.*, 'video' AS sep, videos.*, formats.description AS format_description, formats.prio, \'course\' AS sep, courses.*
				FROM lectures
				JOIN courses ON (courses.id = lectures.course_id)
				JOIN videos ON (lectures.id = videos.lecture_id)
				JOIN formats ON (formats.id = videos.video_format)
				WHERE {"courses.listed" if course_id is None else "course_id = ?"} AND courses.visible AND lectures.visible AND videos.visible
				ORDER BY videos.time_created DESC, prio ASC
				LIMIT 100''',
			*([] if course_id is None else [course_id]))
	updated = max(course['time_updated'], course['time_created'], key=fixdate)
	for entry in entries:
		entry['updated'] = max(entry['video']['time_created'], entry['video']['time_updated'], entry['time_created'], entry['time_updated'], key=fixdate)
		if len(entry['video']['hash']) != 32:
			entry['atomid'] = gen_atomid('Video AG, videos['+str(entry['video']['id'])+']')
		else:
			entry['atomid'] = 'urn:md5:'+(entry['video']['hash'].upper())
		updated = max(updated, entry['updated'], key=fixdate)
	course['updated'] = updated
	return Response(render_template('feed.atom', course=course, entries=entries), 200, {'Content-Type': 'application/atom+xml'})

@app.route('/<handle>/rss')
@handle_errors(None, 'Die Veranstaltung oder das Format existiert nicht!', 404, IndexError)
def rss_feed(handle):
	course = query('SELECT * FROM courses WHERE handle = ? AND visible', handle)[0]
	formats = query('''SELECT formats.* FROM formats
			JOIN videos ON videos.video_format = formats.id
			JOIN lectures ON lectures.id = videos.lecture_id
			WHERE lectures.course_id = ?
			GROUP BY formats.id
			ORDER BY formats.player_prio DESC''', course['id'])
	if not formats:
		# info: sql no test cover
		formats = query('SELECT * FROM formats WHERE id = 4 OR id = 5 OR id = 10') # 360p, 720p, 1080p
	if 'format_id' not in request.values:
		return redirect(url_for('rss_feed', handle=handle, format_id=formats[0]['id']))
	fmt = query('SELECT * FROM formats WHERE id = ?', request.values.get('format_id', request.values['format_id']))[0]
	items = query('''SELECT lectures.*, 'video' AS sep, videos.*
			FROM lectures
			JOIN courses ON courses.id = lectures.course_id
			JOIN videos ON lectures.id = videos.lecture_id
			WHERE courses.id = ? AND videos.video_format = ? AND courses.visible AND lectures.visible AND videos.visible
			ORDER BY lectures.time DESC
			LIMIT 100''', course['id'], fmt['id'])
	chapters = query('SELECT chapters.* FROM chapters \
			JOIN lectures ON lectures.id = chapters.lecture_id \
			WHERE lectures.course_id = ? AND NOT chapters.deleted AND chapters.visible \
			ORDER BY time ASC', course['id'])
	for item in items:
		item['updated'] = max(item['video']['time_created'], item['video']['time_updated'], item['time_created'], item['time_updated'], key=fixdate)
	return Response(
			render_template('feed.rss', course=course, format=fmt, formats=formats, items=items, chapters=chapters),
			200,
			{'Content-Type': 'application/rss+xml; charset=UTF-8'})

@app.route('/courses/feed')
def courses_feed():
	courses = query('SELECT * FROM courses WHERE visible AND listed ORDER BY time_created DESC LIMIT 100')
	atomid = gen_atomid('Video AG, courses')
	updated = None
	for course in courses:
		course['updated'] = max(course['time_created'], course['time_updated'], key=fixdate)
		course['atomid'] = gen_atomid('Video AG, courses['+str(course['id'])+']: '+course['handle'])
		updated = max(updated, course['updated'], key=fixdate)
	return Response(render_template('courses_feed.atom', updated=updated, atomid=atomid, courses=courses), 200, {'Content-Type': 'application/atom+xml'})