<?php

declare(strict_types=1);

namespace App\Support;

use Illuminate\Database\QueryException;

/**
 * report() sin datos del cobro. El mensaje de una QueryException trae el SQL
 * con todos los valores enlazados (payload, GPS, device_id) y el scrubbing
 * de Sentry solo limpia request.data; además Sentry manda las excepciones
 * encadenadas. Por eso, si en la cadena hay una QueryException, se reporta
 * una excepción NUEVA, sin previa, con solo la clase y los códigos.
 */
final class SafeReport
{
    public static function report(\Throwable $e): void
    {
        for ($link = $e; $link !== null; $link = $link->getPrevious()) {
            if ($link instanceof QueryException) {
                // getSql() trae los "?" sin valores; con el archivo y la línea de
                // origen el error se puede diagnosticar sin exponer el cobro.
                report(new \RuntimeException(sprintf(
                    '%s SQLSTATE[%s] driver_code=%s en %s:%d — %s (datos del cobro omitidos)',
                    $e::class,
                    (string) ($link->errorInfo[0] ?? $link->getCode()),
                    (string) ($link->errorInfo[1] ?? 'null'),
                    $e->getFile(),
                    $e->getLine(),
                    $link->getSql(),
                )));

                return;
            }
        }

        report($e);
    }
}
