from django import forms
from django.utils.translation import ugettext_lazy as _

from orchestra.forms import UserCreationForm, UserChangeForm


class CleanCustomFilteringMixin(object):
    def clean_custom_filtering(self):
        filtering = self.cleaned_data['filtering']
        custom_filtering = self.cleaned_data['custom_filtering']
        if filtering == self._meta.model.CUSTOM and not custom_filtering:
            raise forms.ValidationError(_("You didn't provide any custom filtering"))
        return custom_filtering


class MailboxChangeForm(CleanCustomFilteringMixin, UserChangeForm):
    pass


class MailboxCreationForm(CleanCustomFilteringMixin, UserCreationForm):
    def clean_name(self):
        # Since model.clean() will check this, this is redundant,
        # but it sets a nicer error message than the ORM and avoids conflicts with contrib.auth
        name = self.cleaned_data["name"]
        try:
            self._meta.model._default_manager.get(name=name)
        except self._meta.model.DoesNotExist:
            return name
        raise forms.ValidationError(self.error_messages['duplicate_name'])


class AddressForm(forms.ModelForm):
    def clean(self):
        cleaned_data = super(AddressForm, self).clean()
        if not cleaned_data['mailboxes'] and not cleaned_data['forward']:
            raise forms.ValidationError(_("Mailboxes or forward address should be provided"))