<?php

namespace App\Livewire\Plugins;

/**
 * La portada de Plugins.
 *
 * **Lo que había: la sección entraba por la pantalla más densa de las cuatro.** `/plugins`
 * era directamente «Plugins Tresipunt», con sus pestañas encima, y dentro de esa pestaña
 * vivía además un bloque de «Licenciado y sin instalar» que no tiene nada que ver: uno se
 * mira pensando en versiones y actualizaciones, y el otro es una pregunta comercial que se
 * habla con el cliente.
 *
 * Es el mismo arreglo que Monitorización y Configuración: una portada que **enruta y
 * explica**, y cada pregunta en su propia página con su propia URL.
 *
 * **No es un índice de enlaces.** Cada tarjeta dice qué se contesta ahí y trae **el número
 * que decide si hay que entrar**. Cuatro nombres sin número obligan a abrir las cuatro para
 * saber que no pasa nada.
 *
 * **Y el primer número de todos es la cobertura**, arriba y antes que cualquier otro,
 * porque sin él los demás engañan: si solo 3 de 21 entornos envían inventario, «5
 * componentes con actualización» se lee como «el parque está al día» cuando son 5 de la
 * séptima parte del parque. Fue el fallo de fondo de la primera versión de esta pantalla y
 * no puede volver por la puerta de la portada.
 */
class Index extends PantallaDelParque
{
    /**
     * Las cuatro pantallas con su número y su alerta.
     *
     * **El número es del total, no de nada filtrado**: es lo que hay detrás de la tarjeta, y
     * sirve para decidir a cuál entrar.
     *
     * La `alerta` es distinta del recuento a propósito: «470 componentes» no dice si hay
     * trabajo, y «33 con actualización» sí. Cuando vale 0 la tarjeta se pinta en calma.
     *
     * @return array<int, array<string, mixed>>
     */
    public function tarjetas(): array
    {
        $resumen = $this->resumen();
        $mios = $this->resumenNuestros();
        $core = $this->resumenCore();
        $faltan = collect($this->faltantes())->sum(fn (array $f) => count($f['productos']));

        return [
            [
                'clave' => 'nuestros',
                'ruta' => 'plugins.nuestros',
                'titulo' => 'Plugins Tresipunt',
                'pregunta' => '¿Qué versión de lo nuestro tiene cada cliente?',
                'detalle' => 'Lo que hemos hecho nosotros, con las versiones que conviven en el '
                    . 'parque. Un componente en dos versiones distintas es lo que decide una '
                    . 'actualización.',
                'cuantos' => $resumen['nuestros'],
                'unidad' => 'componentes nuestros',
                'alerta' => $mios['desalineados'] + $mios['actualizables'],
                'queAlerta' => 'con versiones distintas o actualización pendiente',
            ],
            [
                'clave' => 'sin-instalar',
                'ruta' => 'plugins.sin-instalar',
                'titulo' => 'Licenciado y sin instalar',
                'pregunta' => '¿Alguien paga por algo que no usa?',
                'detalle' => 'Productos contratados que no aparecen en el inventario del sitio '
                    . 'que los tiene. O no lo ha instalado, o su Moodle no lo declara: las dos '
                    . 'se hablan con el cliente.',
                'cuantos' => $faltan,
                'unidad' => 'productos sin aparecer',
                'alerta' => $faltan,
                'queAlerta' => 'que revisar con el cliente',
            ],
            [
                'clave' => 'inventario',
                'ruta' => 'plugins.inventario',
                'titulo' => 'Inventario del parque',
                'pregunta' => '¿Qué hay instalado ahí fuera?',
                'detalle' => 'Todo lo que declaran los sitios, nuestro o de terceros, con su '
                    . 'versión y en cuántos entornos está.',
                'cuantos' => $resumen['componentes'],
                'unidad' => 'componentes distintos',
                'alerta' => $resumen['actualizables'],
                'queAlerta' => 'con actualización disponible',
            ],
            [
                'clave' => 'core',
                'ruta' => 'plugins.core',
                'titulo' => 'Versiones de Moodle',
                'pregunta' => '¿Quién se ha quedado atrás?',
                'detalle' => 'Qué sitios están por debajo de su propia rama y cuáles por debajo '
                    . 'de la mayor disponible.',
                'cuantos' => count($this->core()),
                'unidad' => 'sitios comprobados',
                'alerta' => $core['menor'],
                'queAlerta' => 'por debajo de su rama',
            ],
        ];
    }

    public function render()
    {
        return view('livewire.plugins.index', array_merge($this->comunes(), [
            'tarjetas' => $this->tarjetas(),
            'resumen' => $this->resumen(),
            'frescura' => $this->frescura(),
        ]))->layout('layouts.app');
    }
}
