setReplyTo($rtEmail, $rtName); } } catch (\Throwable $e) { // Ignore; ensure service is still usable even if headers not yet setable } return $email; } public static function PHPMailer(bool $getShared = true) { if ($getShared) { return static::getSharedInstance('PHPMailer'); } $mail = new PHPMailer(true); // Set up your PHPMailer configuration $mail->isSMTP(); $mail->Host = 'smtp.gmail.com'; // Your SMTP host $mail->SMTPAuth = true; $mail->Username = 'alrahma.sunday.school@gmail.com'; // Your email $mail->Password = 'psnp emdq dykw ypul'; // Your email password $mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS; $mail->Port = 465; $mail->Timeout = 10; // ⏱ 10-second timeout max $mail->SMTPKeepAlive = false; // Prevent hanging connections $mail->SMTPDebug = 0; // Set to 2 temporarily for debugging $mail->SMTPDebug = 2; // You can set it to 1, 2, or 3 for increasing verbosity $mail->Debugoutput = 'html'; // You can output it to 'html' or 'error_log' return $mail; } /** * Build (or fetch a shared) SemesterScoreService instance. * * Usage: * $svc = service('semesterScoreService'); // shared * $svc = \Config\Services::semesterScoreService(); // shared * $svc = \Config\Services::semesterScoreService(false); // NEW instance (not shared) */ public static function semesterScoreService(bool $getShared = true): SemesterScoreService { if ($getShared) { return static::getSharedInstance('semesterScoreService'); } // Core models $scoreModel = new SemesterScoreModel(); $configModel = new ConfigurationModel(); // Calculators (inject their models) $homeworkCalc = new HomeworkCalculator(new HomeworkModel()); $quizCalc = new QuizCalculator(new QuizModel()); $projectCalc = new ProjectCalculator(new ProjectModel()); $attendanceCalc = new AttendanceCalculator( new AttendanceRecordModel(), new ConfigurationModel(), new CalendarModel() ); // If you later add Midterm/Final/Participation calculators, plug them in here. return new SemesterScoreService( $scoreModel, $configModel, $homeworkCalc, $quizCalc, $projectCalc, $attendanceCalc ); } public static function roleService($getShared = true) { if ($getShared) { return static::getSharedInstance('roleService'); } return new \App\Services\RoleService(); } public static function emailService($getShared = true) { if ($getShared) { return static::getSharedInstance('emailService'); } // Replace with your real EmailService class + constructor args return new \App\Services\EmailService(); } /** * TimeService shared builder (timezone detection + conversions). */ public static function timeService(bool $getShared = true): \App\Services\TimeService { if ($getShared) { return static::getSharedInstance('timeService'); } return new \App\Services\TimeService(); } /** * Shared API client for outbound HTTP to external services. */ public static function apiClient(bool $getShared = true): \App\Services\ApiClient { if ($getShared) { return static::getSharedInstance('apiClient'); } $apiConfig = config('Api'); $options = [ 'baseURI' => $apiConfig->baseURL ?: null, 'timeout' => $apiConfig->timeout, 'headers' => $apiConfig->defaultHeaders, ]; // Remove null/empty values that may cause issues $options = array_filter($options, static function ($v) { return $v !== null && $v !== ''; }); $http = static::curlrequest($options); return new \App\Services\ApiClient($http, $apiConfig); } }