<?php

namespace App\Http\Controllers;

use App\Models\Insumo;
use App\Http\Requests\InsumoRequest;
use App\Services\KardexService;
use Illuminate\Http\Request;

class InsumoController extends Controller
{
    public function index(Request $request)
    {
        $sucursalId = session('sucursal_id');

        $insumos = Insumo::with(['stocks' => fn($q) => $q->where('sucursal_id', $sucursalId)])
            ->when($request->search, fn($q) => $q->where('nombre', 'like', "%{$request->search}%"))
            ->when($request->estado === 'alerta', fn($q) =>
        $q->whereHas('stocks', fn($s) =>
        $s->where('sucursal_id', $sucursalId)->whereRaw('cantidad_actual < cantidad_minima')
        )
        )
            ->when($request->activo !== null, fn($q) => $q->where('activo', $request->activo))
            ->orderBy('nombre')
            ->paginate(25)
            ->withQueryString();

        return view('insumos.index', compact('insumos', 'sucursalId'));
    }

    public function create()
    {
        return view('insumos.create');
    }

    public function store(InsumoRequest $request, KardexService $kardex)
    {
        $insumo = Insumo::create($request->validated());

        // Crear registro de stock inicial en todas las sucursales del usuario
        $sucursales = auth()->user()->hasRole('admin')
            ?\App\Models\Sucursal::activas()->pluck('id')
            : auth()->user()->sucursales()->pluck('sucursales.id');

        foreach ($sucursales as $sid) {
            \App\Models\InsumoStock::firstOrCreate(
            ['insumo_id' => $insumo->id, 'sucursal_id' => $sid],
            ['cantidad_actual' => 0, 'cantidad_minima' => 0]
            );
        }

        return redirect()->route('insumos.index')
            ->with('success', "Insumo \"{$insumo->nombre}\" creado correctamente.");
    }

    public function show(Insumo $insumo)
    {
        $sucursalId = session('sucursal_id');
        // Carga explícita de todas las relaciones que usa la vista show
        $insumo->load([
            'stocks',
            'recetaIngredientes.receta', // para "Usado en recetas"
        ]);
        $stock = $insumo->stocks->where('sucursal_id', $sucursalId)->first();
        $kardex = \App\Models\Kardex::where('insumo_id', $insumo->id)
            ->where('sucursal_id', $sucursalId)
            ->with('usuario') // cargamos el usuario para evitar N+1
            ->latest()
            ->take(20)
            ->get();

        return view('insumos.show', compact('insumo', 'stock', 'kardex'));
    }

    public function edit(Insumo $insumo)
    {
        return view('insumos.edit', compact('insumo'));
    }

    public function update(InsumoRequest $request, Insumo $insumo)
    {
        $costoAnterior = $insumo->costo_unitario;
        $factorAnterior = $insumo->factor_conversion;
        $insumo->update($request->validated());

        // Si cambió el costo O el factor, disparar evento para recalcular recetas en caché
        if ($costoAnterior != $insumo->costo_unitario || $factorAnterior != $insumo->factor_conversion) {
            event(new \App\Events\InsumoActualizado($insumo));
        }

        return redirect()->route('insumos.index')
            ->with('success', "Insumo \"{$insumo->nombre}\" actualizado.");
    }

    public function destroy(Insumo $insumo)
    {
        // No eliminar si tiene movimientos en kardex
        if ($insumo->kardex()->exists()) {
            return back()->withErrors(['error' =>
                'No se puede eliminar: el insumo tiene movimientos en el kardex. Desactívalo en su lugar.'
            ]);
        }

        $nombre = $insumo->nombre;
        $insumo->delete();

        return redirect()->route('insumos.index')
            ->with('success', "Insumo \"{$nombre}\" eliminado.");
    }

    // AJAX: verificar nombre duplicado en tiempo real (capa 3)
    public function verificarNombre(Request $request)
    {
        $existe = Insumo::where('nombre', $request->nombre)
            ->when($request->id, fn($q) => $q->where('id', '!=', $request->id))
            ->exists();

        return response()->json(['existe' => $existe]);
    }
}