<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use App\Models\Achat;
use App\Models\Fournisseur;
use App\Models\Mouvement;
use App\Models\Produit;
use App\Models\Stock;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

class AchatController extends Controller
{
    /**
     * Liste des achats de produit.
     */
    public function index()
    {
        $achats = Achat::with(['fournisseur', 'produit'])
            ->latest('date_achat')
            ->paginate(10)
            ->withQueryString();

        $fournisseurs = Fournisseur::whereNull('deleted_at')->orderBy('nom', 'desc')->get();
        $produits = Produit::whereNull('deleted_at')->orderBy('designation', 'desc')->get();

        return view('achats.index', compact('achats', 'fournisseurs', 'produits'));
    }


    /**
     * Ajouter un achat de produit.
     */
    public function store(Request $request)
    {
        $validated = $this->validateAchat($request);

        DB::transaction(function () use ($validated) {
            // Créer l'achat
            Achat::create($validated);

            // Mettre à jour le stock et créer le mouvement
            $this->updateStockAndMouvement($validated['produit_id'], $validated['magasin_id'], $validated['quantite']);
        });

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

    /**
     * Mettre à jour un achat de produit.
     */
    public function update(Request $request, string $id)
    {
        $validated = $this->validateAchat($request);

        DB::transaction(function () use ($validated, $id) {
            $achat = Achat::findOrFail(Achat::keyFromHashId($id));

            // Calculer la différence de quantité
            $diff = $validated['quantite'] - $achat->quantite;

            // Mettre à jour l'achat
            $achat->update($validated);

            // Mettre à jour le stock et créer le mouvement avec la différence
            if ($diff !== 0) {
                $this->updateStockAndMouvement($validated['produit_id'], $validated['magasin_id'], $diff);
            }
        });

        return redirect()->route('achats.index')->with('success', 'Achat mis à jour avec succès');
    }

    /**
     * Validation centralisée pour store et update
     */
    private function validateAchat(Request $request)
    {
        return $request->validate([
            'fournisseur_id' => 'required|exists:fournisseurs,id',
            'produit_id' => 'required|exists:produits,id',
            'magasin_id' => 'required|exists:magasins,id',
            'quantite' => 'required|integer|min:1',
            'montant' => 'required|numeric|min:0',
            'statut_achat' => 'required|in:soldé,impayé',
            'date_achat' => 'required|date',
        ]);
    }

    /**
     * Met à jour le stock et crée un mouvement de stock
     */
    private function updateStockAndMouvement(int $produitId, int $magasinId, int $quantite)
    {
        // Mettre à jour ou créer le stock
        Stock::updateOrCreate(
            ['produit_id' => $produitId],
            ['quantite' => DB::raw("COALESCE(quantite,0) + {$quantite}")]
        );

        // Ajouter le mouvement de stock
        Mouvement::create([
            'type' => Mouvement::TYPE_ENTREE,
            'magasin_id' => $magasinId,
            'produit_id' => $produitId,
            'quantite' => $quantite,
            'user_id' => auth()->id(),
        ]);
    }

    /**
     * Supprimer un achat de produit.
     */
    public function destroy(string $id)
    {
        $achat = Achat::findOrFail(Achat::keyFromHashId($id));

        //Vérifie si l'achat est lié à un produit vendu ou retour
        if ($achat->produit->ventes->count() > 0 || $achat->produit->retours->count() > 0) {
            return redirect()->route('achats.index')->with('error', 'Achat lié à un produit vendu ou retourné. Impossible de supprimer.');
        }

        $achat->delete();

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