<?php

namespace App\Http\Controllers\Web;

use App\Http\Controllers\Controller;
use App\Models\HardwareInventario;
use App\Models\HardwareMaestro;
use App\Models\HardwareMarca;
use App\Models\Concesion;
use App\Models\MovimientoInventario;
use App\Models\ViaSubcentro;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

class InventarioController extends Controller
{
    /**
     * Listado de equipos del inventario
     */
    public function index(Request $request)
    {
        // Datos para filtros
        $tiposHardware = HardwareMaestro::activos()->ordenados()->get();
        $marcas = HardwareMarca::activos()->orderBy('nombre')->get();
        $concesiones = Concesion::activas()->orderBy('nombre')->get();

        // Query base
        $query = HardwareInventario::with([
            'tipoHardware',
            'marca',
        ]);

        // Filtros
        if ($request->filled('tipo')) {
            $query->where('maestro_id', $request->tipo);
        }

        if ($request->filled('marca')) {
            $query->where('marca_id', $request->marca);
        }

        if ($request->filled('concesion')) {
            $query->whereHas('checklistRespuestas.via.centro', function ($q) use ($request) {
                $q->where('id_concesion', $request->concesion);
            });
        }

        if ($request->filled('peaje')) {
            $query->whereHas('checklistRespuestas.via', function ($q) use ($request) {
                $q->where('id_centro', $request->peaje);
            });
        }

        if ($request->filled('estado')) {
            $query->where('estado', $request->estado);
        }

        if ($request->filled('buscar')) {
            $buscar = $request->buscar;
            $query->where(function ($q) use ($buscar) {
                $q->where('codigo1', 'like', "%{$buscar}%")
                  ->orWhere('codigo2', 'like', "%{$buscar}%")
                  ->orWhere('modelo', 'like', "%{$buscar}%");
            });
        }

        // Ordenar
        $query->orderBy('inventario_id', 'desc');

        // Estadísticas
        $estadisticas = [
            'total' => HardwareInventario::count(),
            'activos' => HardwareInventario::where('estado', 1)->count(),
            'inactivos' => HardwareInventario::where('estado', 0)->count(),
            'por_tipo' => HardwareMaestro::activos()
                ->withCount(['inventario' => fn($q) => $q->where('estado', 1)])
                ->orderBy('nombre')
                ->get(),
        ];

        // Paginar
        $equipos = $query->paginate(20)->appends($request->query());

        return view('modules.inventario.index', compact(
            'equipos',
            'tiposHardware',
            'marcas',
            'concesiones',
            'estadisticas'
        ));
    }

    /**
     * Formulario para crear equipo
     */
    public function create()
    {
        $tiposHardware = HardwareMaestro::activos()->ordenados()->get();
        $marcas = HardwareMarca::activos()->orderBy('nombre')->get();

        return view('modules.inventario.create', compact(
            'tiposHardware',
            'marcas'
        ));
    }

    /**
     * Guardar nuevo equipo
     */
    public function store(Request $request)
    {
        $request->validate([
            'maestro_id' => 'required|exists:hardware_maestro,hardware_id',
            'marca_id' => 'required|exists:hardware_marca,marca_id',
            'modelo' => 'required|string|max:100',
            'codigo1' => 'required|string|max:50|unique:hardware_inventario,codigo1',
            'codigo2' => 'nullable|string|max:50',
            'observacion' => 'nullable|string|max:500',
        ]);

        HardwareInventario::create([
            'maestro_id' => $request->maestro_id,
            'marca_id' => $request->marca_id,
            'modelo' => $request->modelo,
            'codigo1' => $request->codigo1,
            'codigo2' => $request->codigo2,
            'observacion' => $request->observacion,
            'estado' => 1,
        ]);

        return redirect()
            ->route('web.inventario.index')
            ->with('success', 'Equipo registrado exitosamente.');
    }

    /**
     * Detalle del equipo
     */
    public function show($id)
    {
        $equipo = HardwareInventario::with([
            'tipoHardware',
            'marca',
            'checklistRespuestas' => function ($q) {
                $q->with(['programacion.tecnico', 'itemRevision', 'estadoEquipo', 'via.centro.concesion'])
                  ->orderBy('fecha_registro', 'desc')
                  ->limit(20);
            }
        ])->findOrFail($id);

        // Historial de mantenimientos
        $historialMantenimientos = DB::table('mant_checklist_respuestas as cr')
            ->join('mant_programacion as p', 'cr.prog_id', '=', 'p.prog_id')
            ->join('mant_estados as e', 'p.estado_id', '=', 'e.estado_id')
            ->leftJoin('usuarios as u', 'p.tecnico_asignado', '=', 'u.usu_id')
            ->where('cr.inventario_id', $id)
            ->select(
                'p.prog_id',
                'p.fecha_programada',
                'e.estado_nombre',
                'e.color_hex',
                DB::raw("CONCAT(u.usu_nombre, ' ', u.usu_apellido) as tecnico"),
                DB::raw('COUNT(cr.respuesta_id) as items_revisados')
            )
            ->groupBy('p.prog_id', 'p.fecha_programada', 'e.estado_nombre', 'e.color_hex', 'tecnico')
            ->orderBy('p.fecha_programada', 'desc')
            ->limit(10)
            ->get();

        // Historial de movimientos del inventario
        $historialMovimientos = MovimientoInventario::with(['via.centro.concesion', 'usuarioCrea'])
            ->where('inventario_id', $id)
            ->orderBy('fecha', 'desc')
            ->limit(20)
            ->get();

        return view('modules.inventario.show', compact('equipo', 'historialMantenimientos', 'historialMovimientos'));
    }

    /**
     * Formulario de edición
     */
    public function edit($id)
    {
        $equipo = HardwareInventario::with(['tipoHardware', 'marca'])->findOrFail($id);
        $tiposHardware = HardwareMaestro::activos()->ordenados()->get();
        $marcas = HardwareMarca::activos()->orderBy('nombre')->get();

        return view('modules.inventario.edit', compact(
            'equipo',
            'tiposHardware',
            'marcas'
        ));
    }

    /**
     * Actualizar equipo
     */
    public function update(Request $request, $id)
    {
        $equipo = HardwareInventario::findOrFail($id);

        $request->validate([
            'maestro_id' => 'required|exists:hardware_maestro,hardware_id',
            'marca_id' => 'required|exists:hardware_marca,marca_id',
            'modelo' => 'required|string|max:100',
            'codigo1' => 'required|string|max:50|unique:hardware_inventario,codigo1,' . $id . ',inventario_id',
            'codigo2' => 'nullable|string|max:50',
            'observacion' => 'nullable|string|max:500',
            'estado' => 'required|in:0,1',
        ]);

        $equipo->update([
            'maestro_id' => $request->maestro_id,
            'marca_id' => $request->marca_id,
            'modelo' => $request->modelo,
            'codigo1' => $request->codigo1,
            'codigo2' => $request->codigo2,
            'observacion' => $request->observacion,
            'estado' => $request->estado,
        ]);

        return redirect()
            ->route('web.inventario.index')
            ->with('success', 'Equipo actualizado exitosamente.');
    }

    /**
     * API: Obtener vías de un peaje
     */
    public function getViasPeaje($peajeId)
    {
        $vias = ViaSubcentro::where('id_centro', $peajeId)
            ->activas()
            ->orderBy('nombre')
            ->get(['via_id', 'nombre']);

        return response()->json($vias);
    }

    /**
     * Exportar inventario a Excel/CSV
     */
    public function exportar(Request $request)
    {
        // TODO: Implementar exportación
        return back()->with('info', 'Función de exportación en desarrollo.');
    }
}
