<?php
namespace App\Http\Controllers\Api;

use App\Models\MovimientoInventario;
use App\Models\Producto;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

class MovimientoInventarioController extends Controller
{
    public function index(Request $request)
    {
        $query = MovimientoInventario::with('producto')
            ->orderByDesc('created_at');

        if ($request->filled('producto_id')) {
            $query->where('producto_id', $request->producto_id);
        }
        if ($request->filled('tipo')) {
            $query->where('tipo', $request->tipo);
        }
        if ($request->filled('fecha_desde')) {
            $query->whereDate('created_at', '>=', $request->fecha_desde);
        }
        if ($request->filled('fecha_hasta')) {
            $query->whereDate('created_at', '<=', $request->fecha_hasta);
        }

        return response()->json($query->limit(500)->get());
    }

    public function store(Request $request)
    {
        $request->validate([
            'producto_id'    => 'required|exists:productos,id',
            'cantidad'       => 'required|integer|min:1',
            'precio_unitario'=> 'nullable|numeric|min:0',
            'motivo'         => 'nullable|string|max:255',
            'actualizar_precio_costo' => 'nullable|boolean',
        ]);

        DB::beginTransaction();
        try {
            $producto = Producto::findOrFail($request->producto_id);

            $precio = $request->precio_unitario ?? $producto->precio_costo;

            MovimientoInventario::create([
                'producto_id'    => $producto->id,
                'tipo'           => 'Entrada',
                'cantidad'       => $request->cantidad,
                'precio_unitario'=> $precio,
                'motivo'         => $request->motivo ?? 'Entrada de stock',
                'usuario'        => $request->usuario ?? 'Sistema',
            ]);

            $producto->increment('stock', $request->cantidad);

            if ($request->boolean('actualizar_precio_costo') && $request->filled('precio_unitario')) {
                $producto->update(['precio_costo' => $request->precio_unitario]);
            }

            DB::commit();
            return response()->json([
                'message' => "Stock actualizado. Nuevo stock: {$producto->fresh()->stock}",
                'producto' => $producto->fresh(),
            ], 201);

        } catch (\Exception $e) {
            DB::rollBack();
            return response()->json(['error' => $e->getMessage()], 400);
        }
    }
}
