import datetime

from django import forms
from crispy_forms.helper import FormHelper
from crispy_forms.layout import Layout, Fieldset, Submit, Row, Column, HTML, Div, Field
from .models import Application, ApplicationDocument

SKILLS_CHOICES = [
    ('technical', 'Technical Skills'),
    ('electrical', 'Electrical Installation Skills'),
    ('carpentry', 'Carpentry Skills'),
    ('fashion_design', 'Fashion & Design Skills'),
    ('mechanical', 'Mechanical Skills'),
    ('plumbing', 'Plumbing Skills'),
    ('ict', 'ICT / Computer Skills'),
    ('entrepreneurship', 'Entrepreneurship Skills'),
    ('leadership', 'Leadership Skills'),
    ('communication', 'Communication Skills'),
]

# Year dropdown: current year back to 1960.
_CURRENT_YEAR = datetime.date.today().year
YEAR_CHOICES = [('', 'Select year')] + [(y, str(y)) for y in range(_CURRENT_YEAR, 1959, -1)]

# Nationalities (demonyms). Uganda and its neighbours first for convenience.
NATIONALITIES = [
    'Ugandan', 'Kenyan', 'Tanzanian', 'Rwandan', 'Burundian', 'South Sudanese',
    'Congolese', 'Ethiopian', 'Somali', 'Eritrean',
    'Afghan', 'Albanian', 'Algerian', 'American', 'Andorran', 'Angolan', 'Antiguan',
    'Argentine', 'Armenian', 'Australian', 'Austrian', 'Azerbaijani', 'Bahamian',
    'Bahraini', 'Bangladeshi', 'Barbadian', 'Belarusian', 'Belgian', 'Belizean',
    'Beninese', 'Bhutanese', 'Bolivian', 'Bosnian', 'Botswanan', 'Brazilian',
    'British', 'Bruneian', 'Bulgarian', 'Burkinabe', 'Cambodian', 'Cameroonian',
    'Canadian', 'Cape Verdean', 'Central African', 'Chadian', 'Chilean', 'Chinese',
    'Colombian', 'Comoran', 'Costa Rican', 'Croatian', 'Cuban', 'Cypriot', 'Czech',
    'Danish', 'Djiboutian', 'Dominican', 'Dutch', 'Ecuadorean', 'Egyptian',
    'Emirati', 'Equatorial Guinean', 'Estonian', 'Eswatini', 'Fijian', 'Finnish',
    'French', 'Gabonese', 'Gambian', 'Georgian', 'German', 'Ghanaian', 'Greek',
    'Grenadian', 'Guatemalan', 'Guinean', 'Guyanese', 'Haitian', 'Honduran',
    'Hungarian', 'Icelandic', 'Indian', 'Indonesian', 'Iranian', 'Iraqi', 'Irish',
    'Israeli', 'Italian', 'Ivorian', 'Jamaican', 'Japanese', 'Jordanian',
    'Kazakh', 'Kiribati', 'Kuwaiti', 'Kyrgyz', 'Laotian', 'Latvian', 'Lebanese',
    'Liberian', 'Libyan', 'Liechtensteiner', 'Lithuanian', 'Luxembourgish',
    'Macedonian', 'Malagasy', 'Malawian', 'Malaysian', 'Maldivian', 'Malian',
    'Maltese', 'Marshallese', 'Mauritanian', 'Mauritian', 'Mexican', 'Micronesian',
    'Moldovan', 'Monacan', 'Mongolian', 'Montenegrin', 'Moroccan', 'Mozambican',
    'Namibian', 'Nauruan', 'Nepalese', 'New Zealander', 'Nicaraguan', 'Nigerien',
    'Nigerian', 'North Korean', 'Norwegian', 'Omani', 'Pakistani', 'Palauan',
    'Palestinian', 'Panamanian', 'Papua New Guinean', 'Paraguayan', 'Peruvian',
    'Philippine', 'Polish', 'Portuguese', 'Qatari', 'Romanian', 'Russian',
    'Saint Lucian', 'Salvadoran', 'Samoan', 'San Marinese', 'Saudi', 'Senegalese',
    'Serbian', 'Seychellois', 'Sierra Leonean', 'Singaporean', 'Slovak', 'Slovenian',
    'Solomon Islander', 'South African', 'South Korean', 'Spanish', 'Sri Lankan',
    'Sudanese', 'Surinamese', 'Swedish', 'Swiss', 'Syrian', 'Taiwanese', 'Tajik',
    'Thai', 'Togolese', 'Tongan', 'Trinidadian', 'Tunisian', 'Turkish', 'Turkmen',
    'Tuvaluan', 'Ukrainian', 'Uruguayan', 'Uzbek', 'Vanuatuan', 'Venezuelan',
    'Vietnamese', 'Yemeni', 'Zambian', 'Zimbabwean', 'Other',
]
NATIONALITY_CHOICES = [(n, n) for n in NATIONALITIES]


