from django import forms
from django.core.validators import FileExtensionValidator
from django.utils.translation import gettext_lazy as _
from crispy_forms.helper import FormHelper
from crispy_forms.layout import Layout, Fieldset, Div, Submit, HTML
from .models import Membership
from django.utils import timezone

class MembershipForm(forms.ModelForm):
    MEMBERSHIP_CHOICES = [
        ('full', 'Full Member - K600 per year'),
        ('associate', 'Associate Member - K300 per year'),
        ('student', 'Student Member - K200 per year'),
        ('honorary', 'Honorary Member - K200 per year'),
    ]

    membership_type = forms.ChoiceField(
        choices=MEMBERSHIP_CHOICES,
        widget=forms.RadioSelect,
        required=True,
        label='Membership Type',
        help_text='Select your preferred membership category'
    )

    class Meta:
        model = Membership
        fields = [
            'membership_type',
            'first_name',
            'last_name',
            'email',
            'phone_number',
            'date_of_birth',
            'nationality',
            'nrc_number',
            'nrc_file',
            'residential_address',
            'postal_address',
            'occupation',
            'employer',
            'highest_qualification',
            'field_of_study',
            'institution',
            'graduation_year',
            'profile_picture',
            'cv',
        ]
        labels = {
            'nrc_number': 'ID Number*'
        }
        exclude = ['user', 'membership_status', 'membership_fee',
                  'membership_valid_until', 'payment_proof', 'payment_verified',
                  'payment_verified_at', 'payment_verified_by', 'created_at', 'updated_at']
        help_texts = {
            'nrc_number': _('Enter your NRC number or Passport number'),
            'nrc_file': _('Upload a scanned copy of your NRC or Passport (PDF, JPG - Max: 5MB)'),
            'occupation': _('Your current job title or role'),
            'employer': _('Name of your current employer or organization'),
            'profile_picture': _('A recent passport-sized photo'),
            'cv': _('Your current curriculum vitae (CV) in PDF format'),
        }
        widgets = {
            'date_of_birth': forms.DateInput(attrs={'type': 'date'}),
            'graduation_year': forms.NumberInput(attrs={'min': 1950, 'max': 2025}),
            'residential_address': forms.Textarea(attrs={'rows': 3}),
            'postal_address': forms.Textarea(attrs={'rows': 3}),
            'highest_qualification': forms.Select(choices=Membership.QUALIFICATION_CHOICES),
        }

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        
        # Add placeholders and help text
        self.fields['first_name'].widget.attrs.update({'placeholder': 'Enter your first name'})
        self.fields['last_name'].widget.attrs.update({'placeholder': 'Enter your last name'})
        self.fields['email'].widget.attrs.update({'placeholder': 'Enter your email address'})
        self.fields['phone_number'].widget.attrs.update({'placeholder': 'Enter your phone number'})
        self.fields['nationality'].widget.attrs.update({'placeholder': 'Enter your nationality'})
        self.fields['nrc_number'].widget.attrs.update({'placeholder': 'Enter your NRC or Passport number'})
        self.fields['residential_address'].widget.attrs.update({'placeholder': 'Enter your residential address'})
        self.fields['postal_address'].widget.attrs.update({'placeholder': 'Enter your postal address'})
        self.fields['occupation'].widget.attrs.update({'placeholder': 'Your current job title or role'})
        self.fields['employer'].widget.attrs.update({'placeholder': 'Name of your current employer or organization'})
        self.fields['field_of_study'].widget.attrs.update({'placeholder': 'Your field of study'})
        self.fields['institution'].widget.attrs.update({'placeholder': 'Name of your institution'})
        self.fields['graduation_year'].widget.attrs.update({'placeholder': 'Year of graduation'})

        # Add help text for file uploads
        self.fields['profile_picture'].help_text = 'Upload a recent passport-sized photo (JPG, PNG - Max: 5MB)'
        self.fields['cv'].help_text = 'Upload your current CV (PDF, DOC - Max: 10MB)'
        self.fields['nrc_file'].help_text = 'Upload a scanned copy of your NRC or Passport (PDF, JPG - Max: 5MB)'

        # Add file upload validators
        self.fields['profile_picture'].validators.append(
            FileExtensionValidator(allowed_extensions=['jpg', 'jpeg', 'png'])
        )
        self.fields['cv'].validators.append(
            FileExtensionValidator(allowed_extensions=['pdf', 'doc', 'docx'])
        )
        self.fields['nrc_file'].validators.append(
            FileExtensionValidator(allowed_extensions=['pdf', 'jpg', 'jpeg', 'png'])
        )

        # Add Bootstrap classes to all fields except membership_type (radio buttons)
        for field in self.fields:
            if field != 'membership_type':
                self.fields[field].widget.attrs['class'] = 'form-control'

        self.helper = FormHelper()
        self.helper.form_tag = True
        self.helper.form_class = 'form-horizontal'
        self.helper.label_class = 'col-lg-3'
        self.helper.field_class = 'col-lg-9'

        self.helper.layout = Layout(
            Fieldset(
                'Membership Type',
                'membership_type',
                css_class='mb-4'
            ),
            Fieldset(
                'Personal Information',
                Div(
                    Div('first_name', css_class='col-md-6'),
                    Div('last_name', css_class='col-md-6'),
                    css_class='row'
                ),
                Div(
                    Div('email', css_class='col-md-6'),
                    Div('phone_number', css_class='col-md-6'),
                    css_class='row'
                ),
                Div(
                    Div('date_of_birth', css_class='col-md-6'),
                    Div('nationality', css_class='col-md-6'),
                    css_class='row'
                ),
                'nrc_number',
                'nrc_file',
                'residential_address',
                'postal_address',
                css_class='mb-4'
            ),
            Fieldset(
                'Professional Information',
                Div(
                    Div('occupation', css_class='col-md-6'),
                    Div('employer', css_class='col-md-6'),
                    css_class='row'
                ),
                css_class='mb-4'
            ),
            Fieldset(
                'Educational Background',
                Div(
                    Div('highest_qualification', css_class='col-md-6'),
                    Div('field_of_study', css_class='col-md-6'),
                    css_class='row'
                ),
                Div(
                    Div('institution', css_class='col-md-6'),
                    Div('graduation_year', css_class='col-md-6'),
                    css_class='row'
                ),
                css_class='mb-4'
            ),
            Fieldset(
                'Required Documents',
                Div(
                    Div('profile_picture', css_class='col-md-6'),
                    Div('cv', css_class='col-md-6'),
                    css_class='row'
                ),
                css_class='mb-4'
            ),
            Div(
                Submit('submit', 'Submit Application', css_class='btn-primary btn-lg'),
                css_class='d-grid gap-2'
            )
        )

    def clean_email(self):
        """Validate that email is unique for non-rejected applications."""
        email = self.cleaned_data.get('email')
        if self.instance.pk:  # If editing existing application
            existing = Membership.objects.filter(email=email).exclude(pk=self.instance.pk)
        else:  # If new application
            existing = Membership.objects.filter(email=email)
        
        if existing.exists() and existing.first().membership_status != 'rejected':
            raise forms.ValidationError('A membership application with this email already exists.')
        return email

    def clean_nrc_number(self):
        """Validate that NRC/Passport is unique for non-rejected applications."""
        nrc = self.cleaned_data.get('nrc_number')
        if self.instance.pk:  # If editing existing application
            existing = Membership.objects.filter(nrc_number=nrc).exclude(pk=self.instance.pk)
        else:  # If new application
            existing = Membership.objects.filter(nrc_number=nrc)
        
        if existing.exists() and existing.first().membership_status != 'rejected':
            raise forms.ValidationError('A membership application with this NRC/Passport number already exists.')
        return nrc

    def clean_date_of_birth(self):
        """Validate that member is at least 18 years old."""
        dob = self.cleaned_data.get('date_of_birth')
        if dob:
            today = timezone.now().date()
            age = today.year - dob.year - ((today.month, today.day) < (dob.month, dob.day))
            if age < 18:
                raise forms.ValidationError('You must be at least 18 years old to apply for membership.')
        return dob