from django.core.mail import EmailMultiAlternatives from django.template.loader import render_to_string from django.conf import settings from django.utils import timezone import pytz from datetime import datetime class EmailService: @staticmethod def _format_datetime_for_user(dt, user_timezone='UTC'): if not dt: return '' try: user_tz = pytz.timezone(user_timezone or 'UTC') if timezone.is_naive(dt): dt = timezone.make_aware(dt, pytz.UTC) local_dt = dt.astimezone(user_tz) formatted = local_dt.strftime('%B %d, %Y at %I:%M %p %Z') return formatted except Exception as e: print(f"Error formatting datetime: {e}") return dt.strftime('%B %d, %Y at %I:%M %p UTC') @staticmethod def send_admin_notification(appointment): subject = f"New Appointment Request from {appointment.full_name}" context = { 'appointment': appointment, 'preferred_dates': appointment.get_preferred_dates_display(), 'preferred_times': appointment.get_preferred_time_slots_display(), 'admin_dashboard_url': "https://attunehearttherapy.com/admin/dashboard" } html_message = render_to_string('emails/admin_notification.html', context) admin_email = getattr(settings, 'ADMIN_EMAIL', 'admin@attunehearttherapy.com') try: email = EmailMultiAlternatives( subject=subject, body="Please view this email in an HTML-compatible client.", from_email=settings.DEFAULT_FROM_EMAIL, to=[admin_email], ) email.attach_alternative(html_message, "text/html") email.send(fail_silently=False) return True except Exception as e: print(f"Failed to send admin notification: {e}") return False @staticmethod def send_appointment_scheduled(appointment): subject = "Your Appointment Has Been Scheduled" user_timezone = getattr(appointment, 'user_timezone', 'UTC') formatted_datetime = EmailService._format_datetime_for_user( appointment.scheduled_datetime, user_timezone ) context = { 'appointment': appointment, 'scheduled_datetime': formatted_datetime, 'user_dashboard_url': f"{settings.FRONTEND_URL}/dashboard" if hasattr(settings, 'FRONTEND_URL') else '/dashboard/', 'settings': { 'SITE_NAME': getattr(settings, 'SITE_NAME', 'Attune Heart Therapy') } } html_message = render_to_string('emails/appointment_scheduled.html', context) try: email = EmailMultiAlternatives( subject=subject, body=f"Your appointment has been scheduled for {formatted_datetime}. Please view this email in an HTML-compatible client for more details.", from_email=settings.DEFAULT_FROM_EMAIL, to=[appointment.email], ) email.attach_alternative(html_message, "text/html") email.send(fail_silently=False) return True except Exception as e: print(f"Failed to send scheduled notification: {e}") return False @staticmethod def send_appointment_rejected(appointment): subject = "Update on Your Appointment Request" context = { 'appointment': appointment, 'rejection_reason': appointment.rejection_reason or "No specific reason provided.", 'user_dashboard_url': f"{settings.FRONTEND_URL}/dashboard" if hasattr(settings, 'FRONTEND_URL') else '/dashboard/', 'settings': { 'SITE_NAME': getattr(settings, 'SITE_NAME', 'Attune Heart Therapy') } } html_message = render_to_string('emails/appointment_rejected.html', context) try: email = EmailMultiAlternatives( subject=subject, body="Please view this email in an HTML-compatible client.", from_email=settings.DEFAULT_FROM_EMAIL, to=[appointment.email], ) email.attach_alternative(html_message, "text/html") email.send(fail_silently=False) return True except Exception as e: print(f"Failed to send rejection notification: {e}") return False @staticmethod def send_appointment_reminder(appointment, hours_before=24): subject = "Reminder: Your Upcoming Appointment" user_timezone = getattr(appointment, 'user_timezone', 'UTC') formatted_datetime = EmailService._format_datetime_for_user( appointment.scheduled_datetime, user_timezone ) context = { 'appointment': appointment, 'scheduled_datetime': formatted_datetime, 'hours_before': hours_before, 'join_url': appointment.get_participant_join_url() if hasattr(appointment, 'get_participant_join_url') else None, 'settings': { 'SITE_NAME': getattr(settings, 'SITE_NAME', 'Attune Heart Therapy') } } html_message = render_to_string('emails/appointment_reminder.html', context) try: email = EmailMultiAlternatives( subject=subject, body=f"This is a reminder that you have an appointment scheduled for {formatted_datetime}.", from_email=settings.DEFAULT_FROM_EMAIL, to=[appointment.email], ) email.attach_alternative(html_message, "text/html") email.send(fail_silently=False) return True except Exception as e: print(f"Failed to send reminder notification: {e}") return False