class ApplicationForm(forms.ModelForm):
    # Override JSONField with a proper checkbox widget
    skills_profile = forms.MultipleChoiceField(
        choices=SKILLS_CHOICES,
        widget=forms.CheckboxSelectMultiple,
        required=False,
        label='',
    )

    # Document upload fields (saved as ApplicationDocument, not model fields)
    o_level_file = forms.FileField(
        required=False,
        label='O-Level Results (UCE)',
        help_text='PDF, JPG, or PNG — max 5 MB.',
        widget=forms.FileInput(attrs={'accept': '.pdf,.jpg,.jpeg,.png'}),
    )
    a_level_file = forms.FileField(
        required=False,
        label='A-Level Results (UACE)',
        help_text='Required if applying for Diploma level.',
        widget=forms.FileInput(attrs={'accept': '.pdf,.jpg,.jpeg,.png'}),
    )
    certificate_file = forms.FileField(
        required=False,
        label='Certificate (if applicable)',
        help_text='Any relevant vocational or academic certificate.',
        widget=forms.FileInput(attrs={'accept': '.pdf,.jpg,.jpeg,.png'}),
    )
    national_id_file = forms.FileField(
        required=False,
        label='National ID / Passport Copy',
        widget=forms.FileInput(attrs={'accept': '.pdf,.jpg,.jpeg,.png'}),
    )
    passport_photo_file = forms.ImageField(
        required=False,
        label='Passport-size Photo',
        help_text='Recent photo with white background.',
        widget=forms.FileInput(attrs={'accept': '.jpg,.jpeg,.png'}),
    )

    # Nationality as a dropdown of countries (demonyms), default Ugandan.
    nationality = forms.ChoiceField(
        choices=NATIONALITY_CHOICES,
        initial='Ugandan',
        label='Nationality',
    )

    # Year Completed as a validated year picker (dropdown).
    year_of_completion = forms.TypedChoiceField(
        choices=YEAR_CHOICES,
        coerce=int,
        label='Year Completed',
    )

    class Meta:
        model = Application
        exclude = [
            'applicant_user', 'status', 'admin_notes', 'rejection_reason',
            'reviewed_by', 'submitted_at', 'reviewed_at', 'updated_at',
        ]
        widgets = {
            'date_of_birth': forms.DateInput(attrs={'type': 'date'}),
            'physical_address': forms.Textarea(attrs={'rows': 2}),
            'apprenticeship_details': forms.Textarea(attrs={'rows': 3}),
            'practical_experience': forms.Textarea(attrs={'rows': 3}),
            'work_duties': forms.Textarea(attrs={'rows': 3}),
            'emergency_contact_address': forms.Textarea(attrs={'rows': 2}),
            'secondary_contact_address': forms.Textarea(attrs={'rows': 2}),
        }

    def __init__(self, *args, **kwargs):
        instance = kwargs.get('instance')
        if instance and instance.skills_profile:
            initial = kwargs.setdefault('initial', {})
            initial.setdefault('skills_profile', instance.skills_profile)
        super().__init__(*args, **kwargs)

        self.helper = FormHelper()
        self.helper.form_tag = False
        self.helper.layout = Layout(

            # ── Section 1: Personal Information ────────────────────────
            HTML('<h5 class="section-heading"><i class="fa-solid fa-user me-2"></i>1. Personal Information</h5>'),
            Row(
                Column('first_name', css_class='col-md-4'),
                Column('other_names', css_class='col-md-4'),
                Column('last_name', css_class='col-md-4'),
            ),
            Row(
                Column('date_of_birth', css_class='col-md-4'),
                Column('gender', css_class='col-md-4'),
                Column('nationality', css_class='col-md-4'),
            ),
            Row(
                Column('phone_number', css_class='col-md-6'),
                Column('email', css_class='col-md-6'),
            ),
            Row(
                Column('physical_address', css_class='col-md-8'),
                Column('district', css_class='col-md-4'),
            ),
            Row(
                Column('national_id', css_class='col-md-6'),
            ),

            # ── Section 2A: Academic Qualifications ────────────────────
            HTML('<h5 class="section-heading mt-4"><i class="fa-solid fa-graduation-cap me-2"></i>2A. Academic Qualifications</h5>'),
            Row(
                Column('highest_education_level', css_class='col-md-4'),
                Column('education_other', css_class='col-md-4'),
                Column('year_of_completion', css_class='col-md-4'),
            ),
            Row(
                Column('last_school_attended', css_class='col-md-8'),
                Column('institution_location', css_class='col-md-4'),
            ),

            # ── Section 2B: National Examination Details ───────────────
            HTML('<h5 class="section-heading mt-4"><i class="fa-solid fa-file-pen me-2"></i>2B. National Examination Details <small class="text-muted fw-normal">(if applicable)</small></h5>'),
            Row(
                Column('exam_index_number', css_class='col-md-4'),
                Column('exam_body', css_class='col-md-3'),
                Column('exam_body_other', css_class='col-md-5'),
            ),
            Row(
                Column('exam_year', css_class='col-md-4'),
                Column('exam_grade', css_class='col-md-8'),
            ),

            # ── Section 2C: Non-Formal / Skills-Based Education ────────
            HTML('<h5 class="section-heading mt-4"><i class="fa-solid fa-tools me-2"></i>2C. Skills-Based / Non-Formal Education <small class="text-muted fw-normal">(if applicable)</small></h5>'),
            'non_formal_level',
            'apprenticeship_details',
            'practical_experience',

            # ── Section 3: Former Institution ──────────────────────────
            HTML('<h5 class="section-heading mt-4"><i class="fa-solid fa-school me-2"></i>3. Former School / Institution Details <small class="text-muted fw-normal">(if applicable)</small></h5>'),
            Row(
                Column('former_institution_name', css_class='col-md-6'),
                Column('former_institution_level', css_class='col-md-3'),
                Column('former_institution_year', css_class='col-md-3'),
            ),
            'former_institution_district',

            # ── Section 4: Work Experience ─────────────────────────────
            HTML('<h5 class="section-heading mt-4"><i class="fa-solid fa-briefcase me-2"></i>4. Work Experience <small class="text-muted fw-normal">(for working professionals)</small></h5>'),
            Row(
                Column('current_occupation', css_class='col-md-4'),
                Column('employer_name', css_class='col-md-4'),
                Column('years_of_experience', css_class='col-md-4'),
            ),
            'work_duties',

            # ── Additional Qualifications ──────────────────────────────
            HTML('<h5 class="section-heading mt-4"><i class="fa-solid fa-plus-circle me-2"></i>Additional Qualifications / Experience <small class="text-muted fw-normal">(optional)</small></h5>'),
            HTML('<p class="text-muted small mb-2">Use this space for any extra certifications, courses, jobs, or relevant experience not covered above.</p>'),
            Field('additional_qualifications', rows=3),

            # ── Section 5: Next of Kin ─────────────────────────────────
            HTML('<h5 class="section-heading mt-4"><i class="fa-solid fa-phone-volume me-2"></i>5. Next of Kin / Parent / Guardian Details</h5>'),
            HTML('<p class="text-muted small mb-3 fw-semibold">Primary Next of Kin <span class="text-danger">*</span></p>'),
            Row(
                Column('emergency_contact_name', css_class='col-md-6'),
                Column('emergency_contact_relationship', css_class='col-md-6'),
            ),
            Row(
                Column('emergency_contact_phone', css_class='col-md-4'),
                Column('emergency_contact_email', css_class='col-md-4'),
                Column('emergency_contact_occupation', css_class='col-md-4'),
            ),
            'emergency_contact_address',

            HTML('<p class="text-muted small mb-3 mt-3 fw-semibold">Secondary Next of Kin <span class="text-muted fw-normal">(optional)</span></p>'),
            Row(
                Column('secondary_contact_name', css_class='col-md-6'),
                Column('secondary_contact_relationship', css_class='col-md-6'),
            ),
            Row(
                Column('secondary_contact_phone', css_class='col-md-4'),
                Column('secondary_contact_email', css_class='col-md-4'),
                Column('secondary_contact_occupation', css_class='col-md-4'),
            ),
            'secondary_contact_address',

            # ── Section 6: Program Application ────────────────────────
            HTML('<h5 class="section-heading mt-4"><i class="fa-solid fa-book-open me-2"></i>6. Course / Program Application</h5>'),
            Row(
                Column('program_applied', css_class='col-md-8'),
                Column('preferred_start_date', css_class='col-md-4'),
            ),
            HTML('<p class="text-muted small mt-1 mb-0"><i class="fa-solid fa-info-circle me-1"></i>Mode of Study: Online Learning with practical assessments at approved centres.</p>'),

            # ── Section 7: Skills Profile ──────────────────────────────
            HTML('<h5 class="section-heading mt-4"><i class="fa-solid fa-star me-2"></i>7. Skills Profile</h5>'),
            HTML('<p class="text-muted small mb-2">Select all skills you already have:</p>'),
            Field('skills_profile', css_class=''),
            Row(
                Column('skills_other', css_class='col-md-6'),
            ),

            # ── Supporting Documents ───────────────────────────────────
            HTML('<h5 class="section-heading mt-4"><i class="fa-solid fa-file-arrow-up me-2"></i>Supporting Documents</h5>'),
            HTML('<p class="text-muted small mb-3">Upload scanned copies or clear photos. Max file size: 5 MB each.</p>'),
            Row(
                Column('o_level_file', css_class='col-md-6'),
                Column('a_level_file', css_class='col-md-6'),
            ),
            Row(
                Column('certificate_file', css_class='col-md-6'),
                Column('national_id_file', css_class='col-md-6'),
            ),
            'passport_photo_file',
        )

    def clean_year_of_completion(self):
        year = self.cleaned_data.get('year_of_completion')
        from django.utils import timezone
        current_year = timezone.now().year
        if year and (year < 1980 or year > current_year):
            raise forms.ValidationError(f'Year must be between 1980 and {current_year}.')
        return year

    def clean_exam_year(self):
        year = self.cleaned_data.get('exam_year')
        if year:
            from django.utils import timezone
            current_year = timezone.now().year
            if year < 1980 or year > current_year:
                raise forms.ValidationError(f'Year must be between 1980 and {current_year}.')
        return year

    def clean_email(self):
        email = self.cleaned_data.get('email')
        if Application.objects.filter(email=email, status__in=['pending', 'under_review', 'approved']).exists():
            raise forms.ValidationError(
                'An active application with this email already exists. '
                'Contact us at info@mlsfoundationug.org if you need help.'
            )
        return email

    def save(self, commit=True):
        instance = super().save(commit=False)
        instance.skills_profile = self.cleaned_data.get('skills_profile', [])
        if commit:
            instance.save()
        return instance


class ApplicationStatusForm(forms.Form):
    reference_number = forms.CharField(
        max_length=20,
        label='Application Reference Number',
        widget=forms.TextInput(attrs={'placeholder': 'e.g. MLS-APP-00001'}),
    )
    email = forms.EmailField(
        label='Email Address Used on Application',
        widget=forms.EmailInput(attrs={'placeholder': 'your@email.com'}),
    )

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.helper = FormHelper()
        self.helper.layout = Layout(
            'reference_number',
            'email',
            Submit('submit', 'Check Status', css_class='btn btn-primary'),
        )


class ApplicationReviewForm(forms.ModelForm):
    class Meta:
        model = Application
        fields = ['admin_notes', 'rejection_reason']
        widgets = {
            'admin_notes': forms.Textarea(attrs={'rows': 3, 'placeholder': 'Internal notes (not visible to applicant)'}),
            'rejection_reason': forms.Textarea(attrs={'rows': 3, 'placeholder': 'Reason for rejection (will be emailed to applicant)'}),
        }
