from django import forms
from django.contrib.auth import get_user_model

from wagtail.users.forms import UserEditForm, UserCreationForm


User = get_user_model()


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

        # HACK: Wagtail admin doesn't work with custom User models that do not have first/last name.
        self.fields['first_name'].widget = forms.HiddenInput(attrs={'value': f"Not used - see full_name"})
        self.fields['last_name'].widget = forms.HiddenInput(attrs={'value': f"Not used - see full_name"})


class CustomUserEditForm(CustomUserAdminFormBase, UserEditForm):
    pass


class CustomUserCreationForm(CustomUserAdminFormBase, UserCreationForm):
    pass


class ProfileForm(forms.ModelForm):
    class Meta:
        model = User
        fields = ['full_name', 'email', 'slack']

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        if not self.instance.is_apply_staff:
            del self.fields['slack']

        if not self.instance.has_usable_password():
            # User is registered with oauth - no password change allowed
            del self.fields['email']

    def clean_slack(self):
        slack = self.cleaned_data['slack']
        if slack:
            slack = slack.strip()
            if ' ' in slack:
                raise forms.ValidationError('Slack names must not include spaces')

            if not slack.startswith('@'):
                slack = '@' + slack

        return slack