<?php

namespace App\Http\Controllers;

use App\Models\{Insumo, InsumoStock, Kardex};
use App\Services\KardexService;
use App\Services\PreCompraService;
use App\Http\Requests\InventarioAjusteRequest;
use Illuminate\Http\Request;
use Maatwebsite\Excel\Facades\Excel;

class AlmacenController extends Controller
{
    public function __construct(private KardexService $kardex, private PreCompraService $preCompraService) {}

    public function index(Request $request)
    {
        $sucursalId = session('sucursal_id');

        $stocks = InsumoStock::deSucursal($sucursalId)
            ->with('insumo')
            ->when($request->estado === 'alerta', fn($q) => $q->conAlerta())
            ->when($request->estado === 'sin_stock', fn($q) => $q->where('cantidad_actual', 0))
            ->when($request->search, fn($q) =>
                $q->whereHas('insumo', fn($i) => $i->where('nombre', 'like', "%{$request->search}%"))
            )
            ->orderByRaw('cantidad_actual < cantidad_minima DESC')
            ->paginate(30)
            ->withQueryString();

        $resumen = [
            'total'   => InsumoStock::deSucursal($sucursalId)->count(),
            'alerta'  => InsumoStock::deSucursal($sucursalId)->conAlerta()->count(),
            'sinStock'=> InsumoStock::deSucursal($sucursalId)->where('cantidad_actual', 0)->count(),
        ];

        $insumosBajos = $this->preCompraService->obtenerInsumosBajos($sucursalId);
        $faltantes = [];
        foreach ($insumosBajos as $insumo) {
            $stockActual = $insumo->getStockActual($sucursalId);
            $stockMin = $insumo->stock_minimo ?? 0;
            $stockMax = $insumo->stock_maximo ?? 100;
            $reorden = max(0, $stockMax - $stockActual);

            $faltantes[] = [
                'insumo_id' => $insumo->id,
                'nombre' => $insumo->nombre,
                'unidad' => $insumo->unidad_uso,
                'costo' => $insumo->costo_unitario ?? 0,
                'stock_actual' => $stockActual,
                'stock_minimo' => $stockMin,
                'reorden' => $reorden
            ];
        }

        return view('almacen.index', compact('stocks', 'resumen', 'faltantes'));
    }

    public function kardex(Request $request)
    {
        $sucursalId = session('sucursal_id');

        $movimientos = Kardex::deSucursal($sucursalId)
            ->with(['insumo', 'usuario'])
            ->when($request->insumo_id, fn($q) => $q->where('insumo_id', $request->insumo_id))
            ->when($request->tipo, fn($q) => $q->where('tipo', $request->tipo))
            ->when($request->desde, fn($q) => $q->whereDate('created_at', '>=', $request->desde))
            ->when($request->hasta, fn($q) => $q->whereDate('created_at', '<=', $request->hasta))
            ->latest()
            ->paginate(30)
            ->withQueryString();

        $insumos = Insumo::activos()->orderBy('nombre')->get(['id', 'nombre']);

        return view('almacen.kardex', compact('movimientos', 'insumos'));
    }

    public function ajuste(InventarioAjusteRequest $request)
    {

        $this->kardex->registrarMovimiento(
            insumoId:   $request->insumo_id,
            sucursalId: session('sucursal_id'),
            tipo:       $request->tipo,
            cantidad:   $request->cantidad,
            motivo:     $request->motivo,
        );

        return back()->with('success', 'Movimiento registrado correctamente.');
    }

    public function exportar(Request $request)
    {
        // Exportar kardex filtrado a Excel
        $sucursalId = session('sucursal_id');
        $desde      = $request->get('desde', now()->startOfMonth()->toDateString());
        $hasta      = $request->get('hasta', now()->toDateString());

        $movimientos = Kardex::deSucursal($sucursalId)
            ->with(['insumo', 'usuario'])
            ->whereDate('created_at', '>=', $desde)
            ->whereDate('created_at', '<=', $hasta)
            ->oldest()
            ->get();

        return response()->streamDownload(function () use ($movimientos) {
            $handle = fopen('php://output', 'w');
            fputcsv($handle, ['Fecha', 'Insumo', 'Tipo', 'Cantidad', 'Saldo Anterior', 'Saldo Posterior', 'Motivo', 'Usuario']);
            foreach ($movimientos as $m) {
                fputcsv($handle, [
                    $m->created_at->format('d/m/Y H:i'),
                    $m->insumo->nombre,
                    $m->tipo,
                    $m->cantidad,
                    $m->saldo_anterior,
                    $m->saldo_posterior,
                    $m->motivo,
                    $m->usuario->name ?? '—',
                ]);
            }
            fclose($handle);
        }, "kardex_{$desde}_{$hasta}.csv", ['Content-Type' => 'text/csv']);
    }

    public function autoRequerimiento(Request $request)
    {
        $request->validate([
            'items' => 'required|array',
            'items.*.insumo_id' => 'required|exists:insumos,id',
            'items.*.cantidad' => 'required|numeric|min:0.001',
        ]);

        $orden = $this->preCompraService->generarDesdeArreglo(
            session('sucursal_id'),
            $request->items,
            'Generada automáticamente desde Requerimientos de Almacén'
        );

        return back()
            ->with('success', "Requerimiento generado automáticamente (OC: {$orden->numero}). Logística será notificada.");
    }
}