<?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 = Request::orderBy('created_at','desc')
        ->with('user')
        ->whereDeletedAt(null)
        ->paginate(10);

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

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

     }

    /**
     * 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.');
    }
}