<?php

namespace App\Http\Controllers;

use App\Models\Componente;
use App\Models\Equipo;
use Illuminate\Http\Request;

class ComponenteController extends Controller
{
    public function index(Request $r)
    {
        $q = Componente::with('equipo.area');
        if ($busqueda = trim((string)$r->get('q', ''))) {
            $q->where(fn($w) => $w->where('codigo','like',"%$busqueda%")->orWhere('nombre','like',"%$busqueda%"));
        }
        if ($equipo_id = $r->integer('equipo_id')) $q->where('equipo_id', $equipo_id);
        $registros = $q->orderBy('codigo')->paginate(25)->withQueryString();
        $equipos = Equipo::where('activo',1)->orderBy('nombre')->get();
        return view('catalogos.componentes_index', compact('registros','busqueda','equipos','equipo_id'));
    }

    public function create()
    {
        return view('catalogos.componentes_form', [
            'registro' => new Componente(['activo' => true]),
            'equipos' => Equipo::where('activo',1)->orderBy('nombre')->get(),
        ]);
    }

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

    public function edit(Componente $componente)
    {
        return view('catalogos.componentes_form', [
            'registro' => $componente,
            'equipos' => Equipo::where('activo',1)->orderBy('nombre')->get(),
        ]);
    }

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

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

    private function validar(Request $r, ?int $id = null): array
    {
        return $r->validate([
            'equipo_id' => 'required|exists:equipos,id',
            'codigo' => 'required|string|max:40',
            'nombre' => 'required|string|max:200',
            'descripcion' => 'nullable|string',
            'unidad' => 'nullable|string|max:30',
            'activo' => 'sometimes|boolean',
        ]) + ['activo' => $r->boolean('activo')];
    }
}
