package dev.lions.unionflow.server.repository;

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

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

    public SuggestionRepository() {
        super(Suggestion.class);
    }

    /**
     * Trouve toutes les suggestions actives, triées par nombre de votes décroissant
     */
    public List<Suggestion> findAllActivesOrderByVotes() {
        TypedQuery<Suggestion> query = entityManager.createQuery(
            "SELECT s FROM Suggestion s WHERE s.actif = true ORDER BY s.nbVotes DESC, s.dateSoumission DESC",
            Suggestion.class);
        return query.getResultList();
    }

    /**
     * Trouve les suggestions d'un utilisateur
     */
    public List<Suggestion> findByUtilisateurId(UUID utilisateurId) {
        TypedQuery<Suggestion> query = entityManager.createQuery(
            "SELECT s FROM Suggestion s WHERE s.utilisateurId = :utilisateurId AND s.actif = true ORDER BY s.dateSoumission DESC",
            Suggestion.class);
        query.setParameter("utilisateurId", utilisateurId);
        return query.getResultList();
    }

    /**
     * Trouve les suggestions par statut
     */
    public List<Suggestion> findByStatut(String statut) {
        TypedQuery<Suggestion> query = entityManager.createQuery(
            "SELECT s FROM Suggestion s WHERE s.statut = :statut AND s.actif = true ORDER BY s.nbVotes DESC",
            Suggestion.class);
        query.setParameter("statut", statut);
        return query.getResultList();
    }

    /**
     * Compte les suggestions par statut
     */
    public long countByStatut(String statut) {
        TypedQuery<Long> query = entityManager.createQuery(
            "SELECT COUNT(s) FROM Suggestion s WHERE s.statut = :statut AND s.actif = true",
            Long.class);
        query.setParameter("statut", statut);
        return query.getSingleResult();
    }

    /**
     * Trouve les suggestions les plus populaires (top N)
     */
    public List<Suggestion> findTopByVotes(int limit) {
        TypedQuery<Suggestion> query = entityManager.createQuery(
            "SELECT s FROM Suggestion s WHERE s.actif = true ORDER BY s.nbVotes DESC, s.dateSoumission DESC",
            Suggestion.class);
        query.setMaxResults(limit);
        return query.getResultList();
    }
}

