package dev.lions.unionflow.server.repository;

import dev.lions.unionflow.server.api.enums.abonnement.PlageMembres;
import dev.lions.unionflow.server.api.enums.abonnement.TypeFormule;
import dev.lions.unionflow.server.entity.FormuleAbonnement;
import jakarta.enterprise.context.ApplicationScoped;

import java.util.List;
import java.util.Optional;

/**
 * Repository pour le catalogue des formules d'abonnement UnionFlow.
 *
 * <p>La combinaison (code, plage) est unique : 12 formules au total
 * (3 niveaux × 4 tranches de taille).
 *
 * @author UnionFlow Team
 * @version 1.0
 * @since 2026-03-30
 */
@ApplicationScoped
public class FormuleAbonnementRepository extends BaseRepository<FormuleAbonnement> {

    public FormuleAbonnementRepository() {
        super(FormuleAbonnement.class);
    }

    /**
     * Trouve une formule par son code et sa plage de membres.
     *
     * @param code  niveau de formule (BASIC, STANDARD, PREMIUM)
     * @param plage tranche de membres
     * @return la formule correspondante
     */
    public Optional<FormuleAbonnement> findByCodeAndPlage(TypeFormule code, PlageMembres plage) {
        return find("code = ?1 and plage = ?2 and actif = true", code, plage)
                .firstResultOptional();
    }

    /**
     * Liste toutes les formules actives, triées par ordre d'affichage.
     */
    public List<FormuleAbonnement> findAllActifOrderByOrdre() {
        return find("actif = true order by ordreAffichage asc").list();
    }

    /**
     * Liste toutes les formules d'une plage donnée.
     */
    public List<FormuleAbonnement> findByPlage(PlageMembres plage) {
        return find("plage = ?1 and actif = true order by ordreAffichage asc", plage).list();
    }

    /**
     * Liste toutes les formules d'un niveau donné (BASIC, STANDARD ou PREMIUM).
     */
    public List<FormuleAbonnement> findByCode(TypeFormule code) {
        return find("code = ?1 and actif = true order by ordreAffichage asc", code).list();
    }
}
