<?php

namespace App\Http\Controllers;

use App\Models\Area;
use App\Models\Equipo;
use App\Models\LecturaHorometro;
use Illuminate\Http\Request;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\DB;

class HorometroController extends Controller
{
    public function index(Request $r)
    {
        $q = Equipo::with(['area','lecturas' => fn ($x) => $x->limit(1)])
            ->where('activo', 1)
            ->orderBy('codigo');
        if ($area_id = $r->integer('area_id')) $q->where('area_id', $area_id);
        if ($busqueda = trim((string) $r->get('q', ''))) {
            $q->where(fn ($w) => $w->where('codigo','like',"%$busqueda%")->orWhere('nombre','like',"%$busqueda%"));
        }
        $equipos = $q->get();
        $areas = Area::where('activo',1)->orderBy('nombre')->get();
        return view('horometro.index', compact('equipos','areas','busqueda','area_id'));
    }

    public function guardar(Request $r)
    {
        $r->validate([
            'fecha_lectura' => 'required|date',
            'lecturas' => 'array',
            'lecturas.*.equipo_id' => 'required|exists:equipos,id',
            'lecturas.*.horometro' => 'nullable|numeric|min:0',
        ]);

        $fecha = Carbon::parse($r->fecha_lectura);
        $guardadas = 0;
        $omitidas = 0;
        $invertidas = 0;

        foreach ($r->input('lecturas', []) as $linea) {
            if (!isset($linea['horometro']) || $linea['horometro'] === '' || $linea['horometro'] === null) {
                $omitidas++;
                continue;
            }
            $equipo = Equipo::find($linea['equipo_id']);
            if (!$equipo) { $omitidas++; continue; }

            $nuevo = (float) $linea['horometro'];
            $previo = (float) $equipo->horometro_actual;
            if ($nuevo < $previo) {
                $invertidas++;
                continue; // No permitimos retroceder
            }

            $delta = max(0, $nuevo - $previo);

            LecturaHorometro::create([
                'equipo_id' => $equipo->id,
                'fecha_lectura' => $fecha,
                'horometro' => $nuevo,
                'delta' => $delta,
                'observaciones' => $linea['observaciones'] ?? null,
                'usuario_id' => auth()->id(),
            ]);

            $equipo->horometro_actual = $nuevo;
            // Si nunca se ha hecho PM, fijar las bases en la primera lectura
            foreach (['ultimo_pm_360','ultimo_pm_720','ultimo_pm_4320','ultimo_pm_8640'] as $col) {
                if ($equipo->$col === null) $equipo->$col = $nuevo;
            }
            $equipo->save();
            $guardadas++;
        }

        $msg = "Guardadas: $guardadas · Omitidas (vacías): $omitidas";
        if ($invertidas > 0) $msg .= " · Rechazadas (valor menor al anterior): $invertidas";
        return back()->with('exito', $msg);
    }

    public function historial(Equipo $equipo)
    {
        $equipo->load(['area']);
        $lecturas = $equipo->lecturas()->with('usuario')->paginate(50);
        return view('horometro.historial', compact('equipo','lecturas'));
    }
}
