""" Email configuration data transfer objects for type-safe email operations. """ from dataclasses import dataclass, field from typing import Optional, Dict, Any, List from enum import Enum class EmailTemplate(Enum): """Email template constants.""" BRANDED_BASE = "emails/email_template.html" INTERVIEW_INVITATION = "emails/interview_invitation.html" INTERVIEW_INVITATION_ALT = "interviews/email/interview_invitation.html" AGENCY_WELCOME = "recruitment/emails/agency_welcome.html" ASSIGNMENT_NOTIFICATION = "recruitment/emails/assignment_notification.html" JOB_REMINDER = "emails/job_reminder.html" REJECTION_SCREENING = "emails/rejection_screening_draft.html" class EmailPriority(Enum): """Email priority levels for queue management.""" LOW = "low" NORMAL = "normal" HIGH = "high" URGENT = "urgent" @dataclass class EmailConfig: """Configuration for sending a single email.""" to_email: str subject: str template_name: Optional[str] = None context: Dict[str, Any] = field(default_factory=dict) html_content: Optional[str] = None attachments: List = field(default_factory=list) sender: Optional[Any] = None job: Optional[Any] = None priority: EmailPriority = EmailPriority.NORMAL cc_emails: List[str] = field(default_factory=list) bcc_emails: List[str] = field(default_factory=list) reply_to: Optional[str] = None def __post_init__(self): """Validate email configuration.""" if not self.to_email: raise ValueError("to_email is required") if not self.subject: raise ValueError("subject is required") if not self.template_name and not self.html_content: raise ValueError("Either template_name or html_content must be provided") @dataclass class BulkEmailConfig: """Configuration for bulk email sending.""" subject: str template_name: Optional[str] = None recipients_data: List[Dict[str, Any]] = field(default_factory=list) attachments: List = field(default_factory=list) sender: Optional[Any] = None job: Optional[Any] = None priority: EmailPriority = EmailPriority.NORMAL async_send: bool = True def __post_init__(self): """Validate bulk email configuration.""" if not self.subject: raise ValueError("subject is required") if not self.recipients_data: raise ValueError("recipients_data cannot be empty") @dataclass class EmailResult: """Result of email sending operation.""" success: bool message: str recipient_count: int = 0 error_details: Optional[str] = None task_id: Optional[str] = None async_operation: bool = False