<?php

namespace App\Imports;

use Illuminate\Support\Collection;
use Illuminate\Support\Str;
use Maatwebsite\Excel\Concerns\Importable;
use Maatwebsite\Excel\Concerns\ToCollection;
use Maatwebsite\Excel\Concerns\WithHeadingRow;

class EstacionesImport implements ToCollection, WithHeadingRow
{
    use Importable;

    public Collection $rows;

    /**
     * Se inicializa la colección para evitar condicionales en consumidores y
     * simplificar los tests del importador.
     */
    public function __construct()
    {
        $this->rows = collect();
    }

    /**
     * El import usa estrictamente la primera fila como encabezado para evitar
     * mezclar datos posteriores como opciones de mapeo.
     */
    public function headingRow(): int
    {
        return 1;
    }

    /**
     * Laravel Excel entrega todas las filas normalizadas en memoria. Para el
     * volumen actual del archivo es suficiente y simplifica la validación.
     */
    public function collection(Collection $rows): void
    {
        $this->rows = $rows->map(function (Collection $row) {
            return $row->mapWithKeys(function ($value, $key) {
                return [$this->normalizeHeading((string) $key) => $value];
            });
        });
    }

    /**
     * Normaliza encabezados para desacoplar el servicio de acentos, símbolos y
     * decisiones internas de formateo de la librería.
     */
    private function normalizeHeading(string $heading): string
    {
        return Str::of($heading)
            ->ascii()
            ->lower()
            ->replaceMatches('/[^a-z0-9]+/', '_')
            ->trim('_')
            ->toString();
    }
}
