from django.core.mail import EmailMultiAlternatives
from django.conf import settings
from .models import SystemSettings
from django.template.loader import render_to_string
from django.utils.html import strip_tags
import logging

logger = logging.getLogger(__name__)

def get_email_settings():
    """Get email settings from SystemSettings or fallback to Django settings"""
    try:
        settings_dict = {}
        email_settings = SystemSettings.objects.filter(category='email')

        for setting in email_settings:
            settings_dict[setting.key] = setting.value

        return {
            'host': settings_dict.get('HOST', getattr(settings, 'EMAIL_HOST', 'smtp.gmail.com')),
            'port': int(settings_dict.get('PORT', getattr(settings, 'EMAIL_PORT', 587))),
            'username': settings_dict.get('HOST_USER', getattr(settings, 'EMAIL_HOST_USER', '')),
            'password': settings_dict.get('HOST_PASSWORD', getattr(settings, 'EMAIL_HOST_PASSWORD', '')),
            'use_tls': settings_dict.get('USE_TLS', 'true').lower() in ['true', '1', 'yes']
        }
    except Exception as e:
        logger.error(f"Error getting email settings: {e}")
        return {
            'host': getattr(settings, 'EMAIL_HOST', 'smtp.gmail.com'),
            'port': getattr(settings, 'EMAIL_PORT', 587),
            'username': getattr(settings, 'EMAIL_HOST_USER', ''),
            'password': getattr(settings, 'EMAIL_HOST_PASSWORD', ''),
            'use_tls': True
        }

def get_sms_settings():
    """Get SMS settings from SystemSettings"""
    try:
        settings_dict = {}
        sms_settings = SystemSettings.objects.filter(category='sms')

        for setting in sms_settings:
            settings_dict[setting.key.lower()] = setting.value

        return {
            'api_key': settings_dict.get('api_key', ''),
            'api_url': settings_dict.get('api_url', ''),
            'partner_id': settings_dict.get('partner_id', ''),
            'short_code': settings_dict.get('short_code', ''),
            'method': settings_dict.get('method', 'POST'),
            'phone_parameter': settings_dict.get('phone_parameter', 'mobile'),
            'message_parameter': settings_dict.get('message_parameter', 'message')
        }
    except Exception as e:
        logger.error(f"Error getting SMS settings: {e}")
        return {}

def send_invitation_email(user_type, instance, request):
    """
    Send invitation email using the new email service
    """
    from notifications.email_service import EmailService
    from customers.models import CustomerInvitation
    from hr.models import EmployeeInvitation

    email_service = EmailService()

    if user_type == 'customer':
        # Create or get invitation
        invitation, created = CustomerInvitation.objects.get_or_create(
            customer=instance,
            defaults={'customer': instance}
        )

        if not created and not invitation.is_valid:
            # Create new invitation if old one is expired or used
            invitation.delete()
            invitation = CustomerInvitation.objects.create(customer=instance)

        invitation_url = request.build_absolute_uri(f'/customers/setup-account/{invitation.token}/')

        return email_service.send_invitation_email(
            user_type='customer',
            instance=instance,
            invitation_url=invitation_url
        )

    elif user_type == 'employee':
        # Create or get invitation
        invitation, created = EmployeeInvitation.objects.get_or_create(
            employee=instance,
            defaults={'employee': instance}
        )

        if not created and not invitation.is_valid:
            invitation.delete()
            invitation = EmployeeInvitation.objects.create(employee=instance)

        invitation_url = request.build_absolute_uri(f'/hr/setup-account/{invitation.token}/')

        return email_service.send_invitation_email(
            user_type='employee',
            instance=instance,
            invitation_url=invitation_url
        )

    return False, "Invalid user type"

def send_password_reset_email(user, reset_url, sent_by=None):
    """Send password reset email using the new email service"""
    from notifications.email_service import EmailService

    email_service = EmailService()
    return email_service.send_password_reset_email(user, reset_url, sent_by)

def send_configured_email(subject, message, recipient_list, from_email=None, html_message=None, email_type='general', recipient_name='', sent_by=None):
    """
    Send email using the new email service (backwards compatibility)
    """
    from notifications.email_service import EmailService

    email_service = EmailService()

    success_count = 0
    for recipient in recipient_list:
        success, error_msg = email_service.send_email(
            recipient_email=recipient,
            subject=subject,
            content=message,
            email_type=email_type,
            recipient_name=recipient_name,
            sent_by=sent_by,
            html_content=html_message
        )
        if success:
            success_count += 1
        else:
            logger.error(f"Failed to send email to {recipient}: {error_msg}")

    return success_count > 0

def send_email_with_settings(subject, message, recipient_list, html_message=None, from_email=None):
    """Send email using configured settings (backwards compatibility)"""
    return send_configured_email(subject, message, recipient_list, from_email, html_message)

def get_callback_base_url():
    """Get the callback base URL for M-Pesa and other external services"""
    # Always use production domain
    return 'https://system.optinet.co.ke'