<?php

namespace App\Http\Requests;

use App\Traits\ConvertsBase64ToFiles;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;

class LubricanteRequest extends FormRequest
{
    use ConvertsBase64ToFiles;

    private const IMAGE_MIN_WIDTH = 393;
    private const IMAGE_MIN_HEIGHT = 224;

    /**
     * La autorización está centralizada en la ruta protegida por `rootUser`.
     * Mantenerlo aquí evita duplicar reglas de permisos y reduce falsos rechazos.
     */
    public function authorize(): bool
    {
        return true;
    }

    /**
     * Valida estrictamente el contrato administrativo. `estado` se limita a un
     * booleano serializable para evitar valores numéricos inesperados.
     *
     * @return array<string, mixed>
     */
    public function rules(): array
    {
        return [
            'titulo' => ['required', 'string', 'min:2', 'max:120'],
            'estado' => ['required', Rule::in([0, 1, '0', '1'])],
            'imagen' => $this->imageRule(),
        ];
    }

    /**
     * Permite conservar una imagen existente durante edición. Si el frontend
     * envía una URL o string no base64, se descarta antes de validar para no
     * tratar datos públicos como archivo cargado.
     */
    protected function prepareForValidation(): void
    {
        $input = $this->input();

        if ($this->method() !== 'POST') {
            $isBase64 = isset($input['imagen']) && isImageBase64($input['imagen']);

            if (!$isBase64) {
                unset($input['imagen']);
                $this->replace($input ?? []);
                return;
            }
        }

        $this->convertBase64ToFiles();
    }

    /**
     * @return array<int, string>
     */
    protected function base64FileKeys(): array
    {
        return ['imagen'];
    }

    /**
     * @return array<int, string>
     */
    protected function imageRule(): array
    {
        $required = $this->method() === 'POST' ? 'required' : 'nullable';

        return [
            $required,
            'image',
            'mimes:webp,jpg,jpeg,png',
            'dimensions:min_width=' . self::IMAGE_MIN_WIDTH . ',min_height=' . self::IMAGE_MIN_HEIGHT,
        ];
    }
}
