# coding=utf-8
import logging

from django.shortcuts import redirect, get_object_or_404

from web.forms import AvailabilityAddForm, AvailabilityEditForm, HolidayAddForm
from web.forms import WorkerForm
from web.models import Worker, Availability, Holiday
from web.models.constants import WEEKDAY_CHOICES, GLOBAL_STUDY_ID, AVAILABILITY_CHOICES
from web.models.worker import worker_type_by_worker
from web.models.worker_study_role import WORKER_STAFF
from . import wrap_response
from web.decorators import PermissionDecorator

logger = logging.getLogger(__name__)


def worker_list(request, worker_type=WORKER_STAFF):
    doctors_list = Worker.get_workers_by_worker_type(worker_type, study_id=GLOBAL_STUDY_ID, ).order_by('-last_name')
    context = {
        'doctors_list': doctors_list,
        'worker_type': worker_type
    }

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

@PermissionDecorator('add_worker')
def worker_add(request, worker_type):
    if request.method == 'POST':
        form = WorkerForm(request.POST, request.FILES, worker_type=worker_type)
        if form.is_valid():
            form.save()
            return redirect('web.views.workers', worker_type=worker_type)
    else:
        form = WorkerForm(worker_type=worker_type)

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

@PermissionDecorator('change_worker')
def worker_edit(request, worker_id):
    worker = get_object_or_404(Worker, id=worker_id)
    worker_type = worker_type_by_worker(worker)
    if request.method == 'POST':
        form = WorkerForm(request.POST, request.FILES, instance=worker, worker_type=worker_type)
        if form.is_valid():
            form.save()
            return redirect('web.views.workers', worker_type=worker_type)
    else:
        form = WorkerForm(instance=worker)
    availabilities = Availability.objects.filter(person=worker_id).order_by('day_number', 'available_from')
    holidays = Holiday.objects.filter(person=worker_id).order_by('-datetime_start')
    return wrap_response(request, 'doctors/edit.html',
                         {
                             'form': form,
                             'availabilities': availabilities,
                             'holidays': holidays,
                             'doctor_id': worker_id,
                             'weekdays': WEEKDAY_CHOICES,
                             'availability_choices': AVAILABILITY_CHOICES,
                             "worker_type": worker_type
                         })

@PermissionDecorator('delete_worker')
def worker_disable(request, doctor_id):
    the_doctor = get_object_or_404(Worker, id=doctor_id)
    the_doctor.disable()
    return worker_list(request)

@PermissionDecorator('change_worker')
def worker_availability_delete(request, availability_id):
    availability = Availability.objects.filter(id=availability_id)
    doctor_id = availability[0].person.id
    availability.delete()
    return redirect(worker_edit, worker_id=doctor_id)

@PermissionDecorator('change_worker')
def worker_availability_add(request, doctor_id):
    worker = get_object_or_404(Worker, id=doctor_id)
    if request.method == 'POST':
        form = AvailabilityAddForm(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            return redirect(worker_edit, worker_id=doctor_id)
    else:
        form = AvailabilityAddForm(initial={'person': worker})
    return wrap_response(request, 'doctors/add_availability.html',
                         {
                             'form': form,
                             'doctor_id': doctor_id,
                             'doctor_name': unicode(worker)
                         })

@PermissionDecorator('change_worker')
def worker_availability_edit(request, availability_id):
    availability = get_object_or_404(Availability, id=availability_id)
    if request.method == 'POST':
        form = AvailabilityEditForm(request.POST, request.FILES, instance=availability)
        if form.is_valid():
            form.save()
            return redirect(worker_edit, worker_id=availability.person_id)
    else:
        form = AvailabilityEditForm(instance=availability)
    return wrap_response(request, 'doctors/edit_availability.html',
                         {
                             'form': form,
                             'availability_id': availability_id,
                             'doctor_id': availability.person_id,
                         })

@PermissionDecorator('change_worker')
def worker_holiday_delete(request, holiday_id):
    holiday = Holiday.objects.filter(id=holiday_id)
    doctor_id = holiday[0].person.id
    holiday.delete()
    return redirect(worker_edit, worker_id=doctor_id)

@PermissionDecorator('change_worker')
def worker_holiday_add(request, doctor_id):
    doctors = Worker.objects.filter(id=doctor_id)
    doctor = None
    if len(doctors) > 0:
        doctor = doctors[0]
    if request.method == 'POST':
        form = HolidayAddForm(request.POST, request.FILES)

        if form.is_valid():
            form.save()
            return redirect(worker_edit, worker_id=doctor_id)
    else:
        form = HolidayAddForm(initial={'person': doctor})
        return wrap_response(request, 'doctors/add_holiday.html',
                             {
                                 'form': form,
                                 'doctor_id': doctor_id,
                                 'doctor_name': unicode(doctor)
                             })