package dev.lions.unionflow.server.repository;

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

/**
 * Repository pour l'entité {@link TypeOrganisationEntity}.
 *
 * <p>Permet de gérer le catalogue des types d'organisations.
 */
@ApplicationScoped
public class TypeOrganisationRepository extends BaseRepository<TypeOrganisationEntity> {

  public TypeOrganisationRepository() {
    super(TypeOrganisationEntity.class);
  }

  /** Recherche un type par son code fonctionnel. */
  public Optional<TypeOrganisationEntity> findByCode(String code) {
    TypedQuery<TypeOrganisationEntity> query =
        entityManager.createQuery(
            "SELECT t FROM TypeOrganisationEntity t WHERE UPPER(t.code) = UPPER(:code)",
            TypeOrganisationEntity.class);
    query.setParameter("code", code);
    return query.getResultStream().findFirst();
  }

  /** Liste les types actifs, triés par ordreAffichage puis libellé. */
  public List<TypeOrganisationEntity> listActifsOrdennes() {
    return entityManager
        .createQuery(
            "SELECT t FROM TypeOrganisationEntity t "
                + "WHERE t.actif = true "
                + "ORDER BY COALESCE(t.ordreAffichage, 9999), t.libelle",
            TypeOrganisationEntity.class)
        .getResultList();
  }
}


