from django import forms
from django.utils import timezone
from crispy_forms.helper import FormHelper
from crispy_forms.layout import Layout, Row, Column, Submit, HTML
from .models import JobPosting, Application


class JobPostingForm(forms.ModelForm):
    """Form for creating and editing job postings"""
    
    class Meta:
        model = JobPosting
        fields = [
            'title', 'description', 'requirements', 'location',
            'salary_range', 'employment_type', 'experience_level',
            'application_deadline', 'status'
        ]
        widgets = {
            'description': forms.Textarea(attrs={'rows': 6}),
            'requirements': forms.Textarea(attrs={'rows': 6}),
            'application_deadline': forms.DateTimeInput(attrs={'type': 'datetime-local'}),
        }
    
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.helper = FormHelper()
        self.helper.layout = Layout(
            'title',
            Row(
                Column('location', css_class='form-group col-md-6 mb-0'),
                Column('salary_range', css_class='form-group col-md-6 mb-0'),
                css_class='form-row'
            ),
            Row(
                Column('employment_type', css_class='form-group col-md-4 mb-0'),
                Column('experience_level', css_class='form-group col-md-4 mb-0'),
                Column('status', css_class='form-group col-md-4 mb-0'),
                css_class='form-row'
            ),
            'application_deadline',
            'description',
            'requirements',
            Submit('submit', 'Save Job Posting', css_class='btn btn-primary')
        )
    
    def clean_application_deadline(self):
        deadline = self.cleaned_data['application_deadline']
        if deadline <= timezone.now():
            raise forms.ValidationError("Application deadline must be in the future.")
        return deadline


class ApplicationForm(forms.ModelForm):
    """Form for job applications (requires authentication)"""
    
    class Meta:
        model = Application
        fields = [
            'applicant_name', 'applicant_email', 'applicant_phone',
            'membership_number', 'cover_letter', 'resume', 'ictaz_certificate', 'additional_documents'
        ]
        labels = {
            'ictaz_certificate': 'ICTAZ Certificate',
        }
        widgets = {
            'cover_letter': forms.Textarea(attrs={'rows': 8, 'placeholder': 'Tell us why you are the perfect fit for this position...'}),
            'applicant_name': forms.TextInput(attrs={'readonly': True}),
            'applicant_email': forms.EmailInput(attrs={'readonly': True}),
        }
    
    def __init__(self, *args, **kwargs):
        self.job = kwargs.pop('job', None)
        self.user = kwargs.pop('user', None)
        super().__init__(*args, **kwargs)
        
        # Auto-fill user information if provided
        if self.user:
            self.fields['applicant_name'].initial = self.user.get_full_name()
            self.fields['applicant_email'].initial = self.user.email
            if self.user.membership_number:
                self.fields['membership_number'].initial = self.user.membership_number
            if self.user.phone_number:
                self.fields['applicant_phone'].initial = self.user.phone_number
        
        # Add phone number validation
        self.fields['applicant_phone'].help_text = "Phone number must start with 260 (e.g., 260971234567)"
        self.fields['membership_number'].required = True
        self.fields['membership_number'].help_text = "Your ICTAZ membership number is required"
        
        self.helper = FormHelper()
        self.helper.layout = Layout(
            HTML('<div class="alert alert-info"><i class="fas fa-info-circle"></i> All fields marked with * are required. Name and email are auto-filled from your profile.</div>'),
            Row(
                Column('applicant_name', css_class='form-group col-md-6 mb-0'),
                Column('applicant_email', css_class='form-group col-md-6 mb-0'),
                css_class='form-row'
            ),
            Row(
                Column('applicant_phone', css_class='form-group col-md-6 mb-0'),
                Column('membership_number', css_class='form-group col-md-6 mb-0'),
                css_class='form-row'
            ),
            'cover_letter',
            Row(
                Column('resume', css_class='form-group col-md-4 mb-0'),
                Column('ictaz_certificate', css_class='form-group col-md-4 mb-0'),
                Column('additional_documents', css_class='form-group col-md-4 mb-0'),
                css_class='form-row'
            ),
            HTML('<div class="alert alert-warning mt-3"><i class="fas fa-exclamation-triangle"></i> Please ensure all uploaded files are in PDF format and do not exceed 10MB each. Additional documents should include NRC, Degree Results, etc. as a single PDF.</div>'),
            Submit('submit', 'Submit Application', css_class='btn btn-primary btn-lg')
        )
    
    def clean_applicant_email(self):
        email = self.cleaned_data['applicant_email']
        if self.job and Application.objects.filter(job=self.job, applicant_email=email).exists():
            raise forms.ValidationError("You have already applied for this position with this email address.")
        return email
    
    def clean_applicant_phone(self):
        phone = self.cleaned_data['applicant_phone']
        if not phone.startswith('260'):
            raise forms.ValidationError("Phone number must start with 260 (Zambia country code).")
        if len(phone) < 12:
            raise forms.ValidationError("Please enter a valid Zambian phone number (e.g., 260971234567).")
        return phone
    
    def clean_membership_number(self):
        membership = self.cleaned_data.get('membership_number')
        if not membership:
            raise forms.ValidationError("ICTAZ membership number is required.")
        return membership
    
    def clean_resume(self):
        resume = self.cleaned_data.get('resume')
        if resume:
            if resume.size > 10 * 1024 * 1024:  # 10MB
                raise forms.ValidationError("Resume file size cannot exceed 10MB.")
            if not resume.name.lower().endswith('.pdf'):
                raise forms.ValidationError("Resume must be in PDF format.")
        return resume
    
    def clean_ictaz_certificate(self):
        cert = self.cleaned_data.get('ictaz_certificate')
        if cert:
            if cert.size > 10 * 1024 * 1024:  # 10MB
                raise forms.ValidationError("ICTAZ certificate file size cannot exceed 10MB.")
            if not cert.name.lower().endswith('.pdf'):
                raise forms.ValidationError("ICTAZ certificate must be in PDF format.")
        return cert
    
    def clean_additional_documents(self):
        docs = self.cleaned_data.get('additional_documents')
        if docs:
            if docs.size > 10 * 1024 * 1024:  # 10MB
                raise forms.ValidationError("Additional documents file size cannot exceed 10MB.")
            if not docs.name.lower().endswith('.pdf'):
                raise forms.ValidationError("Additional documents must be in PDF format.")
        return docs


