<?php

namespace App\Services\Api\Actions\Concerns;

use App\Models\Environments\Environment;
use Illuminate\Support\Facades\Log;

/**
 * Registro de los plugins que no se han podido guardar en un `sync` o un `plugins`.
 *
 * Antes esto era un `catch (\Exception)` por plugin que metía
 * `$e->getMessage()` en `data.errors` de una respuesta **200**. Dos problemas a la
 * vez:
 *
 * 1. **Fuga**: el mensaje podía ser un error de MySQL con tabla y columna, y viajaba
 *    al Moodle (el mismo problema que MGR-007, pero dentro de una respuesta de
 *    éxito, donde nadie lo estaba mirando).
 * 2. **Pérdida**: el plugin NO lee `data.errors` —no está entre las claves que
 *    consume— y el Manager no lo registraba en ninguna parte. O sea que si fallaba
 *    el guardado de los plugins de un sitio, no se enteraba nadie: ni el Moodle, ni
 *    nosotros.
 *
 * Lo segundo es lo grave, y más ahora: el inventario de plugins por entorno es la
 * base de los informes que piden Soporte y Comercial (qué versiones hay instaladas,
 * qué está desactualizado). Un inventario con huecos silenciosos da respuestas
 * falsas con toda la confianza del mundo.
 */
trait LogsPluginFailures
{
    /**
     * Deja el fallo en el log del servidor y devuelve la fila para `data.errors`.
     *
     * La fila mantiene sus dos claves (`plugin` y `error`) porque nunca se quitan
     * claves del contrato, pero `error` ya no lleva el mensaje de la excepción sino
     * una etiqueta estable más la referencia de la petición. El detalle está en el
     * canal `api` y en `report()`.
     */
    protected function registrarPluginFallido(
        Environment $environment,
        array $pluginData,
        \Throwable $e
    ): array {
        $nombre = $pluginData['name'] ?? $pluginData['component'] ?? 'unknown';
        $referencia = (string) request()->attributes->get('api_request_uuid', '');

        Log::channel('api')->error('Plugin no guardado durante la sincronización', [
            'request_uuid' => $referencia !== '' ? $referencia : null,
            'environment_id' => $environment->id,
            'host' => $environment->domain,
            'plugin' => $nombre,
            'component' => $pluginData['component'] ?? null,
            'exception' => $e::class,
            'message' => $e->getMessage(),
            'at' => $e->getFile() . ':' . $e->getLine(),
        ]);

        // `report()` solo para averías. Un `InvalidArgumentException` aquí significa
        // que el Moodle ha enviado un plugin sin `name` ni `component`: es un dato
        // malo del cliente, ya queda en el canal `api`, y mandarlo también al log de
        // errores de Laravel llenaría de ruido lo que sirve para detectar averías.
        if (!$e instanceof \InvalidArgumentException) {
            report($e);
        }

        return [
            'plugin' => $nombre,
            'error' => $referencia !== ''
                ? 'No se pudo registrar el plugin. Referencia: ' . $referencia
                : 'No se pudo registrar el plugin.',
        ];
    }
}
