from django import forms
from cms.form_optimization import (
    FormOptimizationMixin,
    OptimizedFormWidget,
    OptimizedEmailWidget,
    OptimizedPhoneWidget,
    OptimizedTextareaWidget,
    FormFieldOptimizer,
)

DISPOSABLE_EMAIL_DOMAINS = {
    '10minutemail.com',
    'mailinator.com',
    'guerrillamail.com',
    'temp-mail.org',
    'tempmail.com',
    'throwawaymail.com',
    'yopmail.com',
    'dispostable.com',
    'sharklasers.com',
    'grr.la',
    'maildrop.cc',
    'mohmal.com',
    'getnada.com',
    'fakeinbox.com',
    'trashmail.com',
    'tempmailo.com',
    'mytemp.email',
}


class ContactForm(FormOptimizationMixin, forms.Form):
    """Optimized contact form for conversions with minimal fields (3-5 fields)"""
    
    name = forms.CharField(
        max_length=100,
        required=True,
        widget=OptimizedFormWidget(attrs={
            'placeholder': 'Your Name',
            'autocomplete': 'name',
        })
    )
    email = forms.EmailField(
        required=True,
        widget=OptimizedEmailWidget(attrs={
            'placeholder': 'your@email.com',
        })
    )
    phone = forms.CharField(
        max_length=20,
        required=False,
        widget=OptimizedPhoneWidget(attrs={
            'placeholder': '+44 (optional)',
        })
    )
    subject = forms.CharField(
        max_length=200,
        required=True,
        widget=OptimizedFormWidget(attrs={
            'placeholder': 'What can we help with?',
        })
    )
    message = forms.CharField(
        widget=OptimizedTextareaWidget(attrs={
            'placeholder': 'Tell us more about your needs...',
        }),
        required=True
    )

    def clean_name(self):
        name = self.cleaned_data.get('name')
        if len(name) < 2:
            raise forms.ValidationError("Name must be at least 2 characters long.")
        return name

    def clean_message(self):
        message = self.cleaned_data.get('message')
        if len(message) < 10:
            raise forms.ValidationError("Message must be at least 10 characters long.")
        return message

    def clean_email(self):
        email = (self.cleaned_data.get('email') or '').strip().lower()
        if '@' not in email:
            return email

        domain = email.split('@', 1)[1]
        if domain in DISPOSABLE_EMAIL_DOMAINS or any(
            domain.endswith(f".{d}") for d in DISPOSABLE_EMAIL_DOMAINS
        ):
            raise forms.ValidationError(
                "Please use your business or permanent email address."
            )
        return email


class QuickQuoteForm(FormOptimizationMixin, forms.Form):
    """Ultra-minimal form for quick conversions (3 fields only)"""
    
    name = forms.CharField(
        max_length=100,
        required=True,
        widget=OptimizedFormWidget(attrs={
            'placeholder': 'Your Name',
            'autocomplete': 'name',
        })
    )
    email = forms.EmailField(
        required=True,
        widget=OptimizedEmailWidget(attrs={
            'placeholder': 'your@email.com',
        })
    )
    phone = forms.CharField(
        max_length=20,
        required=True,
        widget=OptimizedPhoneWidget(attrs={
            'placeholder': '+44 (required)',
        })
    )

    def clean_phone(self):
        phone = self.cleaned_data.get('phone')
        if len(phone) < 10:
            raise forms.ValidationError("Please enter a valid phone number.")
        return phone
