<?php

namespace App\Exports;

use App\Models\Medicion;
use Illuminate\Http\Request;
use Illuminate\Support\Collection;
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\ShouldAutoSize;
use Maatwebsite\Excel\Concerns\WithHeadings;
use Maatwebsite\Excel\Concerns\WithMapping;

class MedicionesExport implements
    FromCollection,
    WithHeadings,
    WithMapping,
    ShouldAutoSize
{
    protected Request $request;


    public function __construct(Request $request)
    {
        $this->request = $request;
    }


    /**
     * Obtener las mediciones filtradas.
     */
    public function collection(): Collection
    {
        return Medicion::query()

            ->with([
                'paciente',
                'responsable',
            ])


            /*
            |--------------------------------------------------------------------------
            | PACIENTE
            |--------------------------------------------------------------------------
            */

            ->when(
                $this->request->filled('paciente_id'),

                fn ($query) =>
                    $query->where(
                        'paciente_id',
                        $this->request->integer('paciente_id')
                    )
            )


            /*
            |--------------------------------------------------------------------------
            | TIPO
            |--------------------------------------------------------------------------
            */

            ->when(
                $this->request->filled('tipo'),

                fn ($query) =>
                    $query->where(
                        'tipo',
                        $this->request->input('tipo')
                    )
            )


            /*
            |--------------------------------------------------------------------------
            | FECHA DESDE
            |--------------------------------------------------------------------------
            */

            ->when(
                $this->request->filled('fecha_desde'),

                fn ($query) =>
                    $query->whereDate(
                        'fecha_hora',
                        '>=',
                        $this->request->input('fecha_desde')
                    )
            )


            /*
            |--------------------------------------------------------------------------
            | FECHA HASTA
            |--------------------------------------------------------------------------
            */

            ->when(
                $this->request->filled('fecha_hasta'),

                fn ($query) =>
                    $query->whereDate(
                        'fecha_hora',
                        '<=',
                        $this->request->input('fecha_hasta')
                    )
            )


            ->orderByDesc('fecha_hora')
            ->get();
    }


    /**
     * Encabezados del Excel.
     */
    public function headings(): array
    {
        return [
            'Fecha y hora',
            'Paciente',
            'Tipo',
            'Resultado',
            'Responsable',
            'Observaciones',
        ];
    }


    /**
     * Formato de cada fila.
     */
    public function map($medicion): array
    {
        if ($medicion->tipo === 'presion') {

            $resultado =
                $medicion->presion_sistolica .
                '/' .
                $medicion->presion_diastolica .
                ' mmHg';

            if ($medicion->pulso) {

                $resultado .=
                    ' - Pulso: ' .
                    $medicion->pulso .
                    ' lpm';
            }

        } else {

            $resultado =
                $medicion->glucosa .
                ' mg/dL';

            if ($medicion->momento_glucosa) {

                $resultado .=
                    ' - ' .
                    str_replace(
                        '_',
                        ' ',
                        $medicion->momento_glucosa
                    );
            }
        }


        return [
            $medicion->fecha_hora
                ? $medicion->fecha_hora->format('d/m/Y H:i')
                : '',

            $medicion->paciente
                ? $medicion->paciente->nombre_completo
                : '',

            $medicion->tipo === 'presion'
                ? 'Presión arterial'
                : 'Glucosa',

            $resultado,

            $medicion->responsable
                ? $medicion->responsable->nombre_completo
                : '',

            $medicion->observaciones ?: '',
        ];
    }
}