<?php

namespace App\Http\Controllers;

use App\Models\RegistroSalida;
use App\Models\Manguera;
use App\Models\PrecioDia;
use App\Models\User;
use Illuminate\Http\Request;

class RegistroSalidasController extends Controller
{
    public function index(Request $request)
    {
        $fechaDesde = $request->query('fecha_desde');
        $fechaHasta = $request->query('fecha_hasta');
        $usuarioId = $request->query('id_usuario');
        $turnoId = $request->query('id_turno');

        $query = RegistroSalida::with(['manguera.cara.estacion', 'usuario', 'turno']);

        if (!empty($fechaDesde)) {
            $query->whereDate('fecha_inicio', '>=', $fechaDesde);
        }

        if (!empty($fechaHasta)) {
            $query->whereDate('fecha_inicio', '<=', $fechaHasta);
        }

        if (!empty($usuarioId)) {
            $query->where('id_usuario', $usuarioId);
        }

        if (!empty($turnoId)) {
            $query->where('id_turno', $turnoId);
        }

        $items = $query->orderBy('id_salida')->get();

        $usuarios = User::orderBy('id_usuario')->get();
        $turnos = \App\Models\Turno::orderBy('id_turno')->get();

        return view('registros_salidas.index', compact(
            'items',
            'usuarios',
            'turnos',
            'fechaDesde',
            'fechaHasta',
            'usuarioId',
            'turnoId'
        ));
    }


    public function create()
    {
        $mangueras = Manguera::with(['cara.estacion'])->orderBy('id_manguera')->get();
        $usuarios = User::orderBy('id_usuario')->get();
        $turnos = \App\Models\Turno::orderBy('id_turno')->get();
        $items = PrecioDia::with('tipoCombustible')
            ->orderBy('fecha', 'desc')
            ->orderBy('id', 'desc')
            ->get();
        $ultimoPrecio = $items->first();

        return view('registros_salidas.create', compact('mangueras', 'usuarios', 'turnos', 'items', 'ultimoPrecio'));
    }


    public function store(Request $request)
    {
            $data = $request->validate([
            'id_manguera' => 'required|integer',
            'id_usuario' => 'required|integer',
            'id_turno' => 'required|integer',
            'fecha_inicio' => 'required|date',
            'saldo_inicial' => 'required|numeric',
            'galones' => 'nullable|numeric',
            'saldo_final' => 'required|numeric',
            'precio_galon' => 'nullable|numeric',
            'total' => 'nullable|numeric',
            'observaciones' => 'nullable|string|max:500',
        ]);

        $ultimoRegistroManguera = RegistroSalida::where('id_manguera', $data['id_manguera'])
            ->orderByDesc('id_salida')
            ->first();

        $saldoInicial = $ultimoRegistroManguera
            ? (float) ($ultimoRegistroManguera->saldo_final ?? 0)
            : (float) ($data['saldo_inicial'] ?? 0);

        $saldoFinal = (float) ($data['saldo_final'] ?? 0);
        $precioGalon = $this->resolvePrecioGalon((int) $data['id_manguera'], (int) $data['id_turno']);
        $galones = max(0.0, $saldoFinal - $saldoInicial);

        $data['saldo_inicial'] = round($saldoInicial, 3);
        $data['saldo_final'] = round($saldoFinal, 3);
        $data['galones'] = round($galones, 3);
        $data['precio_galon'] = round($precioGalon, 2);
        $data['total'] = round($galones * $precioGalon, 2);

        RegistroSalida::create($data);

        return redirect()->route('registros_salidas.index')->with('success', 'Registro creado.');
    }

    public function edit(string $id)
    {
        $item = RegistroSalida::findOrFail($id);
        $mangueras = Manguera::with(['cara.estacion'])->orderBy('id_manguera')->get();
        $usuarios = User::orderBy('id_usuario')->get();
        $turnos = \App\Models\Turno::orderBy('id_turno')->get();
        return view('registros_salidas.edit', compact('item', 'mangueras', 'usuarios', 'turnos'));
    }


    public function update(Request $request, string $id)
    {
        $item = RegistroSalida::findOrFail($id);
            $data = $request->validate([
            'id_manguera' => 'required|integer',
            'id_usuario' => 'required|integer',
            'id_turno' => 'required|integer',
            'fecha_inicio' => 'required|date',
            'saldo_inicial' => 'required|numeric',
            'galones' => 'nullable|numeric',
            'saldo_final' => 'required|numeric',
            'precio_galon' => 'nullable|numeric',
            'total' => 'nullable|numeric',
            'observaciones' => 'nullable|string|max:500',
        ]);

        $item->update($data);

        return redirect()->route('registros_salidas.index')->with('success', 'Registro actualizado.');
    }

    private function resolvePrecioGalon(int $idManguera, int $idTurno): float
    {
        $manguera = Manguera::find($idManguera);
        $turno = \App\Models\Turno::find($idTurno);

        if (!$manguera || !$turno) {
            return 0.00;
        }

        $turnoNombre = mb_strtolower($turno->turnos ?? $turno->nombre ?? '');

        $precioDia = PrecioDia::where('tipo_combustible', $manguera->id_tipo_combustible)
            ->whereDate('fecha', now()->toDateString())
            ->orderByDesc('fecha')
            ->orderByDesc('id')
            ->first();

        if (!$precioDia) {
            $precioDia = PrecioDia::where('tipo_combustible', $manguera->id_tipo_combustible)
                ->orderByDesc('fecha')
                ->orderByDesc('id')
                ->first();
        }

        if (!$precioDia) {
            return 0.00;
        }

        if (str_contains($turnoNombre, 'tarde')) {
            return (float) $precioDia->precio_turno_tarde;
        }

        if (str_contains($turnoNombre, 'noche')) {
            return (float) $precioDia->precio_turno_noche;
        }

        return (float) $precioDia->precio_turno_manana;
    }

    public function destroy(string $id)
    {
        $item = RegistroSalida::findOrFail($id);
        $item->delete();
        return redirect()->route('registros_salidas.index')->with('success', 'Registro eliminado.');
    }
}

