<?php

namespace App\Http\Controllers;

use App\Models\Area;
use App\Models\Equipo;
use App\Models\Sistema;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;

class EquipoController extends Controller
{
    public function index(Request $r)
    {
        $q = Equipo::with(['area','sistema'])->withCount(['componentes','ordenes']);
        if ($busqueda = trim((string)$r->get('q', ''))) {
            $q->where(fn($w) => $w->where('codigo','like',"%$busqueda%")->orWhere('nombre','like',"%$busqueda%"));
        }
        if ($area_id = $r->integer('area_id')) $q->where('area_id', $area_id);
        if ($sistema_id = $r->integer('sistema_id')) $q->where('sistema_id', $sistema_id);
        $registros = $q->orderBy('codigo')->paginate(25)->withQueryString();
        $areas = Area::where('activo',1)->orderBy('nombre')->get();
        $sistemas = Sistema::where('activo',1)->orderBy('nombre')->get();
        return view('catalogos.equipos_index', compact('registros','busqueda','areas','sistemas','area_id','sistema_id'));
    }

    public function create()
    {
        return view('catalogos.equipos_form', [
            'registro' => new Equipo(['activo' => true, 'horometro_actual' => 0]),
            'areas' => Area::where('activo',1)->orderBy('nombre')->get(),
            'sistemas' => Sistema::where('activo',1)->orderBy('nombre')->get(),
        ]);
    }

    public function store(Request $r)
    {
        $datos = $this->validar($r);
        $datos['imagen'] = $this->guardarImagen($r);
        Equipo::create($datos);
        return redirect()->route('equipos.index')->with('exito','Equipo creado.');
    }

    public function edit(Equipo $equipo)
    {
        return view('catalogos.equipos_form', [
            'registro' => $equipo,
            'areas' => Area::where('activo',1)->orderBy('nombre')->get(),
            'sistemas' => Sistema::where('activo',1)->orderBy('nombre')->get(),
        ]);
    }

    public function update(Request $r, Equipo $equipo)
    {
        $datos = $this->validar($r, $equipo->id);
        if ($r->hasFile('imagen')) $datos['imagen'] = $this->guardarImagen($r);
        $equipo->update($datos);
        return redirect()->route('equipos.index')->with('exito','Equipo actualizado.');
    }

    public function destroy(Equipo $equipo)
    {
        try { $equipo->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([
            'area_id' => 'required|exists:areas,id',
            'sistema_id' => 'nullable|exists:sistemas,id',
            'codigo' => 'required|string|max:40|unique:equipos,codigo' . ($id ? ",$id" : ''),
            'nombre' => 'required|string|max:200',
            'descripcion' => 'nullable|string',
            'marca' => 'nullable|string|max:100',
            'modelo' => 'nullable|string|max:100',
            'serie' => 'nullable|string|max:100',
            'ubicacion' => 'nullable|string|max:200',
            'fecha_instalacion' => 'nullable|date',
            'horometro_actual' => 'nullable|numeric|min:0',
            'activo' => 'sometimes|boolean',
        ]) + ['activo' => $r->boolean('activo')];
    }

    private function guardarImagen(Request $r): ?string
    {
        if (!$r->hasFile('imagen')) return null;
        return $r->file('imagen')->store('equipos', 'public');
    }
}
