<?php

namespace App\Http\Controllers;

use App\Models\Product;
use App\Models\Department;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Gate;
use App\Models\Request as RequestModel;
use App\Notifications\RequestStatusNotification;

class RequestController extends Controller
{
    /**
     * Liste des demandes
     */

    public function index()
    {
        $demandes = RequestModel::orderBy('created_at', 'desc')
            ->with(['user', 'department', 'requestDetails.product'])
            ->whereDeletedAt(null)
            ->paginate(10);

        $departments = Department::latest()->whereDeletedAt(null)->get();
        $products = Product::latest()->whereDeletedAt(null)->get();

        return view('requests.index', compact('demandes', 'departments', 'products'));
    }

    /**
     * Enregistrement de la demande
     */
    public function store(Request $request)
    {
        $validated = $request->validate([
            'department_id' => 'required|exists:departments,id',
            'product_id' => 'required|exists:products,id',
            'quantity' => 'required|integer|min:1',
            'comments' => 'nullable|string|max:500',
        ]);

        $requestModel = RequestModel::create([
            'department_id' => $validated['department_id'],
            'user_id' => Auth::id(),
            'created_by' => Auth::id(),
            'type' => 'Approvisionnement',
            'status' => 'en_attente',
            'comments' => $validated['comments'] ?? null,
        ]);

        $requestModel->requestDetails()->create([
            'product_id' => $validated['product_id'],
            'quantity' => $validated['quantity'],
        ]);

        return redirect()->route('requests.index')->with('success', 'La demande a été créée avec succès.');
    }

    /**
     * Modifier une demande (uniquement si en attente)
     */
    public function update(Request $httpRequest, RequestModel $request)
    {
        Gate::authorize('update', $request);

        $validated = $httpRequest->validate([
            'department_id' => 'required|exists:departments,id',
            'product_id' => 'required|exists:products,id',
            'quantity' => 'required|integer|min:1',
            'comments' => 'nullable|string|max:255',
        ]);

        $request->update([
            'department_id' => $validated['department_id'],
            'comments' => $validated['comments'] ?? null,
        ]);

        // Mettre à jour le produit et la quantité
        $firstDetail = $request->requestDetails->first();
        // Si le produit existe, mettre à jour la quantité
        if ($firstDetail) {
            $firstDetail->update([
                'product_id' => $validated['product_id'],
                'quantity' => $validated['quantity'],
            ]);
        } else {
            // Si le produit n'existe pas, créer un nouveau détail
            $request->requestDetails()->create([
                'product_id' => $validated['product_id'],
                'quantity' => $validated['quantity'],
            ]);
        }

        return redirect()->route('requests.index')->with('success', 'La demande a été modifiée avec succès.');
    }

    /**
     * Approuver une demande
     */
    public function approve(RequestModel $request)
    {
        // Vérifier l'autorisation
        Gate::authorize('approve', $request);

        // Mettre à jour le statut
        $request->update([
            'status' => 'validée',
            'approved_by' => Auth::id(),
            'approved_at' => now(),
        ]);

        // Envoyer une notification à l'utilisateur qui a créé la demande
        if ($request->user) {
            $request->user->notify(new RequestStatusNotification($request, 'validée', Auth::user()));
        }

        return redirect()->back()->with('success', 'La demande a été approuvée avec succès !');
    }

    /**
     * Rejeter une demande
     */
    public function reject(Request $httpRequest, RequestModel $request)
    {
        // Vérifier l'autorisation
        Gate::authorize('reject', $request);

        // Validation du motif de rejet (optionnel mais recommandé)
        $httpRequest->validate([
            'rejection_reason' => 'nullable|string|max:500',
        ]);

        // Mettre à jour le statut
        $request->update([
            'status' => 'rejetée',
            'rejected_by' => Auth::id(),
            'rejected_at' => now(),
            'rejection_reason' => $httpRequest->input('rejection_reason'),
        ]);

        // Envoyer une notification à l'utilisateur qui a créé la demande
        if ($request->user) {
            $request->user->notify(new RequestStatusNotification($request, 'rejetée', Auth::user()));
        }

        return redirect()->back()->with('success', 'La demande a été rejetée.');
    }

    /**
     * Marquer une notification comme lue
     */
    public function markNotificationAsRead($notificationId)
    {
        $notification = Auth::user()->notifications()->findOrFail($notificationId);
        $notification->markAsRead();

        return redirect()->back();
    }

    /**
     * Marquer toutes les notifications comme lues
     */
    public function markAllNotificationsAsRead()
    {
        Auth::user()->unreadNotifications->markAsRead();

        return redirect()->back()->with('success', 'Toutes les notifications ont été marquées comme lues.');
    }
}
