<?php

declare(strict_types=1);

namespace App\Models;

use Illuminate\Database\QueryException;
use Laravel\Sanctum\PersonalAccessToken as SanctumPersonalAccessToken;

/**
 * Расширение Sanctum PersonalAccessToken.
 *
 * Перехватывает Bearer-токены с префиксом «lpimp_» (машинные ключи
 * impersonation-guard, G7-B) и возвращает null без обращения к БД.
 * Это предотвращает crash при отсутствии таблицы personal_access_tokens
 * (проект использует SPA cookie-auth, таблица не создаётся).
 */
class PersonalAccessToken extends SanctumPersonalAccessToken
{
    /**
     * Find the token instance matching the given token.
     *
     * Returns null immediately for impersonation machine-key tokens so
     * Sanctum does not attempt a DB lookup on personal_access_tokens.
     */
    public static function findToken($token): ?static
    {
        if (str_starts_with((string) $token, 'lpimp_')) {
            return null;
        }

        // В проекте нет таблицы personal_access_tokens (SPA cookie-auth, Sanctum
        // PAT не используются). Без этого try/catch любой иной Bearer на
        // sanctum-роуте ронял бы запрос в 500 (Undefined table) вместо чистого
        // 401. Гасим QueryException до null — guard вернёт 401.
        try {
            return parent::findToken($token);
        } catch (QueryException) {
            return null;
        }
    }
}
