"""
Email Provider using SMTP.
"""
import logging
import re
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

from django.conf import settings
from django.core.mail import send_mail

from . import BaseNotificationProvider, ProviderResponse
from ..models import NotificationChannel

logger = logging.getLogger('notification.email')


class EmailProvider(BaseNotificationProvider):
    """
    Email notification provider using Django's email backend.
    """
    
    channel = NotificationChannel.EMAIL
    
    def __init__(self):
        self.from_email = getattr(settings, 'DEFAULT_FROM_EMAIL', None)
        self.email_host = getattr(settings, 'EMAIL_HOST', None)
        
        if not self.from_email:
            logger.warning("DEFAULT_FROM_EMAIL not configured")
        if not self.email_host:
            logger.warning("EMAIL_HOST not configured")
    
    def send(
        self,
        recipient: str,
        content: str,
        subject: str | None = None,
        **kwargs
    ) -> ProviderResponse:
        """
        Send email via Django's email backend.
        
        Args:
            recipient: Email address
            content: Email body (HTML supported)
            subject: Email subject
            html_content: Optional HTML content (if different from content)
            
        Returns:
            ProviderResponse with send status
        """
        if not self.from_email or not self.email_host:
            return ProviderResponse(
                success=False,
                error="Email provider not configured"
            )
        
        if not self.validate_recipient(recipient):
            return ProviderResponse(
                success=False,
                error=f"Invalid email format: {recipient}"
            )
        
        subject = subject or "Notification"
        html_content = kwargs.get('html_content', content)
        
        try:
            # Use Django's send_mail for simplicity
            sent = send_mail(
                subject=subject,
                message=content,  # Plain text fallback
                from_email=self.from_email,
                recipient_list=[recipient],
                html_message=html_content,  # HTML version
                fail_silently=False,
            )
            
            if sent:
                logger.info(f"Email sent successfully to {recipient}")
                return ProviderResponse(
                    success=True,
                    message_id=f"email_{recipient}_{hash(content) % 10000}",
                    raw_response={"sent_count": sent}
                )
            else:
                return ProviderResponse(
                    success=False,
                    error="Email send returned 0"
                )
                
        except smtplib.SMTPException as e:
            logger.exception(f"SMTP error sending email to {recipient}: {e}")
            return ProviderResponse(
                success=False,
                error=f"SMTP error: {str(e)}"
            )
        except Exception as e:
            logger.exception(f"Email send failed to {recipient}: {e}")
            return ProviderResponse(
                success=False,
                error=str(e)
            )
    
    def validate_recipient(self, recipient: str) -> bool:
        """
        Validate email address format.
        """
        if not recipient:
            return False
        
        # Basic email regex pattern
        pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
        return bool(re.match(pattern, recipient))
