from appsettings.settings import app_settings
from django.contrib.auth import get_user_model
from django.forms import EmailField, Form, ModelForm, ValidationError
from django.utils.translation import gettext_lazy as _

from .models import UserInstance, UserSSHKey
from .utils import validate_ssh_key


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

        # Make user and instance fields not editable after creation
        instance = getattr(self, 'instance', None)
        if instance and instance.id is not None:
            self.fields['user'].disabled = True
            self.fields['instance'].disabled = True

    def clean_instance(self):
        instance = self.cleaned_data['instance']
        if app_settings.ALLOW_INSTANCE_MULTIPLE_OWNER == 'False':
            exists = UserInstance.objects.filter(instance=instance)
            if exists:
                raise ValidationError(_('Instance owned by another user'))

        return instance

    class Meta:
        model = UserInstance
        fields = '__all__'


class ProfileForm(ModelForm):
    class Meta:
        model = get_user_model()
        fields = ('first_name', 'last_name', 'email')


class UserSSHKeyForm(ModelForm):
    def __init__(self, *args, **kwargs):
        self.user = kwargs.pop('user', None)
        self.publickeys = UserSSHKey.objects.filter(user=self.user)
        super().__init__(*args, **kwargs)

    def clean_keyname(self):
        for key in self.publickeys:
            if self.cleaned_data['keyname'] == key.keyname:
                raise ValidationError(_("Key name already exist"))

        return self.cleaned_data['keyname']

    def clean_keypublic(self):
        for key in self.publickeys:
            if self.cleaned_data['keypublic'] == key.keypublic:
                raise ValidationError(_("Public key already exist"))

        if not validate_ssh_key(self.cleaned_data['keypublic']):
            raise ValidationError(_('Invalid key'))
        return self.cleaned_data['keypublic']

    def save(self, commit=True):
        ssh_key = super().save(commit=False)
        ssh_key.user = self.user
        if commit:
            ssh_key.save()
        return ssh_key

    class Meta:
        model = UserSSHKey
        fields = ('keyname', 'keypublic')


class EmailOTPForm(Form):
    email = EmailField(label=_('Email'))