<?php

namespace App\Http\Controllers;

use App\Models\Stock;
use App\Models\Product;
use App\Models\Category;
use Illuminate\Support\Str;
use Illuminate\Http\Request;
use App\Exports\ProductStocksExport;
use Illuminate\Support\Facades\Auth;
use Maatwebsite\Excel\Facades\Excel;

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 (category_id peut être un hashId)
        if ($categoryHash = $request->get('category_id')) {
            $categoryId = Category::keyFromHashId($categoryHash);
            if ($categoryId !== null) {
                $query->where('category_id', $categoryId);
            }
        }

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

        $products = $query->paginate(15)->withQueryString();
        $categories = 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.');
        }

        // Convertir les chaînes vides en null pour la validation
        $request->merge([
            'minimum_threshold' => $request->input('minimum_threshold') ?: null,
            'initial_quantity' => $request->input('initial_quantity') ?: null,
        ]);

        $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',
            'minimum_threshold' => 'nullable|integer|min:0',
        ]);
        $validated['user_id'] = Auth::id();
        $validated['status'] = 'actif';
        $initialQuantity = (int) ($validated['initial_quantity'] ?? 0);

        // Ignorer ces valeurs lors de l'enregistrement du produit
        unset($validated['initial_quantity']);

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

        // Créer le stock initial si une quantité est renseignée
        if ($initialQuantity > 0 && auth()->user()->hasPermissionTo('stocks.create')) {
            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.');
    }

    /**
     * Mise à jour d'un produit.
     */
    public function update(Request $request, Product $product)
    {
        $this->authorize('update', $product);

        $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',
            'status' => 'required|in:actif,archivé',
            'stock_quantity' => 'nullable|integer|min:1',
            'minimum_threshold' => 'nullable|integer|min:5',
        ]);

        //Le produit est actif par défaut lors de l'enregistrement
        $validated['status'] = 'actif';

        $stockQuantity = isset($validated['stock_quantity']) ? (int) $validated['stock_quantity'] : null;
        unset($validated['stock_quantity']);

        $product->update($validated);

        // Mise à jour du stock si l'utilisateur a la permission
        if ($stockQuantity !== null && auth()->user()->hasPermissionTo('stocks.update')) {
            $stocks = $product->stocks()->get();
            if ($stocks->isEmpty()) {
                // Créer un stock si aucun n'existe
                if (auth()->user()->hasPermissionTo('stocks.create')) {
                    Stock::create([
                        'reference' => 'STK-' . strtoupper(Str::random(2)),
                        'name' => $product->name,
                        'product_id' => $product->id,
                        'user_id' => Auth::id(),
                        'actual_quantity' => $stockQuantity,
                        'quantity_available' => $stockQuantity,
                        'reserved_quantity' => 0,

                    ]);
                }
            } else {
                // Mettre à jour le premier stock (cas simple : 1 produit = 1 stock)
                $stock = $stocks->first();
                $stock->update([
                    'actual_quantity' => $stockQuantity,
                    'quantity_available' => $stockQuantity,
                ]);
            }
        }

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

    /**
     * Suppression d'un produit.
     */
    public function destroy(Product $product)
    {
        $this->authorize('delete', $product);

        $product->delete();

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

    /**
     * Archivons le produit
     *
     * */

    public function archive(Product $product)
    {
        $this->authorize('update', $product);

        $product->update(['status' => 'archivé']);

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

    /**
     * Export des produits et stocks (avec filtres appliqués).
     */
    public function export(Request $request)
    {
        if (!auth()->user()->hasPermissionTo('products.view') && !auth()->user()->hasPermissionTo('stocks.view')) {
            abort(403, 'Vous n\'êtes pas autorisé à exporter les données.');
        }

        $search = $request->get('search');
        $categoryHash = $request->get('category_id');
        $categoryId = $categoryHash ? Category::keyFromHashId($categoryHash) : null;
        $status = $request->get('status');

        $export = new ProductStocksExport($search, $categoryId, $status);

        $filename = 'produits-stocks_' . now()->format('Y-m-d_His') . '.xlsx';

        return Excel::download($export, $filename);
    }
}