<?php

namespace App\Http\Controllers;

use App\Models\Repuesto;
use App\Models\Unidad;
use App\Models\MovimientoInventario;
use Illuminate\Http\Request;

class RepuestoController extends Controller
{
    public function index(Request $r)
    {
        $q = Repuesto::with('unidad');
        if ($busqueda = trim((string)$r->get('q', ''))) {
            $q->where(fn($w) => $w->where('codigo','like',"%$busqueda%")->orWhere('nombre','like',"%$busqueda%"));
        }
        $registros = $q->orderBy('nombre')->paginate(25)->withQueryString();
        return view('repuestos.index', compact('registros','busqueda'));
    }

    public function create() { return view('repuestos.form', ['registro' => new Repuesto(['activo'=>true]), 'unidades' => Unidad::where('activo',1)->orderBy('nombre')->get()]); }

    public function store(Request $r)
    {
        Repuesto::create($this->validar($r));
        return redirect()->route('repuestos.index')->with('exito','Repuesto creado.');
    }

    public function edit(Repuesto $repuesto) { return view('repuestos.form', ['registro' => $repuesto, 'unidades' => Unidad::where('activo',1)->orderBy('nombre')->get()]); }

    public function update(Request $r, Repuesto $repuesto)
    {
        $repuesto->update($this->validar($r, $repuesto->id));
        return redirect()->route('repuestos.index')->with('exito','Repuesto actualizado.');
    }

    public function destroy(Repuesto $repuesto)
    {
        try { $repuesto->delete(); return back()->with('exito','Eliminado.'); }
        catch (\Throwable $e) { return back()->with('error','En uso.'); }
    }

    public function entrada(Request $r, Repuesto $repuesto)
    {
        $datos = $r->validate([
            'cantidad' => 'required|numeric|min:0.001',
            'costo_unitario' => 'required|numeric|min:0',
            'motivo' => 'nullable|string|max:200',
        ]);
        MovimientoInventario::create([
            'repuesto_id' => $repuesto->id, 'tipo' => 'entrada',
            'cantidad' => $datos['cantidad'], 'costo_unitario' => $datos['costo_unitario'],
            'costo_total' => $datos['cantidad'] * $datos['costo_unitario'],
            'motivo' => $datos['motivo'] ?? 'Entrada manual', 'usuario_id' => auth()->id(),
        ]);
        $repuesto->increment('stock', $datos['cantidad']);
        $repuesto->update(['costo_unitario' => $datos['costo_unitario']]);
        return back()->with('exito','Entrada registrada.');
    }

    private function validar(Request $r, ?int $id = null): array
    {
        return $r->validate([
            'codigo' => 'required|string|max:40|unique:repuestos,codigo' . ($id ? ",$id" : ''),
            'nombre' => 'required|string|max:200',
            'descripcion' => 'nullable|string',
            'unidad_id' => 'nullable|exists:unidades,id',
            'stock' => 'nullable|numeric|min:0',
            'stock_minimo' => 'nullable|numeric|min:0',
            'costo_unitario' => 'nullable|numeric|min:0',
            'ubicacion' => 'nullable|string|max:100',
            'activo' => 'sometimes|boolean',
        ]) + ['activo' => $r->boolean('activo')];
    }
}
