<?php

namespace App\Exports;

use App\Models\Sim;
use Throwable;
use Illuminate\Support\Facades\Log;
use Maatwebsite\Excel\Concerns\FromCollection;
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;

class SimsExport implements FromCollection
{
    public $_heading;

    public function __construct()
    {
        $this->_heading = [];
    }

    public function styles(Worksheet $sheet): array
    {
        return [
            1 => ['font' => ['bold' => true]],
        ];
    }

    /**
     * @return \Illuminate\Support\Collection
     */
    public function collection()
    {
        // checkpoint 0 — empezamos
        Log::info('[SimsExport] INICIO collection()', [
            'memory_mb'       => round(memory_get_usage(true) / 1048576, 2),
            'memory_limit'    => ini_get('memory_limit'),
            'max_exec_time'   => ini_get('max_execution_time'),
        ]);

        try {
            // checkpoint 1 — query (la metemos DENTRO del try a propósito)
            $sims = (new Sim())
                ->where('status', 1)
                ->with(['simNewness'])
                ->get();

            Log::info('[SimsExport] query OK', [
                'total_filas' => $sims->count(),
                'memory_mb'   => round(memory_get_usage(true) / 1048576, 2),
            ]);

            $data_export = [];

            foreach ($sims as $key => $sim) {
                $data_item = [];

                $data_item['sim_serial'] = $sim->sim_serial ? $sim->sim_serial . ' ' : '';
                $data_item['caja'] = $sim->box ?? '';
                $data_item['operador'] = $sim->operator ?? '';
                $data_item['tamano'] = $sim->size ?? '';
                $data_item['estado'] = ($sim->available ?? 0) == 1 ? 'DISPONIBLE' : 'NO DISPONIBLE';
                $data_item['numero_transporte'] = $sim->description ?? '';

                $hasNewness = isset($sim->simNewness);
                $data_item['novedad'] = $hasNewness ? 'Sí' : 'No';
                $data_item['tipo_novedad'] = $hasNewness && isset($sim->simNewness->newnessType)
                    ? ($sim->simNewness->newnessType->name ?? 'Sin tipo')
                    : 'Sin novedad';

                $data_item['creado'] = $sim->created_at ?? '';
                $data_item['ultima_actualizacion'] = $sim->updated_at ?? '';

                $data_export[] = $data_item;
            }

            // checkpoint 2 — loop terminado
            Log::info('[SimsExport] loop OK', [
                'filas_mapeadas' => count($data_export),
                'memory_peak_mb' => round(memory_get_peak_usage(true) / 1048576, 2),
            ]);

            $temp_all_data = collect($data_export);
            $first_element = collect($temp_all_data->first());
            $this->_heading = $first_element->keys()->toArray();
        } catch (Throwable $e) {
            // Throwable, no Exception: captura TAMBIÉN \Error y \TypeError
            Log::error('[SimsExport] FALLO en collection()', [
                'tipo'    => get_class($e),
                'mensaje' => $e->getMessage(),
                'archivo' => $e->getFile() . ':' . $e->getLine(),
                'trace'   => $e->getTraceAsString(),
            ]);
            throw $e; // re-lanzamos para que el 500 sea real y quede el rastro
        }

        // checkpoint 3 — collection() retorna; lo que pase DESPUÉS es PhpSpreadsheet
        Log::info('[SimsExport] FIN collection() — retornando, ahora escribe PhpSpreadsheet', [
            'filas_totales'  => count($data_export) + 1,
            'memory_peak_mb' => round(memory_get_peak_usage(true) / 1048576, 2),
        ]);

        return collect(array_merge([$this->_heading], $data_export));
    }
}