# apps/reviews/email_service.py
from django.core.mail import send_mail
from django.template.loader import render_to_string
from django.utils.html import strip_tags
from django.conf import settings
from django.core.mail import get_connection
import logging
import smtplib

logger = logging.getLogger(__name__)

class ReviewEmailService:
    """
    Service class for sending review-related emails
    """
    
    @staticmethod
    def test_email_connection():
        """
        Test email connection and configuration
        Returns: (success: bool, message: str)
        """
        try:
            connection = get_connection()
            connection.open()
            connection.close()
            return True, "Email connection successful"
        except smtplib.SMTPAuthenticationError as e:
            return False, f"SMTP Authentication Error: {str(e)} - Check username/password"
        except smtplib.SMTPConnectError as e:
            return False, f"SMTP Connection Error: {str(e)} - Check host/port"
        except smtplib.SMTPException as e:
            return False, f"SMTP Error: {str(e)}"
        except Exception as e:
            return False, f"General Error: {str(e)}"
    
    @staticmethod
    def send_review_link_email(review_link, company_name=None):
        """
        Send review link email to customer
        
        Args:
            review_link: ReviewLink instance
            company_name: Optional company name for personalization
            
        Returns:
            bool: True if email sent successfully, False otherwise
        """
        try:
            # First test the connection
            connection_success, connection_message = ReviewEmailService.test_email_connection()
            if not connection_success:
                logger.error(f"Email connection test failed: {connection_message}")
                return False
            
            # Email context - get base_url from Django settings (loaded by python-decouple)
            base_url = getattr(settings, 'FRONTEND_URL')
            context = {
                'customer_email': review_link.customer_email,
                'tour_name': review_link.tour.name,
                'tour_date': review_link.tour.date,
                'review_link': f"{base_url}/review/{review_link.token_str}",
                'company_name': company_name or "Your Tour Company",
                'expires_at': review_link.expires_at,
            }
            
            # Log email configuration (without sensitive data)
            logger.info(f"Attempting to send email to {review_link.customer_email}")
            logger.info(f"Email Host: {getattr(settings, 'EMAIL_HOST', 'Not configured')}")
            logger.info(f"Email Port: {getattr(settings, 'EMAIL_PORT', 'Not configured')}")
            logger.info(f"From Email: {getattr(settings, 'DEFAULT_FROM_EMAIL', 'Not configured')}")
            
            # Try to render templates first
            try:
                html_message = render_to_string('emails/review_link.html', context)
                plain_message = render_to_string('emails/review_link.txt', context)
            except Exception as template_error:
                logger.error(f"Template rendering failed: {str(template_error)}")
                # Fallback to simple message
                plain_message = f"""
Hello,

Please share your experience about {context['tour_name']} on {context['tour_date']}.

Click here to leave your review: {context['review_link']}

This link will expire on {context['expires_at']}.

Thank you!
{context['company_name']}
                """.strip()
                html_message = plain_message.replace('\n', '<br>')
            
            # Send email with more detailed error handling
            result = send_mail(
                subject=f"Share Your Experience - {context['tour_name']}",
                message=plain_message,
                from_email=getattr(settings, 'DEFAULT_FROM_EMAIL', 'noreply@example.com'),
                recipient_list=[review_link.customer_email],
                html_message=html_message,
                fail_silently=False,
            )
            
            if result == 1:  # send_mail returns 1 for success
                logger.info(f"✅ Review link email sent successfully to {review_link.customer_email} for tour {review_link.tour.id}")
                return True
            else:
                logger.error(f"❌ send_mail returned {result} for {review_link.customer_email}")
                return False
            
        except smtplib.SMTPAuthenticationError as e:
            logger.error(f"SMTP Authentication Error sending to {review_link.customer_email}: {str(e)}")
            logger.error("Check your EMAIL_HOST_USER and EMAIL_HOST_PASSWORD settings")
            return False
        except smtplib.SMTPRecipientsRefused as e:
            logger.error(f"SMTP Recipients Refused for {review_link.customer_email}: {str(e)}")
            return False
        except smtplib.SMTPConnectError as e:
            logger.error(f"SMTP Connection Error: {str(e)}")
            logger.error("Check your EMAIL_HOST and EMAIL_PORT settings")
            return False
        except smtplib.SMTPException as e:
            logger.error(f"SMTP Error sending to {review_link.customer_email}: {str(e)}")
            return False
        except Exception as e:
            logger.error(f"General error sending review link email to {review_link.customer_email}: {str(e)}")
            import traceback
            logger.error(traceback.format_exc())
            return False