from django import forms
from django.contrib.auth import get_user_model
from crispy_forms.helper import FormHelper
from crispy_forms.layout import Layout, Row, Column, Submit
from admissions.models import Application
from .models import StudentProfile, TeacherProfile

User = get_user_model()


class StudentContactForm(forms.ModelForm):
    """Contact details a student may edit (only when an admin unlocks editing)."""
    class Meta:
        model = Application
        fields = [
            'phone_number', 'physical_address', 'district',
            'emergency_contact_name', 'emergency_contact_relationship',
            'emergency_contact_phone', 'emergency_contact_email',
        ]
        widgets = {'physical_address': forms.Textarea(attrs={'rows': 2})}

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.helper = FormHelper()
        self.helper.layout = Layout(
            Row(
                Column('phone_number', css_class='col-md-6'),
                Column('district', css_class='col-md-6'),
            ),
            'physical_address',
            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-6'),
                Column('emergency_contact_email', css_class='col-md-6'),
            ),
            Submit('submit', 'Save Contact Details', css_class='btn btn-primary'),
        )


class StudentProfileUpdateForm(forms.ModelForm):
    first_name = forms.CharField(max_length=150)
    last_name = forms.CharField(max_length=150)
    phone = forms.CharField(max_length=20, required=False)
    profile_photo = forms.ImageField(required=False)

    class Meta:
        model = StudentProfile
        fields = ['bio']

    def __init__(self, user, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.user = user
        self.fields['first_name'].initial = user.first_name
        self.fields['last_name'].initial = user.last_name
        self.fields['phone'].initial = user.phone
        self.fields['profile_photo'].initial = user.profile_photo

        self.helper = FormHelper()
        self.helper.layout = Layout(
            Row(
                Column('first_name', css_class='col-md-6'),
                Column('last_name', css_class='col-md-6'),
            ),
            'phone',
            'profile_photo',
            'bio',
            Submit('submit', 'Update Profile', css_class='btn btn-primary'),
        )

    def save(self, commit=True):
        profile = super().save(commit=False)
        self.user.first_name = self.cleaned_data['first_name']
        self.user.last_name = self.cleaned_data['last_name']
        self.user.phone = self.cleaned_data['phone']
        if self.cleaned_data.get('profile_photo'):
            self.user.profile_photo = self.cleaned_data['profile_photo']
        if commit:
            self.user.save()
            profile.save()
        return profile


class TeacherProfileUpdateForm(forms.ModelForm):
    first_name = forms.CharField(max_length=150)
    last_name = forms.CharField(max_length=150)
    phone = forms.CharField(max_length=20, required=False)
    profile_photo = forms.ImageField(required=False)

    class Meta:
        model = TeacherProfile
        fields = ['bio', 'specialization', 'qualification']
        widgets = {'bio': forms.Textarea(attrs={'rows': 3})}

    def __init__(self, user, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.user = user
        self.fields['first_name'].initial = user.first_name
        self.fields['last_name'].initial = user.last_name
        self.fields['phone'].initial = user.phone
        self.fields['profile_photo'].initial = user.profile_photo

        self.helper = FormHelper()
        self.helper.layout = Layout(
            Row(
                Column('first_name', css_class='col-md-6'),
                Column('last_name', css_class='col-md-6'),
            ),
            'phone',
            'profile_photo',
            'specialization',
            'qualification',
            'bio',
            Submit('submit', 'Update Profile', css_class='btn btn-primary'),
        )

    def save(self, commit=True):
        profile = super().save(commit=False)
        self.user.first_name = self.cleaned_data['first_name']
        self.user.last_name = self.cleaned_data['last_name']
        self.user.phone = self.cleaned_data['phone']
        if self.cleaned_data.get('profile_photo'):
            self.user.profile_photo = self.cleaned_data['profile_photo']
        if commit:
            self.user.save()
            profile.save()
        return profile
