
import os
import smtplib
from email.mime.text import MIMEText
from django.core.management.base import BaseCommand
from django.conf import settings
from notifications.email_service import EmailService


class Command(BaseCommand):
    help = 'Test email configuration in production'

    def add_arguments(self, parser):
        parser.add_argument(
            '--email',
            type=str,
            help='Test email address to send to',
            default='test@example.com'
        )
        parser.add_argument(
            '--detailed',
            action='store_true',
            help='Show detailed configuration and test raw SMTP',
        )

    def handle(self, *args, **options):
        test_email = options['email']
        detailed = options['detailed']

        self.stdout.write(
            self.style.SUCCESS('=== Email Configuration Test ===')
        )

        # Show current configuration
        self.stdout.write(f"EMAIL_HOST: {getattr(settings, 'EMAIL_HOST', 'Not set')}")
        self.stdout.write(f"EMAIL_PORT: {getattr(settings, 'EMAIL_PORT', 'Not set')}")
        self.stdout.write(f"EMAIL_USE_TLS: {getattr(settings, 'EMAIL_USE_TLS', 'Not set')}")
        self.stdout.write(f"EMAIL_HOST_USER: {getattr(settings, 'EMAIL_HOST_USER', 'Not set')}")
        self.stdout.write(f"EMAIL_HOST_PASSWORD: {'Set' if getattr(settings, 'EMAIL_HOST_PASSWORD', '') else 'Not set'}")
        self.stdout.write(f"DEFAULT_FROM_EMAIL: {getattr(settings, 'DEFAULT_FROM_EMAIL', 'Not set')}")

        # Environment variables
        self.stdout.write("\n=== Environment Variables ===")
        self.stdout.write(f"EMAIL_HOST: {os.environ.get('EMAIL_HOST', 'Not set')}")
        self.stdout.write(f"EMAIL_HOST_USER: {os.environ.get('EMAIL_HOST_USER', 'Not set')}")
        self.stdout.write(f"EMAIL_HOST_PASSWORD: {'Set' if os.environ.get('EMAIL_HOST_PASSWORD', '') else 'Not set'}")

        # Database email settings
        self.stdout.write("\nDatabase email settings:")
        try:
            from settings.models import SystemSettings
            email_settings = SystemSettings.objects.filter(category='email')
            for setting in email_settings:
                if 'PASSWORD' in setting.key:
                    self.stdout.write(f"{setting.key}: {'Set' if setting.value else 'Not set'}")
                else:
                    self.stdout.write(f"{setting.key}: {setting.value}")
        except Exception as e:
            self.stdout.write(f"Could not fetch database settings: {e}")

        if detailed:
            # Test raw SMTP connection
            self.stdout.write("\n=== Testing Raw SMTP Connection ===")
            try:
                server = smtplib.SMTP(settings.EMAIL_HOST, settings.EMAIL_PORT)
                server.set_debuglevel(1)
                server.starttls()
                server.login(settings.EMAIL_HOST_USER, settings.EMAIL_HOST_PASSWORD)
                
                msg = MIMEText("Test email from production server")
                msg['Subject'] = 'Production SMTP Test'
                msg['From'] = settings.EMAIL_HOST_USER
                msg['To'] = test_email
                
                server.send_message(msg)
                server.quit()
                
                self.stdout.write(
                    self.style.SUCCESS('✅ Raw SMTP test successful!')
                )
            except Exception as e:
                self.stdout.write(
                    self.style.ERROR(f'❌ Raw SMTP test failed: {e}')
                )

        # Test using EmailService
        self.stdout.write("\n=== Testing EmailService ===")
        try:
            email_service = EmailService()
            success, error_msg = email_service.send_test_email(
                recipient_email=test_email,
                sent_by=None
            )
            
            if success:
                self.stdout.write(
                    self.style.SUCCESS(f'✅ EmailService test successful! Email sent to {test_email}')
                )
            else:
                self.stdout.write(
                    self.style.ERROR(f'❌ EmailService test failed: {error_msg}')
                )
        except Exception as e:
            self.stdout.write(
                self.style.ERROR(f'❌ EmailService test failed with exception: {e}')
            )

        # Check email logs
        self.stdout.write("\n=== Recent Email Logs ===")
        try:
            from notifications.models import EmailLog
            recent_logs = EmailLog.objects.order_by('-sent_at')[:5]
            for log in recent_logs:
                status_icon = '✅' if log.status == 'sent' else '❌'
                self.stdout.write(f"{status_icon} {log.sent_at} - {log.recipient_email} - {log.status}")
                if log.error_message:
                    self.stdout.write(f"   Error: {log.error_message}")
        except Exception as e:
            self.stdout.write(f"Could not fetch email logs: {e}")

        self.stdout.write("\n=== Recommendations ===")
        if not settings.EMAIL_HOST_USER:
            self.stdout.write("• Set EMAIL_HOST_USER environment variable")
        if not settings.EMAIL_HOST_PASSWORD:
            self.stdout.write("• Set EMAIL_HOST_PASSWORD environment variable")
        self.stdout.write("• For Gmail, use App Passwords instead of regular password")
        self.stdout.write("• Check firewall settings allow SMTP connections on port 587")
        self.stdout.write("• Verify SMTP server allows connections from your server IP")
