from django.shortcuts import redirect, render
from django.http import HttpResponse
from django.template import loader
from django.views import generic
from .models import *
from .forms import *
from .auth import * # Own wrapper for django logging in/out
from django.forms import modelformset_factory
from django.shortcuts import render
import collections

def index(request):
	if request.user.is_authenticated():
		return redirect(assignments)
	return redirect(login)


def login(request):
	context = {
		'state' : 'initial'
	}
	if request.GET and request.GET.get('error'):
		context['state'] = request.GET.get('error')

	if request.method == "POST" and request.POST:
		state, message = do_login(request)
		if state == True:
			return redirect(assignments)
		else:
			return redirect('/login?error=' + message)

	return render(request, "login.html", context)


"""
Saturates response with information about logged user
"""
def wrap_response(request, template, params):
	person, role = Worker.get_details(request.user)

	final_params = params.copy()
	final_params.update({
		'person' : person,
		'role': role
	})

	return render(request, template, final_params)


def logout(request):
	state, message = do_logout(request)
	return redirect('/login?error=' + message)



def visits(request):
	visit_list = Visit.objects.order_by('-datetime_begin')
	context = {
		'visit_list': visit_list
	}

	return wrap_response(request, 'visits/index.html', context)


def visit_details(request, id):
	displayedVisit = Visit.objects.get(id=id)
	visFinished = displayedVisit.is_finished
	displayedSubject = displayedVisit.subject
	listOfAppointments = displayedVisit.appointment_set.all()
	vform = VisitDetailForm(instance=displayedVisit)
	sform = SubjectDetailForm(instance=displayedSubject)

	return wrap_response(request, 'visits/details.html', {'vform': vform, 'sform': sform, 'loApp': listOfAppointments, 'visFinished': visFinished})


def subjects(request):
	subjects_list = Subject.objects.order_by('-last_name')
	context = {
		'subjects_list': subjects_list
	}

	return wrap_response(request, 'subjects/index.html', context)


def subject_add(request):
	if request.method == 'POST':
		form = SubjectAddForm(request.POST, request.FILES)
		if form.is_valid():
			form.save()
			return redirect(subjects)
	else:
		form = SubjectAddForm()

	return wrap_response(request, 'subjects/add.html', {'form': form})


def subject_details(request, id):
	form = SubjectDetailForm(instance=Subject.objects.get(id=id))

	return wrap_response(request, 'subjects/details.html', {'form': form})


def subject_edit(request, id):
	if request.method == 'POST':
		form = SubjectEditForm(request.POST, request.FILES, instance=Subject.objects.get(id=id))
		if form.is_valid():
			form.save()
			return redirect(subjects)
	else:
		form = SubjectEditForm(instance=Subject.objects.get(id=id))
	return wrap_response(request, 'subjects/edit.html', {'form': form, 'id':id})


def subject_delete(request, id):
    if request.method == 'POST':
		Subject.objects.get(id=id).delete()
		return redirect(subjects)
    else:
		form = SubjectEditForm(instance=Subject.objects.get(id=id))
    return wrap_response(request, 'subjects/delete.html', {'form': form})


def subject_mark(request, id, as_what):
	who = Subject.objects.get(id=id)
	if as_what == '1':
		who.mark_as_dead()
	elif as_what == '0':
		who.mark_as_rejected()
	return redirect(subject_edit, id=id)


def doctors(request):
	doctors_list = Worker.objects.order_by('-last_name')
	context = {
		'doctors_list': doctors_list
	}

	return wrap_response(request, "doctors/index.html", context)


def doctor_add(request):
	if request.method == 'POST':
		form = WorkerAddForm(request.POST, request.FILES)
		if form.is_valid():
			form.save()
			return redirect(doctors)
	else:
		form = WorkerAddForm()

	return wrap_response(request, 'doctors/add.html', {'form': form})



def doctor_edit(request, doctor_id):
	if request.method == 'POST':
		form = WorkerEditForm(request.POST, request.FILES, instance=Worker.objects.get(id=doctor_id))
		if form.is_valid():
			form.save()
			return redirect(doctors)
	else:
		form = WorkerEditForm(instance=Worker.objects.get(id=doctor_id))
	return wrap_response(request, 'doctors/edit.html', {'form': form})


def doctor_details(request, doctor_id):
	form = WorkerDetailForm(instance=Worker.objects.get(id=doctor_id))

	return wrap_response(request, 'doctors/details.html', {'form': form})


def doctor_availability(request, doctor_id):
	avall = Avaibility.objects.filter(person=doctor_id)

	avmon = avall.filter(day_number=1)
	avtue = avall.filter(day_number=2)
	avwed = avall.filter(day_number=3)
	avthu = avall.filter(day_number=4)
	avfri = avall.filter(day_number=5)
	avsat = avall.filter(day_number=6)

	context = {
		'avmon': avmon,
		'avtue': avtue,
		'avwed': avwed,
		'avthu': avthu,
		'avfri': avfri,
		'avsat': avsat,
		'id': doctor_id
	}

	return wrap_response(request, "doctors/availability_index.html", context)


def doctor_availability_delete(request, doctor_id, availability_id):
	availibility = Avaibility.objects.filter(id=availability_id)
	if len(availibility) > 0:
		availibility.delete()
	return redirect(doctoravail, id=doctor_id)


def equipment_def(request):
	equipment_list = Item.objects.order_by('-name')
	context = {
		'equipment_list': equipment_list
	}

	return wrap_response(request, "eqdef/index.html", context)


def equipment_and_rooms(request):
	return wrap_response(request, "equipment_and_rooms/index.html", {})


def mail_templates(request):
	return wrap_response(request, "mail_templates/index.html", {})

def assignments(request):
	planning_list = Appointment.objects.none()
	approaching_list = Appointment.objects.filter(datetime_when__gt = datetime.datetime.now())

	context = {
		'planning_list': planning_list,
		'approaching_list': approaching_list
	}

	return wrap_response(request, "assignments/index.html",context)

def assignment_details(request, id):
	form = AppointmentDetailForm(instance=Appointment.objects.get(id=id))
	return wrap_response(request, 'assignments/details.html', {'form': form})