from server import *
import icalendar
from werkzeug.datastructures import Headers
from datetime import timedelta, datetime

def export_lectures(lectures, name):
	cal = icalendar.Calendar()
	cal.add('prodid', '-//Video AG//rwth.video//')
	cal.add('version', '1.0')
	for l in lectures:
		event = icalendar.Event()
		event.add('summary', l['course']['short']+': '+l['title'])
		event.add('description', '\n\n'.join([s for s in [
					l['comment'],
					l['internal'],
					'Zuständig: '+l['course']['responsible'] if l['course']['responsible'] else ''
			] if s]))
		event.add('uid', '%i@rwth.video'%l['id'])
		event.add('dtstamp', datetime.utcnow())
		event.add('categories', l['course']['short'])
		event.add('dtstart', l['time'])
		event.add('location', l['place'])
		event.add('dtend', l['time'] + timedelta(minutes=l['duration']))
		cal.add_component(event)
	h = Headers()
	h.add_header("Content-Disposition", "inline", filename=name)
	return Response(cal.to_ical(), mimetype="text/calendar", headers=h)

def calperm(func):
	@wraps(func)
	def decorator(*args, **kwargs):
		permission = ismod()
		if 'X-Real-IP' in request.headers:
			ip = ip_address(request.headers['X-Real-IP'])
			for net in config['FSMPI_IP_RANGES']:
				if ip in ip_network(net):
					permission = True
		if request.authorization:
			userinfo, groups = ldapauth(request.authorization.username, request.authorization.password)
			if check_mod(userinfo.get('uid'), groups):
				permission = True
		if permission:
			return func(*args, **kwargs)
		else:
			return Response("Login required", 401, {'WWW-Authenticate': 'Basic realm="FS-Login required"'})
	return decorator

@app.route('/internal/ical/all')
@calperm
def ical_all():
	return export_lectures(query('''SELECT lectures.*, "course" AS sep, courses.*
				FROM lectures JOIN courses ON courses.id = lectures.course_id
				WHERE NOT norecording AND NOT external ORDER BY time DESC LIMIT 1000'''),'videoag_all.ics')

@app.route('/internal/ical/course/<course>')
@calperm
def ical_course(course):
	return export_lectures(query('''SELECT lectures.*, "course" AS sep, courses.*
				FROM lectures JOIN courses ON courses.id = lectures.course_id
				WHERE courses.handle = ? AND NOT norecording AND NOT external ORDER BY time DESC''', course),'videoag_course_'+course+'.ics')