<?php

namespace App\Http\Requests\Admin;

use Illuminate\Foundation\Http\FormRequest;

class ImportEstacionesRequest extends FormRequest
{
    private const REQUIRED_MAPPING_FIELDS = [
        'direccion',
        'coordenadas',
        'ciudad',
        'departamento',
    ];

    /**
     * La autorización real se resuelve en la ruta con middlewares de Sanctum
     * y root user. El request mantiene la validación enfocada en el payload.
     */
    public function authorize(): bool
    {
        return true;
    }

    /**
     * Limita el archivo a formatos de Excel y un tamaño conservador para evitar
     * cargas costosas que no aportan valor en este caso de uso operativo.
     */
    public function rules(): array
    {
        return [
            'file' => [
                'required',
                'file',
                'mimes:xlsx,xls',
                'mimetypes:application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
                'max:20480',
            ],
            'mapping' => ['required', 'array'],
            'mapping.*' => ['required', 'string', 'max:100'],
        ];
    }

    /**
     * Los mensajes se mantienen neutrales para no filtrar detalles internos de
     * validación y hacer más clara la corrección desde la UI.
     */
    public function messages(): array
    {
        return [
            'file.required' => 'Debe seleccionar un archivo de Excel.',
            'file.file' => 'El archivo enviado no es válido.',
            'file.mimes' => 'El archivo debe tener extensión .xlsx o .xls.',
            'file.mimetypes' => 'El archivo debe ser un Excel válido.',
            'file.max' => 'El archivo supera el tamaño máximo permitido de 20 MB.',
            'mapping.required' => 'Debe confirmar el mapeo de columnas antes de importar.',
            'mapping.array' => 'El mapeo de columnas no es válido.',
            'mapping.*.required' => 'Todas las columnas requeridas deben tener una asignación.',
            'mapping.*.string' => 'El valor del mapeo debe ser texto.',
        ];
    }

    /**
     * Refuerza la validación de estructura del mapping para evitar imports con
     * campos obligatorios incompletos o claves inesperadas.
     */
    public function withValidator($validator): void
    {
        $validator->after(function ($validator) {
            $mapping = $this->input('mapping', []);

            if (!is_array($mapping)) {
                return;
            }

            $missing = array_values(array_diff(self::REQUIRED_MAPPING_FIELDS, array_keys($mapping)));
            $unexpected = array_values(array_diff(array_keys($mapping), self::REQUIRED_MAPPING_FIELDS));

            if ($missing !== []) {
                $validator->errors()->add(
                    'mapping',
                    'Faltan campos obligatorios en el mapeo: ' . implode(', ', $missing) . '.'
                );
            }

            if ($unexpected !== []) {
                $validator->errors()->add(
                    'mapping',
                    'El mapeo contiene columnas no permitidas.'
                );
            }
        });
    }
}
