<?php

declare(strict_types=1);

namespace App\Services\Pd;

use App\Mail\ImpersonationEndedMail;
use App\Models\ImpersonationToken;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Mail;

/**
 * Завершение impersonation-сессии (G7-B / Ю-1).
 *
 * Выделено из middleware ImpersonationContext: слой Middleware не должен зависеть
 * от слоя Mail (deptrac ruleset). Отправку письма делает Service-слой, которому
 * зависимость на Mail разрешена.
 */
final class ImpersonationExpiryService
{
    /**
     * Завершает активную сессию: ставит session_ended_at и шлёт клиенту письмо.
     * Идемпотентно — уже завершённая сессия не трогается и письмо не дублируется.
     */
    public function endSession(ImpersonationToken $token): void
    {
        if ($token->session_ended_at !== null) {
            return;
        }

        $token->update(['session_ended_at' => now()]);

        try {
            Mail::to((string) $token->sent_to_email)
                ->queue(new ImpersonationEndedMail((string) $token->sent_to_email));
        } catch (\Throwable $e) {
            Log::warning('impersonation expiry mail: '.$e->getMessage());
        }
    }
}
