<?php

namespace App\Http\Controllers;

use App\Models\Product;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Str;

class ProductStockController extends Controller
{
    /**
     * Liste unifiée des produits avec leurs stocks.
     */
    public function index(Request $request)
    {
        // Accès si l'utilisateur a au moins une des deux permissions
        if (!auth()->user()->hasPermissionTo('products.view') && !auth()->user()->hasPermissionTo('stocks.view')) {
            abort(403, 'Vous n\'êtes pas autorisé à accéder à cette page.');
        }

        $query = Product::with(['category', 'supplier', 'unit'])
            ->withSum('stocks as total_stock', 'actual_quantity')
            ->whereDeletedAt(null)
            ->orderBy('name');

        // Recherche par nom ou référence
        if ($search = $request->get('search')) {
            $query->where(function ($q) use ($search) {
                $q->where('name', 'like', "%{$search}%")
                    ->orWhere('reference', 'like', "%{$search}%");
            });
        }

        // Filtre par catégorie
        if ($categoryId = $request->get('category_id')) {
            $query->where('category_id', $categoryId);
        }

        // Filtre par statut
        if ($status = $request->get('status')) {
            $query->where('status', $status);
        }

        $products = $query->paginate(15)->withQueryString();
        $categories = \App\Models\Category::orderBy('name')->get();

        return view('product-stocks.index', compact('products', 'categories'));
    }

    /**
     * Création d'un nouveau produit.
     */
    public function store(Request $request)
    {
        if (!auth()->user()->hasPermissionTo('products.create')) {
            abort(403, 'Vous n\'êtes pas autorisé à créer un produit.');
        }

        $validated = $request->validate([
            'name' => 'required|string|max:255',
            'category_id' => 'required|exists:categories,id',
            'unit_id' => 'nullable|exists:units,id',
            'supplier_id' => 'required|exists:suppliers,id',
            'initial_quantity' => 'nullable|integer|min:0',
            'alert_threshold' => 'nullable|integer|min:0',
        ]);
        $validated['user_id'] = Auth::id();
        $validated['status'] = 'actif';

        $initialQuantity = (int) ($validated['initial_quantity'] ?? 0);
        unset($validated['initial_quantity'], $validated['alert_threshold']);

        $product = Product::create($validated);

        // Créer le stock initial si une quantité est renseignée
        if ($initialQuantity > 0 && auth()->user()->hasPermissionTo('stocks.create')) {
            \App\Models\Stock::create([
                'reference' => 'STK-' . strtoupper(Str::random(2)),
                'name' => $product->name,
                'product_id' => $product->id,
                'user_id' => Auth::id(),
                'actual_quantity' => $initialQuantity,
                'quantity_available' => $initialQuantity,
                'reserved_quantity' => 0,
            ]);
        }

        return redirect()->route('product-stocks.index')->with('success', 'Produit créé avec succès.');
    }
}
