<?php

namespace App\Http\Controllers;

use App\Models\Magasin;
use App\Models\Mouvement;
use App\Models\Produit;
use App\Models\Stock;
use App\Models\Transfert;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

class TransfertStockController extends Controller
{
    /**
     * Liste des transfert de stock entre magasin
     */
    public function index()
    {
        $transferts = Transfert::with(['magasinOrigine', 'magasinDestination', 'produit'])->latest()->paginate(15)->withQueryString();
        $magasins = Magasin::orderBy('nom')->get(['id', 'nom']);
        $produits = Produit::orderBy('designation')->get(['id', 'designation', 'reference']);

        return view('transferts.index', compact('transferts', 'magasins', 'produits'));
    }

    /**
     * Créer un nouveau transfert de stock entre magasin
     */
    public function store(Request $request)
    {
        $validated = $request->validate([
            'magasin_origine_id' => 'required|exists:magasins,id',
            'magasin_destination_id' => 'required|exists:magasins,id',
            'produit_id' => 'required|exists:produits,id',
            'quantite' => 'required|integer|min:1',
            'date_transfert' => 'required|date',
        ]);

        // Vérification magasin origine != destination
        if ($validated['magasin_origine_id'] == $validated['magasin_destination_id']) {
            return redirect()->route('transferts.index')
                ->with('error', 'Le magasin d\'origine doit être différent du magasin de destination');
        }

        DB::transaction(function () use ($validated) {

            // 🔒 Calcul du stock actuel dans le magasin d'origine avec verrouillage
            $stockDisponible = Mouvement::where('produit_id', $validated['produit_id'])
                ->where('magasin_id', $validated['magasin_origine_id'])
                ->lockForUpdate()
                ->selectRaw("
                    COALESCE(SUM(
                        CASE WHEN type = 'entree' THEN quantite
                             WHEN type = 'sortie' THEN -quantite
                        END
                    ),0) as stock
                ")
                ->value('stock');

            if ($stockDisponible < $validated['quantite']) {
                throw new \Exception('Quantité demandée supérieure au stock disponible');
            }

            // 1️⃣ Créer le transfert
            $transfert = Transfert::create($validated);

            // 2️⃣ Créer le mouvement sortie pour le magasin origine
            Mouvement::create([
                'produit_id' => $validated['produit_id'],
                'magasin_id' => $validated['magasin_origine_id'],
                'type' => Mouvement::TYPE_SORTIE,
                'quantite' => $validated['quantite'],
                'reference_type' => Transfert::class,
                'reference_id' => $transfert->id,
                'created_by' => auth()->id(),
            ]);

            // 3Créer le mouvement entrée pour le magasin destination
            Mouvement::create([
                'produit_id' => $validated['produit_id'],
                'magasin_id' => $validated['magasin_destination_id'],
                'type' => Mouvement::TYPE_ENTREE,
                'quantite' => $validated['quantite'],
                'reference_type' => Transfert::class,
                'reference_id' => $transfert->id,
                'created_by' => auth()->id(),
            ]);
        });

        return redirect()->route('transferts.index')
            ->with('success', 'Transfert de stock créé avec succès');
    }

    /**
     * Display the specified resource.
     */
    public function show(string $id)
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     */
    public function edit(string $id)
    {
        //
    }

    /**
     * Mise à jour du transfer de stock entre magasin
     */
    public function update(Request $request, string $id)
    {
        $validated = $request->validate([
            'magasin_origine_id' => 'required|exists:magasins,id',
            'magasin_destination_id' => 'required|exists:magasins,id',
            'produit_id' => 'required|exists:produits,id',
            'quantite' => 'required|integer|min:1',
            'date_transfert' => 'required|date',
        ]);

        $transfert = Transfert::findOrFail(Transfert::keyFromHashId($id));
        $transfert->update($validated);

        return redirect()->route('transferts.index')->with('success', 'Transfert de stock mis à jour avec succès');
    }

    /**
     * Suppression d'un transfer de stock .
     */
    public function destroy(string $id)
    {
        $transfert = Transfert::findOrFail(Transfert::keyFromHashId($id));
        //On vérifie
        $transfert->delete();

        return redirect()->route('transferts.index')->with('success', 'Transfert de stock supprimé avec succès');
    }
}
