import tldextract

from django import forms
from django.forms import ModelForm
from django.utils.translation import get_language, ugettext_lazy as _
from django.core.exceptions import ValidationError
from .validators import domain_name_validator
from .models import VMInstance
from uncloud_pay.models import BillingAddress


class DomainNameField(forms.CharField):
    description = 'Domain name form field'
    default_validators = [domain_name_validator, ]

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

class MainModelForm(ModelForm):
    def __init__(self, *args, **kwargs):
        super(MainModelForm, self).__init__(*args, **kwargs)
        for visible in self.visible_fields():
            visible.field.widget.attrs['class'] = 'form-control'

class MainForm(forms.Form):
    def __init__(self, *args, **kwargs):
        super(MainForm, self).__init__(*args, **kwargs)
        for visible in self.visible_fields():
            if (isinstance(visible.field.widget, forms.TextInput)):
                visible.field.widget.attrs['class'] = 'form-control'
            elif (isinstance(visible.field.widget, forms.CheckboxInput)):
                visible.field.widget.attrs['class'] = 'custom-control-input'


class InitialRequestForm(MainForm):
    cores = forms.IntegerField(label='CPU', min_value=1, max_value=48, initial=1)
    memory = forms.IntegerField(label='RAM', min_value=2, max_value=200, initial=2)
    storage = forms.IntegerField(label='Storage', min_value=100, max_value=10000, initial=100)
    pricing_name = forms.CharField(required=True)

class RequestDomainsNamesForm(MainForm):
    homeserver_name = forms.CharField(required=True, widget=forms.TextInput(attrs={'placeholder': 'Homeserver Name *'}))
    webclient_name = forms.CharField(required=True, widget=forms.TextInput(attrs={'placeholder': 'Webclient Name *'}))
    is_open_registration = forms.BooleanField(required=False, initial=False)

    def clean_homeserver_name(self):
        homeserver_name = self.cleaned_data['homeserver_name']
        if VMInstance.objects.filter(homeserver_domain=f"{homeserver_name}.matrix.ungleich.cloud").exists():
            raise ValidationError("homeserver name already exists")
        return homeserver_name
    
    def clean_webclient_name(self):
        webclient_name = self.cleaned_data['webclient_name']
        if VMInstance.objects.filter(webclient_domain=f"{webclient_name}.matrix.0co2.cloud").exists():
            raise ValidationError("webclient name already exists")
        return webclient_name

class RequestDomainsForm(MainForm):
    matrix_domain = DomainNameField(required=True, widget=forms.TextInput(attrs={'placeholder': 'Matrix Domain *'}))
    homeserver_domain = DomainNameField(required=True, widget=forms.TextInput(attrs={'placeholder': 'Homeserver Domain *'}))
    webclient_domain = DomainNameField(required=True, widget=forms.TextInput(attrs={'placeholder': 'Webclient Domain *'}))
    is_open_registration = forms.BooleanField(required=False, initial=False)

    def clean(self):
        homeserver_domain = self.cleaned_data.get('homeserver_domain', False)
        webclient_domain = self.cleaned_data.get('webclient_domain', False)
        if homeserver_domain and webclient_domain:
            # Homserver-Domain and Webclient-Domain cannot be below the same second level domain (i.e. homeserver.abc.ch and webclient.def.cloud are ok, 
            # homeserver.abc.ch and webclient.abc.ch are not ok
            homeserver_base = tldextract.extract(homeserver_domain).domain
            webclient_base = tldextract.extract(webclient_domain).domain
            if homeserver_base == webclient_base:
                self._errors['webclient_domain'] = self.error_class([
                    'Homserver-Domain and Webclient-Domain cannot be below the same second level domain'])
        return self.cleaned_data


class BillingAddressForm(MainModelForm):
    class Meta:
        model = BillingAddress
        fields = ['full_name', 'street',
                  'city', 'postal_code', 'country', 'vat_number', 'active', 'owner']


