from django import forms
from django.forms import ModelForm, Form
from .models import *
from datetime import datetime

"""
Possible redundancy, but if need arises, contents of forms can be easily customized
"""

CURRENT_YEAR = datetime.now().year
YEAR_CHOICES=tuple(range(CURRENT_YEAR,CURRENT_YEAR - 120, -1))
FUTURE_YEAR_CHOICES=tuple(range(CURRENT_YEAR,CURRENT_YEAR + 5, 1))
DATEPICKER_DATE_ATTRS = {
    'class':'datepicker',
    'data-date-format':'yyyy-mm-dd',
    'data-date-orientation': 'bottom'
}
DATETIMEPICKER_DATE_ATTRS = {
    'class':'datetimepicker',
    'data-date-format':'Y-MM-DD HH:mm',
}

def validate_subject_nd_number(self):
    subject = self.cleaned_data
    if subject['nd_number']!="":
        subjects_from_db = Subject.objects.filter(nd_number=subject['nd_number'])
        if (len(subjects_from_db)>0):
            if subjects_from_db[0].screening_number!= subject.get('screening_number',''):
                self.add_error('nd_number', "ND number already in use")


class SubjectAddForm(ModelForm):
    date_born = forms.DateField(label="Date of birth",
        widget=forms.DateInput(DATEPICKER_DATE_ATTRS, "%Y-%m-%d"),
        required=False
    )

    datetime_contact_reminder = forms.DateField(label="Contact on",
        widget=forms.DateInput(DATEPICKER_DATE_ATTRS, "%Y-%m-%d"),
        required=False
    )

    class Meta:
        model = Subject
        fields = '__all__'

    def clean(self):
        subject = self.cleaned_data

        subjects_from_db = Subject.objects.filter(screening_number=subject.get('screening_number',''))

        if len(subjects_from_db)>0:
            self.add_error('screening_number', "Screening number already in use")

        validate_subject_nd_number(self)

class SubjectDetailForm(ModelForm):
    class Meta:
        model = Subject
        fields = '__all__'


class SubjectEditForm(ModelForm):

    datetime_contact_reminder = forms.DateField(label="Contact on",
        widget=forms.DateInput(DATEPICKER_DATE_ATTRS, "%Y-%m-%d"),
        required=False
    )
    date_born = forms.DateField(label="Date of birth",
        widget=forms.DateInput(DATEPICKER_DATE_ATTRS, "%Y-%m-%d"),
        required=False
    )

    def __init__(self, *args, **kwargs):
        super(SubjectEditForm, self).__init__(*args, **kwargs)
        instance = getattr(self, 'instance', None)
        if instance and instance.id:
            self.fields['screening_number'].widget.attrs['readonly'] = True

    def clean_screening_number(self):
        instance = getattr(self, 'instance', None)
        if instance and instance.id:
            return instance.screening_number
        else:
            return self.cleaned_data['screening_number']

    def clean(self):
        validate_subject_nd_number(self)

    class Meta:
        model = Subject
        fields = '__all__'


class WorkerAddForm(ModelForm):
    class Meta:
        model = Worker
        exclude = ['appointments']


class WorkerDetailForm(ModelForm):
    class Meta:
        model = Worker
        fields = '__all__'


class WorkerEditForm(ModelForm):
    class Meta:
        model = Worker
        fields = '__all__'


class AppointmentDetailForm(ModelForm):
    class Meta:
        model = Appointment
        fields = '__all__'

    datetime_when = forms.DateTimeField(label='Appointment on (YYYY-MM-DD HH:MM)',
        widget=forms.DateTimeInput(DATETIMEPICKER_DATE_ATTRS)
    )

class AppointmentEditForm(ModelForm):
    class Meta:
        model = Appointment
        fields = '__all__'

    datetime_when = forms.DateTimeField(label='Appointment on (YYYY-MM-DD HH:MM)',
        widget=forms.DateTimeInput(DATETIMEPICKER_DATE_ATTRS)
    )

class AppointmentAddForm(ModelForm):
    class Meta:
        model = Appointment
        exclude = ['status']

    datetime_when = forms.DateTimeField(label='Appointment on (YYYY-MM-DD HH:MM)',
        widget=forms.DateTimeInput(DATETIMEPICKER_DATE_ATTRS)
    )

class VisitDetailForm(ModelForm):
    datetime_begin = forms.DateField(label="Visit begins on",
        widget=forms.DateInput(DATEPICKER_DATE_ATTRS, "%Y-%m-%d")
    )
    datetime_end = forms.DateField(label="Visit ends on",
        widget=forms.DateInput(DATEPICKER_DATE_ATTRS, "%Y-%m-%d")
    )

    post_mail_sent = forms.RadioSelect()

    class Meta:
        model = Visit
        exclude = ['is_finished']

class VisitAddForm(ModelForm):
    subject = forms.ModelChoiceField(queryset=Subject.objects.order_by('last_name','first_name'))
    datetime_begin = forms.DateField(label="Visit begins on",
        widget=forms.TextInput(attrs=DATEPICKER_DATE_ATTRS)
    )
    datetime_end = forms.DateField(label="Visit ends on",
        widget=forms.TextInput(attrs=DATEPICKER_DATE_ATTRS)
    )
    class Meta:
        model = Visit
        exclude = ['is_finished']

    def clean(self):
        print self.cleaned_data['appointment_types']
        if (self.cleaned_data['datetime_begin']>=self.cleaned_data['datetime_end']):
            self.add_error('datetime_begin', "Start date must be before end date")
            self.add_error('datetime_end', "Start date must be before end date")

class KitRequestForm(Form):
    start_date = forms.DateField(label="From date",
        widget=forms.DateInput(DATEPICKER_DATE_ATTRS, "%Y-%m-%d"),
        required=False
    )

    end_date = forms.DateField(label="End date",
        widget=forms.DateInput(DATEPICKER_DATE_ATTRS, "%Y-%m-%d"),
        required=False
    )