"""
خدمة إرسال البريد الإلكتروني
Email Service for sending alerts and notifications
"""

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from typing import Optional, List
from datetime import datetime
import logging

from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy import select

from app.models.settings import TenantSettings
from app.templates.email_templates import (
    get_alert_email_template,
    get_daily_report_template,
    get_device_offline_template,
    get_alert_resolved_template
)

logger = logging.getLogger(__name__)


class EmailService:
    """خدمة إرسال البريد الإلكتروني"""
    
    def __init__(self, settings: TenantSettings):
        self.smtp_host = settings.smtp_host
        self.smtp_port = settings.smtp_port
        self.smtp_username = settings.smtp_username
        self.smtp_password = settings.smtp_password
        self.smtp_from_email = settings.smtp_from_email or settings.smtp_username
        self.smtp_from_name = settings.smtp_from_name or "SmartLife"
        self.smtp_use_tls = settings.smtp_use_tls
        self.smtp_use_ssl = settings.smtp_use_ssl
        self.enabled = settings.smtp_enabled
    
    def _create_message(self, to_email: str, subject: str, html_body: str) -> MIMEMultipart:
        """إنشاء رسالة البريد الإلكتروني"""
        msg = MIMEMultipart('alternative')
        msg['From'] = f"{self.smtp_from_name} <{self.smtp_from_email}>"
        msg['To'] = to_email
        msg['Subject'] = subject
        
        # إضافة النص HTML
        html_part = MIMEText(html_body, 'html', 'utf-8')
        msg.attach(html_part)
        
        return msg
    
    def _send_email(self, to_email: str, subject: str, html_body: str) -> bool:
        """إرسال البريد الإلكتروني"""
        logger.info(f"=== Attempting to send email to {to_email} ===")
        logger.info(f"SMTP enabled: {self.enabled}")
        logger.info(f"SMTP host: {self.smtp_host}, port: {self.smtp_port}")
        logger.info(f"SMTP user: {self.smtp_username}")
        logger.info(f"SMTP password set: {bool(self.smtp_password)}")
        logger.info(f"Use TLS: {self.smtp_use_tls}, Use SSL: {self.smtp_use_ssl}")
        
        if not self.enabled:
            logger.warning("SMTP is not enabled - email not sent")
            return False
        
        if not self.smtp_host or not self.smtp_username or not self.smtp_password:
            logger.error(f"SMTP settings incomplete - host: {bool(self.smtp_host)}, user: {bool(self.smtp_username)}, pass: {bool(self.smtp_password)}")
            return False
        
        try:
            msg = self._create_message(to_email, subject, html_body)
            logger.info(f"Connecting to SMTP server {self.smtp_host}:{self.smtp_port}...")
            
            if self.smtp_use_ssl:
                server = smtplib.SMTP_SSL(self.smtp_host, self.smtp_port, timeout=30)
            else:
                server = smtplib.SMTP(self.smtp_host, self.smtp_port, timeout=30)
                if self.smtp_use_tls:
                    logger.info("Starting TLS...")
                    server.starttls()
            
            logger.info("Logging in to SMTP server...")
            server.login(self.smtp_username, self.smtp_password)
            logger.info("Sending message...")
            server.send_message(msg)
            server.quit()
            
            logger.info(f"✓ Email sent successfully to {to_email}")
            return True
            
        except smtplib.SMTPAuthenticationError as e:
            print(f"❌ SMTP authentication failed: {e}", flush=True)
            logger.error(f"SMTP authentication failed: {e}")
            raise Exception(f"فشل في المصادقة - تحقق من كلمة المرور")
        except smtplib.SMTPConnectError as e:
            print(f"❌ SMTP connection failed: {e}", flush=True)
            logger.error(f"SMTP connection failed: {e}")
            raise Exception(f"فشل في الاتصال بخادم SMTP")
        except Exception as e:
            print(f"❌ Failed to send email: {e}", flush=True)
            logger.error(f"Failed to send email: {e}")
            import traceback
            logger.error(traceback.format_exc())
            raise Exception(f"خطأ في إرسال الإيميل: {str(e)}")
    
    def send_alert_email(
        self,
        to_emails: List[str],
        alert_type: str,
        device_name: str,
        device_id: str,
        reading_type: str,
        current_value: float,
        threshold_value: float,
        condition: str,
        severity: str,
        location: Optional[str] = None,
        dashboard_url: str = "https://smart-life.online"
    ) -> int:
        """إرسال إيميل تنبيه"""
        html_body = get_alert_email_template(
            alert_type=alert_type,
            device_name=device_name,
            device_id=device_id,
            reading_type=reading_type,
            current_value=current_value,
            threshold_value=threshold_value,
            condition=condition,
            severity=severity,
            location=location,
            timestamp=datetime.now(),
            dashboard_url=dashboard_url
        )
        
        severity_labels = {
            "critical": "حرج",
            "high": "عالي",
            "medium": "متوسط",
            "low": "منخفض"
        }
        
        subject = f"⚠️ تنبيه SmartLife [{severity_labels.get(severity, severity)}] - {device_name}"
        
        sent_count = 0
        for email in to_emails:
            # سيرمي exception إذا فشل الإرسال
            if self._send_email(email.strip(), subject, html_body):
                sent_count += 1
        
        return sent_count
    
    def send_device_offline_email(
        self,
        to_emails: List[str],
        device_name: str,
        device_id: str,
        last_seen: str,
        location: Optional[str] = None
    ) -> int:
        """إرسال إيميل جهاز غير متصل"""
        html_body = get_device_offline_template(
            device_name=device_name,
            device_id=device_id,
            last_seen=last_seen,
            location=location
        )
        
        subject = f"🔴 SmartLife - جهاز غير متصل: {device_name}"
        
        sent_count = 0
        for email in to_emails:
            if self._send_email(email.strip(), subject, html_body):
                sent_count += 1
        
        return sent_count
    
    def send_alert_resolved_email(
        self,
        to_emails: List[str],
        device_name: str,
        device_id: str,
        reading_type: str,
        current_value: float
    ) -> int:
        """إرسال إيميل حل التنبيه"""
        html_body = get_alert_resolved_template(
            device_name=device_name,
            device_id=device_id,
            reading_type=reading_type,
            current_value=current_value,
            resolved_at=datetime.now()
        )
        
        subject = f"✅ SmartLife - تم حل التنبيه: {device_name}"
        
        sent_count = 0
        for email in to_emails:
            if self._send_email(email.strip(), subject, html_body):
                sent_count += 1
        
        return sent_count
    
    def send_daily_report_email(
        self,
        to_emails: List[str],
        tenant_name: str,
        total_devices: int,
        online_devices: int,
        total_alerts: int,
        critical_alerts: int,
        device_summary: list
    ) -> int:
        """إرسال التقرير اليومي"""
        date = datetime.now().strftime("%Y-%m-%d")
        
        html_body = get_daily_report_template(
            tenant_name=tenant_name,
            date=date,
            total_devices=total_devices,
            online_devices=online_devices,
            total_alerts=total_alerts,
            critical_alerts=critical_alerts,
            device_summary=device_summary
        )
        
        subject = f"📊 SmartLife - التقرير اليومي: {date}"
        
        sent_count = 0
        for email in to_emails:
            if self._send_email(email.strip(), subject, html_body):
                sent_count += 1
        
        return sent_count


async def get_email_service(tenant_id: str, db: AsyncSession) -> Optional[EmailService]:
    """الحصول على خدمة البريد الإلكتروني للمستأجر"""
    from uuid import UUID
    
    result = await db.execute(
        select(TenantSettings).where(TenantSettings.tenant_id == UUID(tenant_id))
    )
    settings = result.scalar_one_or_none()
    
    if not settings or not settings.smtp_enabled:
        return None
    
    return EmailService(settings)
