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

def export_lectures(lectures, responsible, name):
	cal = icalendar.Calendar()
	cal.add('prodid', '-//Video AG//rwth.video//')
	cal.add('version', '1.0')
	for l in lectures:
		resp = []
		for r in responsible:
			if r['course_id'] == l['course_id']:
				resp.append(r['realname'])
		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: '+', '.join(resp) if resp 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

def get_responsible():
	return query('''SELECT users.*, responsible.course_id FROM responsible
			JOIN users ON users.id = responsible.user_id''')

@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 ?''', request.values.get('limit', 1000)),
			get_responsible(), 'videoag_all.ics')

@app.route('/internal/ical/user/<int:user>')
@calperm
def ical_user(user):
	username = query('SELECT name FROM users WHERE users.id = ?', user)[0]['name']
	return export_lectures(query('''SELECT lectures.*, "course" AS sep, courses.*
				FROM lectures
				JOIN courses ON courses.id = lectures.course_id
				JOIN responsible ON responsible.course_id = courses.id
				WHERE NOT norecording AND NOT external AND responsible.user_id = ?
				ORDER BY time DESC LIMIT ?''', user, request.values.get('limit', 1000)),
			get_responsible(), 'videoag_%s.ics'%username)

@app.route('/internal/ical/notuser/<int:user>')
@calperm
def ical_notuser(user):
	username = query('SELECT name FROM users WHERE users.id = ?', user)[0]['name']
	return export_lectures(query('''SELECT lectures.*, "course" AS sep, courses.*
				FROM lectures
				JOIN courses ON courses.id = lectures.course_id
				LEFT JOIN responsible ON (responsible.course_id = courses.id AND responsible.user_id = ?)
				WHERE NOT norecording AND NOT external AND responsible.user_id IS NULL
				ORDER BY time DESC LIMIT ?''', user, request.values.get('limit', 1000)),
			get_responsible(), 'videoag_not_%s.ics'%username)

@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),
			get_responsible(), 'videoag_%s.ics'%course)