from django.forms import ModelForm
from django import forms
from models import *

from django.core.validators import validate_email
from django.core.exceptions import ValidationError

#registration forms

class RegistrationFormMemberType(ModelForm):

    def __init__(self,*args,**kwargs):
        super(RegistrationFormMemberType,self).__init__(*args,**kwargs)
        self.fields['member_type'].queryset = MemberType.objects.filter(apply_online=True)
        self.fields['member_type'].required = True

    class Meta:
        model = Member
        fields = ('member_type',)

class RegistrationFormUser(ModelForm):

    def __init__(self,*args,**kwargs):
        super(RegistrationFormUser,self).__init__(*args,**kwargs)
        self.fields['email'].label = 'Email Address'
        self.fields['email'].help_text = ''
        self.fields['email'].required = True

    class Meta:
        model = User
        fields = ('email',)

    def clean_email(self):
        email = self.cleaned_data.get('email')
        if email:
            try:
                member = Member.objects.get(user__email=email,complete=False,approved=False,user_type='member')
                member.user.delete()
            except:
                pass

            users = User.objects.filter(email=email).exclude(email=self.instance.email)
            if users:
                raise forms.ValidationError(u'Sorry A User with this Email Address already exists')
        return email

class RegistrationFormPassword(forms.Form):

    password1 = forms.CharField(widget=forms.PasswordInput(), min_length=6, max_length=20, label='Password')
    password2 = forms.CharField(widget=forms.PasswordInput(), min_length=6, max_length=20, label='Confirm Password')

    def clean_password2(self):
        password1 = self.cleaned_data.get('password1')
        password2 = self.cleaned_data.get('password2')

        if password1 and password2:
            if password1 != password2:
                raise forms.ValidationError(u'Please ensure your passwords match')

class RegistrationFormPersonal(ModelForm):

    def __init__(self, *args, **kwargs):
        super(RegistrationFormPersonal, self).__init__(*args, **kwargs)
        self.fields['title'].required = True
        self.fields['given_name'].required = True
        self.fields['surname'].required = True

    class Meta:
        model = Member
        fields = ('title','given_name','surname')

class RegistrationFormHospital(ModelForm):

    def __init__(self, *args, **kwargs):
        super(RegistrationFormHospital, self).__init__(*args, **kwargs)
        self.fields['job_title'].required = True
        self.fields['institution_company'].required = True
        self.fields['hospital'].required = True
        self.fields['hospital_postcode'].required = True
        #self.fields['department_manager_email'].required = True

    class Meta:
        model = Member
        fields = ('job_title','institution_company','hospital','hospital_postcode')

class RegistrationFormPersonalAddress(ModelForm):

    def __init__(self, *args, **kwargs):
        super(RegistrationFormPersonalAddress, self).__init__(*args, **kwargs)
        self.fields['address_1'].required = True
        self.fields['town'].required = True
        self.fields['country'].required = True
        self.fields['telephone'].required = True
    class Meta:
        model = Member
        fields = ('address_1','address_2','town','county','postcode','country','telephone')

class RegistrationFormKnowExisting(ModelForm):

    class Meta:
        model = Member
        fields = ('know_existing',)

class RegistrationFormSupport(ModelForm):

    def __init__(self,*args,**kwargs):
        super(RegistrationFormSupport,self).__init__(*args,**kwargs)
        #self.fields['referrer_letter'].required = True

    class Meta:
        model = Member
        fields = ('referrer_email', 'referrer_letter',)

    def clean_referrer_letter(self):
        referrer_email = self.cleaned_data.get('referrer_email')
        referrer_letter = self.cleaned_data.get('referrer_letter')
        if not referrer_email and not referrer_letter:
            raise forms.ValidationError(u'Please either enter a Members Email or upload a Referrer Letter')
        return referrer_letter

class RegistrationFormSupportNew(ModelForm):

    def __init__(self,*args,**kwargs):
        super(RegistrationFormSupportNew,self).__init__(*args,**kwargs)
        self.fields['referee_new_1_name'].required = True
        self.fields['referee_new_1_details'].required = True
        self.fields['referee_new_2_name'].required = True
        self.fields['referee_new_2_details'].required = True

    class Meta:
        model = Member
        fields = ('referee_new_1_name','referee_new_1_details','referee_new_2_name','referee_new_2_details')

class RegistrationFormAreTrainee(ModelForm):

    class Meta:
        model = Member
        fields = ('trainee',)


class RegistrationFormTraining(ModelForm):

    class Meta:
        model = Member
        fields = ('type_of_training','other_training','training_commencement')
        widgets = {
            'type_of_training' : forms.RadioSelect(choices=Member.TRAINEE_CHOICES),
        }


class RegistrationFormProfessional(ModelForm):

    class Meta:
        model = Member
        fields = ('professional_certification','other_professional_certification','other_qualifications','other_qualifications_other')
        widgets = {
            'professional_certification' : forms.CheckboxSelectMultiple(),
            'other_qualifications' : forms.CheckboxSelectMultiple()
        }

class RegistrationFormTerms(ModelForm):

    def __init__(self,*args,**kwargs):
        super(RegistrationFormTerms,self).__init__(*args,**kwargs)
        self.fields['abide_by_terms'].required = True
        self.fields['agree_privacy'].required = True

    class Meta:
        model = Member
        fields = ('abide_by_terms', 'agree_privacy')

class RegistrationFormInvoice(ModelForm):

    def __init__(self,*args,**kwargs):
        super(RegistrationFormInvoice,self).__init__(*args,**kwargs)

    class Meta:
        model = Member
        fields = ('invoice_company_name','invoice_email')

class UpdateUserForm(ModelForm):

    def __init__(self,*args,**kwargs):
        super(UpdateUserForm,self).__init__(*args,**kwargs)
        self.fields['email'].required = True

    class Meta:
        model = User
        fields = ('email',)

    def clean_email(self):
        email = self.cleaned_data.get('email')
        if email:
            users = User.objects.filter(email=email).exclude(email=self.instance.email)
            if users:
                raise forms.ValidationError(u'Sorry A User with this Email Address already exists')

        return email

class UpdateDelegateForm(ModelForm):

    def __init__(self,*args,**kwargs):
        super(UpdateDelegateForm,self).__init__(*args,**kwargs)
        self.fields['given_name'].required = True
        self.fields['surname'].required = True
        self.fields['address_1'].required = True
        self.fields['town'].required = True
        self.fields['country'].required = True
        self.fields['postcode'].required = True
        self.fields['telephone'].required = True

    class Meta:
        model = Member
        fields = ('given_name','surname','address_1','address_2','town','county','country','postcode','telephone')


class MemberRenewalInvoiceForm(ModelForm):

    class Meta:
        model = MemberRenewalInvoice
        exclude = ('member','paid',)


class MemberProfileImageForm(forms.Form):
    image = forms.ImageField(label='Browse For an Image')

class DirectDebitForm(ModelForm):

    class Meta:
        model = MemberDirectDebit
        fields = ('sort_code','ac_no','ac_name',)


#forms for password setting/resetting

class ForgotPasswordForm(forms.Form):
    email       = forms.CharField(max_length=50, label='Username/Email Address')

class MemberPasswordForm(forms.Form):
    password  = forms.CharField(widget=forms.PasswordInput, min_length=5, max_length=20)
    password2 = forms.CharField(widget=forms.PasswordInput, min_length=5, max_length=20, label="Confirm Password")

#email member

class EmailMemberForm(forms.Form):
    message = forms.CharField(widget=forms.widgets.Textarea(), label='Please enter your message')


#AVS search
class AVSSearchForm(forms.Form):
    name = forms.CharField()
