from django import forms
from django.forms import ModelForm
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))

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['screening_number']):
                self.add_error('nd_number', "ND number already in use")


class SubjectAddForm(ModelForm):
    date_born = forms.DateField(label='Date of birth',
        required = False,
        widget=forms.SelectDateWidget(years=YEAR_CHOICES)
    )

    class Meta:
        model = Subject
        fields = '__all__'

    def clean(self):
        subject = self.cleaned_data

        subjects_from_db = Subject.objects.filter(screening_number=subject['screening_number'])

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

        validate_subject_nd_number(self)

    def get_new_screening_number(self):
        result = 1;
        numbers = Subject.objects.values_list('screening_number')
        for number_row in numbers:
            try:
                id = int(number_row[0])
                result = max(result, id+1)
            except:
                pass
        return result


    def clean_screening_number(self):
        if self.cleaned_data['screening_number']=="":
            self.cleaned_data['screening_number'] = self.get_new_screening_number()

        return self.cleaned_data['screening_number'];

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


class SubjectEditForm(ModelForm):
    date_born = forms.DateField(label='Date of birth',
        required = False,
        widget=forms.SelectDateWidget(years=YEAR_CHOICES)
    )

    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__'


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

    datetime_when = forms.DateTimeField(label='Appointment on (YYYY-MM-DD HH:MM:SS)')

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

    datetime_when = forms.DateTimeField(label='Appointment on (YYYY-MM-DD HH:MM:SS)')

class VisitDetailForm(ModelForm):
    datetime_begin = forms.DateField(label="Visit begins on",
        widget=forms.SelectDateWidget(years=FUTURE_YEAR_CHOICES)
    )
    datetime_end = forms.DateField(label="Visit ends on",
        widget=forms.SelectDateWidget(years=FUTURE_YEAR_CHOICES)
    )

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

class VisitAddForm(ModelForm):
    datetime_begin = forms.DateField(label="Visit begins on",
        widget=forms.SelectDateWidget(years=FUTURE_YEAR_CHOICES)
    )
    datetime_end = forms.DateField(label="Visit ends on",
        widget=forms.SelectDateWidget(years=FUTURE_YEAR_CHOICES)
    )
    class Meta:
        model = Visit
        exclude = ['is_finished']