<?php

namespace App\Http\Requests\Api\Admin\V1;

use Illuminate\Validation\Rule;

/**
 * Fijar los productos de una licencia (`PUT /license-tokens/{id}/products`).
 *
 * Solo `products[].product_id`. Las fechas y el estado de cada producto se gestionan desde
 * el panel. La compatibilidad con las plataformas y si el producto se puede vender se
 * miran en el controlador, que es quien sabe qué productos son nuevos.
 */
class ProductosDeLaLicenciaRequest extends PeticionDeAdministracion
{
    public function rules(): array
    {
        return [
            // `present` y no `required`: una lista vacía es una petición válida.
            // Con tope: cada elemento es una consulta `exists`, y 3.000 tardaban más de un
            // segundo (auditoría PRODSECU-215). Ninguna licencia tiene ni de lejos 100.
            'products' => 'present|array|max:100',
            'products.*' => 'array',
            'products.*.product_id' => [
                'required',
                'integer',
                'distinct',
                Rule::exists('products', 'id')->whereNull('deleted_at'),
            ],
        ];
    }

    public function messages(): array
    {
        return [
            'products.present' => 'Falta la lista de productos (`products`).',
            'products.max' => 'La lista no puede tener más de 100 productos.',
            'products.*.product_id.required' => 'Cada producto necesita su product_id.',
            'products.*.product_id.distinct' => 'Ese producto está repetido en la lista.',
            'products.*.product_id.exists' => 'Ese producto no existe. Los válidos salen en GET /products.',
        ];
    }

    /** @return list<int> */
    public function productIds(): array
    {
        return array_map(
            fn ($fila) => (int) $fila['product_id'],
            array_values($this->validated('products'))
        );
    }
}
