<?php

namespace App\Http\Controllers;

use App\Models\Product;
use Illuminate\Http\Request;
use Illuminate\Validation\Rule; // Necesario para validar unicidad al editar

class ProductosController extends Controller
{
    /**
     * Muestra la lista de productos con buscador y paginación.
     */
    public function index(Request $request)
    {
        // Recuperamos lo que el usuario escribió en el buscador (si escribió algo)
        $query = $request->input('search');

        // Construimos la consulta
        $products = Product::query()
            ->when($query, function ($q) use ($query) {
                // Si hay búsqueda, filtra por nombre o SKU
                return $q->where('name', 'like', "%{$query}%")
                         ->orWhere('sku', 'like', "%{$query}%");
            })
            ->orderBy('stock_quantity', 'asc') // Ordenamos primero los que tienen poco stock (Alerta visual)
            ->paginate(10) // Paginamos de a 10
            ->withQueryString(); // Mantiene el filtro de búsqueda al cambiar de página

        return view('productos.index', compact('products'));
    }

    /**
     * Muestra el formulario de creación.
     */
    public function create()
    {
        return view('productos.create');
    }

    /**
     * Guarda el producto nuevo en la base de datos.
     */
    public function store(Request $request)
    {
        // 1. Validamos los datos con las nuevas columnas
        $validated = $request->validate([
            'name'            => 'required|string|max:255',
            'sku'             => 'nullable|string|unique:products,sku|max:50', // SKU único
            'description'     => 'nullable|string',
            'price'           => 'required|numeric|min:0',
            'cost'            => 'nullable|numeric|min:0', // Costo opcional
            'stock_quantity'  => 'required|integer|min:0',
            'min_stock_alert' => 'required|integer|min:0',
            'type'            => 'required|in:bike,accessory,service', // Solo permite estos 3 valores
            'serial_number'   => 'nullable|string|max:100',
        ]);

        // 2. Si no viene SKU, generamos uno automático (Opcional pero útil)
        if (empty($validated['sku'])) {
            $validated['sku'] = 'GEN-' . strtoupper(uniqid()); 
        }

        // 3. Creamos el producto
        Product::create($validated);

        // 4. Redireccionamos con mensaje de éxito (Necesitas el componente Alert en el layout)
        return redirect()->route('productos.index')
            ->with('success', 'Producto creado correctamente.');
    }

    /**
     * Muestra el detalle de un producto.
     * Usamos Route Model Binding: Laravel busca el ID solo.
     */
    public function show(Product $producto) 
    {
        return view('productos.show', compact('producto'));
    }

    /**
     * Muestra el formulario de edición.
     */
    public function edit(Product $producto)
    {
        return view('productos.edit', compact('producto'));
    }

    /**
     * Actualiza el producto existente.
     */
    public function update(Request $request, Product $producto)
    {
        $validated = $request->validate([
            'name'            => 'required|string|max:255',
            // Validamos que el SKU sea único PERO ignoramos el ID de este producto actual
            'sku'             => ['nullable', 'string', Rule::unique('products')->ignore($producto->id)],
            'description'     => 'nullable|string',
            'price'           => 'required|numeric|min:0',
            'cost'            => 'nullable|numeric|min:0',
            'stock_quantity'  => 'required|integer|min:0',
            'min_stock_alert' => 'required|integer|min:0',
            'type'            => 'required|in:bike,accessory,service',
            'serial_number'   => 'nullable|string|max:100',
        ]);

        $producto->update($validated);

        return redirect()->route('productos.index')
            ->with('success', 'Producto actualizado exitosamente.');
    }

    /**
     * Elimina el producto.
     */
    public function destroy(Product $producto)
    {
        $producto->delete();
        return redirect()->route('productos.index')
            ->with('success', 'Producto eliminado.');
    }

    /**
     * Vista simplificada para consultar precios (empleados).
     */
    public function checker(Request $request)
    {
        $search = $request->input('query');
        $result = null;

        if ($search) {
            $result = Product::where('sku', $search)
                           ->orWhere('name', 'like', "%{$search}%")
                           ->first(); // Devuelve el primer resultado encontrado
        }

        return view('productos.checker', compact('result', 'search'));
    }
}