class ApplicationNotesForm(forms.ModelForm):
    """Form for updating application notes (Admin/Stakeholder use)"""
    
    class Meta:
        model = Application
        fields = ['admin_notes']
        widgets = {
            'admin_notes': forms.Textarea(attrs={'rows': 4}),
        }
    
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.helper = FormHelper()
        self.helper.layout = Layout(
            'admin_notes',
            Submit('submit', 'Update Notes', css_class='btn btn-primary')
        )


class JobSearchForm(forms.Form):
    """Form for searching and filtering job postings"""
    
    EMPLOYMENT_TYPE_CHOICES = [('', 'All Types')] + JobPosting._meta.get_field('employment_type').choices
    EXPERIENCE_LEVEL_CHOICES = [('', 'All Levels')] + JobPosting._meta.get_field('experience_level').choices
    
    search = forms.CharField(
        max_length=200,
        required=False,
        widget=forms.TextInput(attrs={'placeholder': 'Search jobs by title, description, or location...'})
    )
    employment_type = forms.ChoiceField(
        choices=EMPLOYMENT_TYPE_CHOICES,
        required=False
    )
    experience_level = forms.ChoiceField(
        choices=EXPERIENCE_LEVEL_CHOICES,
        required=False
    )
    location = forms.CharField(
        max_length=200,
        required=False,
        widget=forms.TextInput(attrs={'placeholder': 'Location'})
    )
    
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.helper = FormHelper()
        self.helper.form_method = 'get'
        self.helper.layout = Layout(
            Row(
                Column('search', css_class='form-group col-md-4 mb-0'),
                Column('location', css_class='form-group col-md-2 mb-0'),
                Column('employment_type', css_class='form-group col-md-2 mb-0'),
                Column('experience_level', css_class='form-group col-md-2 mb-0'),
                Column(Submit('submit', 'Search', css_class='btn btn-primary'), css_class='form-group col-md-2 mb-0'),
                css_class='form-row'
            )
        )
