package dev.lions.unionflow.server.repository;

import dev.lions.unionflow.server.entity.Favori;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.persistence.TypedQuery;
import java.util.List;
import java.util.UUID;

/**
 * Repository pour l'entité Favori
 * 
 * @author UnionFlow Team
 * @version 1.0
 */
@ApplicationScoped
public class FavoriRepository extends BaseRepository<Favori> {

    public FavoriRepository() {
        super(Favori.class);
    }

    /**
     * Trouve tous les favoris d'un utilisateur, triés par ordre
     */
    public List<Favori> findByUtilisateurId(UUID utilisateurId) {
        TypedQuery<Favori> query = entityManager.createQuery(
            "SELECT f FROM Favori f WHERE f.utilisateurId = :utilisateurId AND f.actif = true ORDER BY f.ordre ASC, f.titre ASC",
            Favori.class);
        query.setParameter("utilisateurId", utilisateurId);
        return query.getResultList();
    }

    /**
     * Trouve les favoris d'un utilisateur par type
     */
    public List<Favori> findByUtilisateurIdAndType(UUID utilisateurId, String typeFavori) {
        TypedQuery<Favori> query = entityManager.createQuery(
            "SELECT f FROM Favori f WHERE f.utilisateurId = :utilisateurId AND f.typeFavori = :typeFavori AND f.actif = true ORDER BY f.ordre ASC",
            Favori.class);
        query.setParameter("utilisateurId", utilisateurId);
        query.setParameter("typeFavori", typeFavori);
        return query.getResultList();
    }

    /**
     * Trouve les favoris les plus utilisés d'un utilisateur
     */
    public List<Favori> findPlusUtilisesByUtilisateurId(UUID utilisateurId, int limit) {
        TypedQuery<Favori> query = entityManager.createQuery(
            "SELECT f FROM Favori f WHERE f.utilisateurId = :utilisateurId AND f.actif = true ORDER BY f.nbVisites DESC, f.derniereVisite DESC",
            Favori.class);
        query.setParameter("utilisateurId", utilisateurId);
        query.setMaxResults(limit);
        return query.getResultList();
    }

    /**
     * Compte les favoris par type pour un utilisateur
     */
    public long countByUtilisateurIdAndType(UUID utilisateurId, String typeFavori) {
        TypedQuery<Long> query = entityManager.createQuery(
            "SELECT COUNT(f) FROM Favori f WHERE f.utilisateurId = :utilisateurId AND f.typeFavori = :typeFavori AND f.actif = true",
            Long.class);
        query.setParameter("utilisateurId", utilisateurId);
        query.setParameter("typeFavori", typeFavori);
        return query.getSingleResult();
    }
}

