<?php

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

use Illuminate\Contracts\Validation\Validator;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Http\Exceptions\HttpResponseException;
use Illuminate\Http\JsonResponse;

/**
 * Base de las peticiones de escritura de la API de administración (PRODSECU-215).
 *
 * - **`authorize()` siempre sí**: el permiso ya lo ha mirado `AdminApiAbility` con las
 *   abilities del token antes de llegar aquí.
 * - **Un 422 en JSON con `{message, errors}`**, en castellano. Este proyecto no tiene
 *   carpeta `lang/`, así que los mensajes que importan se escriben en cada petición.
 * - **{@see conflicto()}** para los 409: un duplicado no es un dato mal escrito, es que
 *   eso ya existe, y Sistemas necesita el existente para seguir.
 */
abstract class PeticionDeAdministracion extends FormRequest
{
    public function authorize(): bool
    {
        return true;
    }

    protected function failedValidation(Validator $validator): void
    {
        throw new HttpResponseException(response()->json([
            'message' => 'Los datos no son válidos.',
            'errors' => $validator->errors()->toArray(),
        ], 422));
    }

    /**
     * Corta con un 409. Con `$existente`, lo devuelve en `data` para que quien llama pueda
     * seguir con él en vez de tener que buscarlo.
     */
    protected function conflicto(string $mensaje, mixed $existente = null): never
    {
        $cuerpo = ['message' => $mensaje];

        if ($existente !== null) {
            $cuerpo['data'] = $existente;
        }

        throw new HttpResponseException(new JsonResponse($cuerpo, 409));
    }
}
