<?php

namespace App\Http\Controllers;

use App\Enums\StatutAnnonce;
use App\Enums\TypeAnnonce;
use App\Models\Annonce;
use Illuminate\Http\Request;

class AnnonceController extends Controller
{

    public function index(Request $request)
    {
        $query = Annonce::query()
            ->where('statut', StatutAnnonce::Publiee)
            ->with(['images', 'marketplaceDetail', 'evenementDetail']);

        // Filtre par catégorie (si valide)
        $categorie = $request->query('categorie');
        if ($categorie && $type = TypeAnnonce::tryFrom($categorie)) {
            $query->where('type', $type);
        }

        // Recherche dans le titre, la description, la localisation
        $q = $request->query('q');
        if ($q) {
            $query->where(function ($sous) use ($q) {
                $sous->where('titre', 'like', "%{$q}%")
                     ->orWhere('description', 'like', "%{$q}%")
                     ->orWhere('localisation', 'like', "%{$q}%");
            });
        }

        // Tri
        $tri = $request->query('tri', 'recentes');
        match ($tri) {
            'populaires' => $query->orderByRaw('(vues + likes) DESC'),
            'vues'       => $query->orderByDesc('vues'),
            default      => $query->latest('publiee_le'),
        };

        $annonces = $query->paginate(12)->withQueryString();

        return view('public.annonces', compact('annonces', 'categorie', 'q', 'tri'));
    }

    public function liv509()
    {
        $livres = Annonce::query()
            ->where('statut', StatutAnnonce::Publiee)
            ->where('type', TypeAnnonce::Livre)
            ->with(['images', 'livreDetail'])
            ->latest('publiee_le')
            ->paginate(18)
            ->withQueryString();

        return view('public.liv509', compact('livres'));
    }

    public function like(Request $request, Annonce $annonce)
    {
        // Seules les annonces publiées peuvent être aimées
        abort_unless($annonce->statut === StatutAnnonce::Publiee, 404);

        $dejaAimees = $request->session()->get('likes', []);

        // Un seul like par annonce et par session
        if (! in_array($annonce->id, $dejaAimees)) {
            $annonce->increment('likes');
            $dejaAimees[] = $annonce->id;
            $request->session()->put('likes', $dejaAimees);
        }

        return back();
    }

    public function show(Annonce $annonce)
    {
        abort_unless($annonce->statut === StatutAnnonce::Publiee, 404);

        $annonce->increment('vues');
        $annonce->load(['images', 'marketplaceDetail', 'evenementDetail', 'emploiDetail', 'annuaireDetail', 'livreDetail']);

        $pertinentes = Annonce::query()
            ->where('statut', StatutAnnonce::Publiee)
            ->where('type', $annonce->type)
            ->where('id', '!=', $annonce->id)
            ->with(['images', 'marketplaceDetail', 'evenementDetail'])
            ->latest('publiee_le')
            ->take(4)
            ->get();

        return view('public.annonce', compact('annonce', 'pertinentes'));
    }
}