<?php

namespace App\Livewire\Supports;

use App\Models\Support\Support;
use Illuminate\Support\Facades\DB;
use Livewire\Attributes\On;
use Livewire\Component;
use Livewire\WithPagination;

class Index extends Component
{
    use WithPagination;

    public string $search = '';

    protected $queryString = ['search'];

    public function updatingSearch()
    {
        $this->resetPage();
    }

    /**
     * Abre el aviso de borrado de un tipo de soporte.
     *
     * **El catálogo no tenía forma de quitar nada** —listado, alta y edición—, y el
     * permiso `admin.supports.destroy` existía sin gatear nada (MGR-101). Es el mismo
     * hueco que tenían los tipos de entorno: un catálogo al que se puede añadir y del
     * que no se puede quitar.
     */
    public function abrirBorrado(int $supportId): void
    {
        $this->authorize('admin.supports.destroy');

        $this->dispatch('openModal',
            component: BorrarSoporteModal::class,
            arguments: ['supportId' => $supportId]
        );
    }

    /**
     * La modal avisa al terminar, y **escuchar es lo que repinta la pantalla**.
     *
     * El cuerpo está vacío a propósito: lo que hace falta es que Livewire vuelva a
     * llamar a `render()`. Sin este `#[On]`, el tipo se borra y **la fila sigue en la
     * tabla** hasta que alguien recargue — el fallo que ya apareció al borrar
     * funcionalidades de un producto.
     */
    #[On('soportesCambiados')]
    public function repintarTrasBorrar(): void
    {
        //
    }

    /**
     * Cuántos contratos usa cada tipo, para poder pintar el candado sin abrir la modal.
     *
     * **Una consulta para toda la página**, no una por fila: son veinte filas y el dato
     * es un `group by`. Y se cuentan **todos** los contratos, vigentes o no: un contrato
     * caducado es el histórico de lo que se le vendió a un cliente.
     *
     * @param  array<int, int>  $ids
     * @return array<int, int>  id del tipo => contratos
     */
    private function contratosPorTipo(array $ids): array
    {
        if ($ids === []) {
            return [];
        }

        return DB::table('environment_support')
            ->whereIn('support_id', $ids)
            ->selectRaw('support_id, count(*) as cuantos')
            ->groupBy('support_id')
            ->pluck('cuantos', 'support_id')
            ->all();
    }

    public function render()
    {
        $supports = Support::query()
            ->when($this->search, function ($query) {
                $query->where('name', 'like', "%{$this->search}%")
                    ->orWhere('shortname', 'like', "%{$this->search}%");
            })
            ->orderBy('name')
            ->paginate(20);

        return view('livewire.supports.index', [
            'supports' => $supports,
            // Para el candado de cada fila, sin una consulta por fila.
            'contratos' => $this->contratosPorTipo($supports->pluck('id')->all()),
        ])->layout('layouts.app');
    }
}

