# coding=utf-8
from django.contrib import messages
from django.shortcuts import get_object_or_404, redirect

from . import wrap_response
from ..forms import AppointmentDetailForm, AppointmentAddForm, AppointmentEditForm, SubjectEditForm
from ..models import Appointment, Subject, MailTemplate

APPOINTMENT_LIST_GENERIC = "GENERIC"
APPOINTMENT_LIST_UNFINISHED = "UNFINISHED"
APPOINTMENT_LIST_APPROACHING = "APPROACHING"


def appointments(request):
    context = {
        'approaching_list': APPOINTMENT_LIST_APPROACHING,
        'full_list': APPOINTMENT_LIST_GENERIC
    }

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


def unfinished_appointments(request):
    context = {
        'list_type': APPOINTMENT_LIST_UNFINISHED,
    }

    return wrap_response(request, "appointments/list.html", context)


def appointment_details(request, id):
    the_appointment = get_object_or_404(Appointment, id=id)
    form = AppointmentDetailForm(instance=the_appointment)
    return wrap_response(request, 'appointments/details.html', {'form': form})


def appointment_add(request, visit_id=None):
    if request.method == 'POST':
        form = AppointmentAddForm(request.POST, request.FILES, user=request.user)
        if form.is_valid():
            form.instance.visit_id = visit_id
            form.save()
            if visit_id is None:
                return redirect('web.views.appointments')
            else:
                return redirect('web.views.visit_details', id=visit_id)
    else:
        form = AppointmentAddForm(user=request.user)

    return wrap_response(request, 'appointments/add.html',
                         {'form': form, 'visitID': visit_id, 'full_list': APPOINTMENT_LIST_GENERIC})


def appointment_edit(request, id):
    the_appointment = get_object_or_404(Appointment, id=id)
    subject_form = None

    if request.method == 'POST':
        appointment_form = AppointmentEditForm(request.POST,
                                               request.FILES,
                                               instance=the_appointment,
                                               user=request.user,
                                               prefix="appointment")

        is_valid_form = True
        if the_appointment.visit is not None:
            subject_form = SubjectEditForm(request.POST, instance=the_appointment.visit.subject, prefix="subject")
            if not subject_form.is_valid():
                is_valid_form = False

        if not appointment_form.is_valid():
            is_valid_form = False

        if is_valid_form:
            appointment_form.save()
            if subject_form is not None:
                subject_form.save()
            the_appointment = get_object_or_404(Appointment, id=id)

            if the_appointment.status == Appointment.APPOINTMENT_STATUS_FINISHED:
                subject = Subject.objects.get(id=the_appointment.visit.subject.id)
                subject.information_sent = True
                subject.save()

            messages.success(request, "Modifications saved")
            if '_continue' in request.POST:
                return redirect('web.views.appointment_edit', id=the_appointment.id)
            if (the_appointment.status != Appointment.APPOINTMENT_STATUS_SCHEDULED) and (
                        the_appointment.visit is not None):
                return redirect('web.views.visit_details', id=the_appointment.visit.id)
            else:
                return redirect('web.views.appointments')
    else:
        appointment_form = AppointmentEditForm(instance=the_appointment, user=request.user, prefix="appointment")
        if the_appointment.visit is not None:
            subject_form = SubjectEditForm(instance=the_appointment.visit.subject, prefix="subject")

    languages = []
    if the_appointment.visit is not None:
        subject = the_appointment.visit.subject
        if subject.default_written_communication_language:
            languages.append(subject.default_written_communication_language)
        languages.extend(subject.languages.all())
    return wrap_response(request, 'appointments/edit.html', {
        'form': appointment_form,
        'subject_form': subject_form,
        'id': id,
        'appointment': the_appointment,
        'mail_templates': MailTemplate.get_appointment_mail_templates(languages)
    })