<?php

namespace App\Services;

use App\Models\CompanySetting;
use Illuminate\Support\Facades\Config;

class TenantMailConfig
{
    /**
     * Run a callback with mail config overridden by the given company's stored settings.
     */
    public static function applyForCompany(int $companyId, callable $callback): mixed
    {
        $settings = CompanySetting::withoutGlobalScopes()
            ->where('company_id', $companyId)
            ->whereIn('key', [
                'mail_mailer', 'mail_from_name', 'mail_from_address',
                'mail_host', 'mail_port', 'mail_encryption', 'mail_username', 'mail_password', 'mail_queue',
            ])
            ->pluck('value', 'key');

        if ($settings->isEmpty()) {
            return $callback();
        }

        $original = [
            'default' => Config::get('mail.default'),
            'from' => Config::get('mail.from'),
            'mailers.smtp' => Config::get('mail.mailers.smtp'),
        ];

        try {
            if ($mailer = $settings->get('mail_mailer')) {
                Config::set('mail.default', $mailer);
            }
            if ($settings->has('mail_from_name') || $settings->has('mail_from_address')) {
                Config::set('mail.from', [
                    'address' => $settings->get('mail_from_address', config('mail.from.address')),
                    'name' => $settings->get('mail_from_name', config('mail.from.name')),
                ]);
            }
            $smtp = config('mail.mailers.smtp', []);
            if ($settings->get('mail_host') !== null) {
                $smtp['host'] = $settings->get('mail_host');
            }
            if ($settings->get('mail_port') !== null) {
                $smtp['port'] = $settings->get('mail_port');
            }
            if ($settings->get('mail_encryption') !== null) {
                $smtp['encryption'] = $settings->get('mail_encryption') === 'null' ? null : $settings->get('mail_encryption');
            }
            if ($settings->get('mail_username') !== null) {
                $smtp['username'] = $settings->get('mail_username');
            }
            if ($settings->get('mail_password') !== null) {
                $smtp['password'] = $settings->get('mail_password');
            }
            Config::set('mail.mailers.smtp', $smtp);

            return $callback();
        } finally {
            Config::set('mail.default', $original['default']);
            Config::set('mail.from', $original['from']);
            Config::set('mail.mailers.smtp', $original['mailers.smtp']);
        }
    }
}
