package dev.lions.unionflow.server.repository;

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

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

    public ConfigurationRepository() {
        super(Configuration.class);
    }

    /**
     * Trouve une configuration par sa clé
     */
    public Optional<Configuration> findByCle(String cle) {
        TypedQuery<Configuration> query = entityManager.createQuery(
                "SELECT c FROM Configuration c WHERE c.cle = :cle AND c.actif = true",
                Configuration.class);
        query.setParameter("cle", cle);
        return query.getResultList().stream().findFirst();
    }

    /**
     * Trouve toutes les configurations actives, triées par catégorie
     */
    public List<Configuration> findAllActives() {
        TypedQuery<Configuration> query = entityManager.createQuery(
                "SELECT c FROM Configuration c WHERE c.actif = true ORDER BY c.categorie ASC, c.cle ASC",
                Configuration.class);
        return query.getResultList();
    }

    /**
     * Trouve les configurations par catégorie
     */
    public List<Configuration> findByCategorie(String categorie) {
        TypedQuery<Configuration> query = entityManager.createQuery(
                "SELECT c FROM Configuration c WHERE c.categorie = :categorie AND c.actif = true ORDER BY c.cle ASC",
                Configuration.class);
        query.setParameter("categorie", categorie);
        return query.getResultList();
    }

    /**
     * Trouve les configurations visibles
     */
    public List<Configuration> findVisibles() {
        TypedQuery<Configuration> query = entityManager.createQuery(
                "SELECT c FROM Configuration c WHERE c.visible = true AND c.actif = true ORDER BY c.categorie ASC, c.cle ASC",
                Configuration.class);
        return query.getResultList();
    }
}
