<?php

namespace App\Support;

use App\Models\Environments\Environment;
use Illuminate\Support\Collection;

/**
 * Cómo se buscan entornos en un selector, **definido una sola vez**.
 *
 * Hermano de {@see SugerenciasDeClientes} y por el mismo motivo: el selector está en el
 * filtro del visor de peticiones y en la limpieza del histórico, y lo que no puede
 * divergir es la consulta — por qué campos busca y cuántas devuelve. Dos copias acaban con
 * una pantalla que encuentra un entorno y otra que no.
 *
 * **Busca por nombre y por dominio.** El dominio es lo que se tiene en la mano leyendo un
 * log, y es además la llave con la que la API reconoce el sitio.
 */
final class SugerenciasDeEntornos
{
    /** Cuántas se ofrecen a la vez. Doce entran en pantalla sin desplazar. */
    public const CUANTAS = 12;

    /**
     * @param  int|null  $clienteId  Acota a los entornos de un cliente. Se usa en el filtro
     *                              del visor, donde ofrecer el entorno de otro cliente es
     *                              ofrecer una combinación que no puede devolver nada. En
     *                              la limpieza **no** se acota: ahí no hay cliente elegido.
     * @return array{filas: Collection<int, Environment>, total: int}
     */
    public static function para(string $termino, ?int $clienteId = null): array
    {
        $termino = trim($termino);

        $consulta = Environment::query()
            ->when($clienteId, fn ($q) => $q->where('client_id', $clienteId))
            ->when($termino !== '', fn ($q) => $q->where(
                fn ($sub) => $sub->where('name', 'like', '%' . $termino . '%')
                    ->orWhere('domain', 'like', '%' . $termino . '%')
            ));

        return [
            // `active` va en la lista porque **el visor de peticiones no cuenta los
            // entornos apagados**: si se ofrece uno sin decir que está apagado, se elige
            // creyendo que se está mirando un sitio en servicio. Elegirlo sí funciona
            // —pedir un sitio concreto manda sobre el recorte—, pero hay que saber cuál es.
            'filas' => (clone $consulta)->orderBy('name')->limit(self::CUANTAS)->get(['id', 'name', 'domain', 'active']),
            'total' => (clone $consulta)->count(),
        ];
    }
}
