<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class UtilitiesController extends Controller
{
    public function imcCalculator()
    {
        return view('utilities.imc');
    }

    public function calculateIMC(Request $request)
    {
        $request->validate([
            'weight' => 'required|numeric|min:0',
            'height' => 'required|numeric|min:0',
        ]);

        $weight = $request->weight;
        $height = $request->height / 100; // convertir cm a metros
        $imc = round($weight / ($height * $height), 2);

        $classification = $this->getIMCClassification($imc);

        return response()->json([
            'imc' => $imc,
            'classification' => $classification['name'],
            'description' => $classification['description'],
            'recommendations' => $classification['recommendations']
        ]);
    }

    private function getIMCClassification($imc)
    {
        if ($imc < 18.5) {
            return [
                'name' => 'Bajo peso',
                'description' => 'Su peso está por debajo del rango saludable.',
                'recommendations' => [
                    'Consulte con un nutricionista para un plan de alimentación adecuado',
                    'Aumente el consumo de proteínas y carbohidratos saludables',
                    'Realice ejercicios de fortalecimiento muscular'
                ]
            ];
        } elseif ($imc < 25) {
            return [
                'name' => 'Peso normal',
                'description' => '¡Felicitaciones! Su peso está dentro del rango saludable.',
                'recommendations' => [
                    'Mantenga una dieta balanceada',
                    'Realice actividad física regular',
                    'Continue con sus chequeos médicos rutinarios'
                ]
            ];
        } elseif ($imc < 30) {
            return [
                'name' => 'Sobrepeso',
                'description' => 'Su peso está por encima del rango saludable.',
                'recommendations' => [
                    'Reduzca el consumo de alimentos altos en calorías',
                    'Aumente la actividad física diaria',
                    'Considere consultar con un nutricionista'
                ]
            ];
        } else {
            return [
                'name' => 'Obesidad',
                'description' => 'Su peso está significativamente por encima del rango saludable.',
                'recommendations' => [
                    'Consulte con un profesional de la salud para un plan integral',
                    'Modifique sus hábitos alimenticios con ayuda profesional',
                    'Realice actividad física supervisada'
                ]
            ];
        }
    }

    public function medicalConverter()
    {
        return view('utilities.converter');
    }

    public function convert(Request $request)
    {
        $request->validate([
            'value' => 'required|numeric',
            'from' => 'required|string',
            'to' => 'required|string',
            'type' => 'required|string|in:weight,volume,temperature,pressure,glucose'
        ]);

        $value = $request->input('value');
        $from = $request->input('from');
        $to = $request->input('to');
        $type = $request->input('type');

        try {
            $result = match ($type) {
                'weight' => $this->convertWeight($value, $from, $to),
                'volume' => $this->convertVolume($value, $from, $to),
                'temperature' => $this->convertTemperature($value, $from, $to),
                'pressure' => $this->convertPressure($value, $from, $to),
                'glucose' => $this->convertGlucose($value, $from, $to),
                default => throw new \InvalidArgumentException('Tipo de conversión no válido'),
            };

            return response()->json(['result' => round($result, 2)]);
        } catch (\Exception $e) {
            return response()->json(['error' => $e->getMessage()], 400);
        }
    }

    private function convertWeight($value, $from, $to)
    {
        // Convertir todo a kg primero
        $kg = match ($from) {
            'kg' => $value,
            'lb' => $value * 0.45359237,
            'oz' => $value * 0.0283495231,
            default => throw new \InvalidArgumentException('Unidad de origen no válida para peso'),
        };

        // Convertir de kg a la unidad objetivo
        return match ($to) {
            'kg' => $kg,
            'lb' => $kg / 0.45359237,
            'oz' => $kg / 0.0283495231,
            default => throw new \InvalidArgumentException('Unidad de destino no válida para peso'),
        };
    }

    private function convertVolume($value, $from, $to)
    {
        // Convertir todo a ml primero
        $ml = match ($from) {
            'ml' => $value,
            'cc' => $value, // cc es igual a ml
            'oz' => $value * 29.5735296,
            default => throw new \InvalidArgumentException('Unidad de origen no válida para volumen'),
        };

        // Convertir de ml a la unidad objetivo
        return match ($to) {
            'ml' => $ml,
            'cc' => $ml,
            'oz' => $ml / 29.5735296,
            default => throw new \InvalidArgumentException('Unidad de destino no válida para volumen'),
        };
    }

    private function convertTemperature($value, $from, $to)
    {
        if ($from === $to) {
            return $value;
        }

        return match ("$from-$to") {
            'C-F' => ($value * 9/5) + 32,
            'F-C' => ($value - 32) * 5/9,
            default => throw new \InvalidArgumentException('Conversión de temperatura no válida'),
        };
    }

    private function convertPressure($value, $from, $to)
    {
        if ($from === $to) {
            return $value;
        }

        return match ("$from-$to") {
            'mmHg-kPa' => $value * 0.133322,
            'kPa-mmHg' => $value / 0.133322,
            default => throw new \InvalidArgumentException('Conversión de presión no válida'),
        };
    }

    private function convertGlucose($value, $from, $to)
    {
        if ($from === $to) {
            return $value;
        }

        return match ("$from-$to") {
            'mg/dL-mmol/L' => $value * 0.0555,
            'mmol/L-mg/dL' => $value / 0.0555,
            default => throw new \InvalidArgumentException('Conversión de glucosa no válida'),
        };
    }

    public function vaccinationSchedule()
    {
        $schedules = [
            'Recién nacido' => [
                ['name' => 'BCG', 'description' => 'Tuberculosis'],
                ['name' => 'Hepatitis B', 'description' => 'Primera dosis']
            ],
            '2 meses' => [
                ['name' => 'Pentavalente', 'description' => 'Primera dosis'],
                ['name' => 'Polio', 'description' => 'Primera dosis'],
                ['name' => 'Rotavirus', 'description' => 'Primera dosis'],
                ['name' => 'Neumococo', 'description' => 'Primera dosis']
            ],
            '4 meses' => [
                ['name' => 'Pentavalente', 'description' => 'Segunda dosis'],
                ['name' => 'Polio', 'description' => 'Segunda dosis'],
                ['name' => 'Rotavirus', 'description' => 'Segunda dosis'],
                ['name' => 'Neumococo', 'description' => 'Segunda dosis']
            ],
            '6 meses' => [
                ['name' => 'Pentavalente', 'description' => 'Tercera dosis'],
                ['name' => 'Polio', 'description' => 'Tercera dosis'],
                ['name' => 'Influenza', 'description' => 'Primera dosis']
            ],
            '12 meses' => [
                ['name' => 'SRP', 'description' => 'Sarampión, Rubéola, Paperas'],
                ['name' => 'Varicela', 'description' => 'Primera dosis'],
                ['name' => 'Neumococo', 'description' => 'Refuerzo']
            ],
            '18 meses' => [
                ['name' => 'Pentavalente', 'description' => 'Refuerzo'],
                ['name' => 'Polio', 'description' => 'Refuerzo']
            ],
            '4-6 años' => [
                ['name' => 'DPT', 'description' => 'Refuerzo'],
                ['name' => 'Polio', 'description' => 'Refuerzo'],
                ['name' => 'SRP', 'description' => 'Refuerzo']
            ],
            '11 años' => [
                ['name' => 'VPH', 'description' => 'Virus del Papiloma Humano (2 dosis)']
            ],
            'Adultos' => [
                ['name' => 'Td', 'description' => 'Tétanos y difteria cada 10 años'],
                ['name' => 'Influenza', 'description' => 'Anual']
            ]
        ];

        return view('utilities.vaccination', compact('schedules'));
    }
} 