<?php

namespace App\Support;

use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Relations\Relation;

/**
 * Qué número de orden le toca al siguiente elemento de una versión.
 *
 * **Por qué el campo no puede salir vacío.** «Orden (opcional)» se deja en blanco casi
 * siempre —es un número que no significa nada para quien está escribiendo una funcionalidad—
 * y entonces el elemento se guarda con `sort_order` a null. Los nulos van al final y se
 * ordenan entre ellos por fecha de creación, así que la lista acaba con un bloque de
 * elementos **sin orden decidido por nadie**: mover uno con las flechas no hace lo que
 * parece, y la API los sirve en ese mismo orden accidental.
 *
 * Poniendo por defecto el número que de verdad le toca —el último de la lista más uno— el
 * campo deja de ser una trampa: quien no se fija obtiene lo que esperaba, que es que el
 * elemento nuevo quede el último, y quien quiere otra posición la escribe.
 *
 * Se calcula con `max()` **y** con `count()`: si los que ya están tienen el orden a null,
 * `max` es null y el único número honesto es cuántos hay.
 */
final class SiguienteOrden
{
    /**
     * @param  Relation|Builder  $elementos  la consulta de los elementos de esa versión
     */
    public static function de(Relation|Builder $elementos): int
    {
        $consulta = clone $elementos;
        $mayor = (int) ($consulta->max('sort_order') ?? 0);

        $consulta = clone $elementos;
        $cuantos = (int) $consulta->count();

        return max($mayor, $cuantos) + 1;
    }
}
