package dev.lions.unionflow.server.service;
import dev.lions.unionflow.server.entity.Configuration;
import dev.lions.unionflow.server.repository.ConfigurationRepository;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import java.math.BigDecimal;
import java.util.Optional;
import org.jboss.logging.Logger;
/**
* Service centralisé pour la lecture des valeurs
* par défaut depuis la table {@code configurations}.
*
*
* Élimine tous les littéraux magiques
* ({@code "XOF"}, {@code "ACTIVE"},
* {@code "ASSOCIATION"}, etc.) dispersés dans le
* code métier. Chaque service injecte ce service
* au lieu de coder en dur ses valeurs par défaut.
*
*
* Clés standardisées :
*
* - {@code defaut.devise} → {@code XOF}
*
- {@code defaut.statut.organisation}
* → {@code ACTIVE}
*
- {@code defaut.type.organisation}
* → {@code ASSOCIATION}
*
- {@code defaut.utilisateur.systeme}
* → {@code system}
*
*
* @author UnionFlow Team
* @version 3.0
* @since 2026-02-21
*/
@ApplicationScoped
public class DefaultsService {
private static final Logger LOG = Logger.getLogger(DefaultsService.class);
@Inject
ConfigurationRepository configRepo;
// ── Clés standardisées ─────────────────────
/** Clé : devise par défaut. */
public static final String CLE_DEVISE = "defaut.devise";
/** Clé : statut organisation par défaut. */
public static final String CLE_STATUT_ORG = "defaut.statut.organisation";
/** Clé : type organisation par défaut. */
public static final String CLE_TYPE_ORG = "defaut.type.organisation";
/** Clé : utilisateur système (audit). */
public static final String CLE_USER_SYSTEME = "defaut.utilisateur.systeme";
/** Clé : montant cotisation par défaut. */
public static final String CLE_MONTANT_COTISATION = "defaut.montant.cotisation";
// ── Fallbacks compilés ─────────────────────
private static final String FALLBACK_DEVISE = "XOF";
private static final String FALLBACK_STATUT_ORG = "ACTIVE";
private static final String FALLBACK_TYPE_ORG = "ASSOCIATION";
private static final String FALLBACK_USER = "system";
// ── API publique ───────────────────────────
/**
* Retourne la devise par défaut.
*
* @return code devise (ex: {@code "XOF"})
*/
public String getDevise() {
return getString(CLE_DEVISE, FALLBACK_DEVISE);
}
/**
* Retourne le statut par défaut d'une
* organisation.
*
* @return code statut (ex: {@code "ACTIVE"})
*/
public String getStatutOrganisation() {
return getString(
CLE_STATUT_ORG, FALLBACK_STATUT_ORG);
}
/**
* Retourne le type par défaut d'une
* organisation.
*
* @return code type (ex: {@code "ASSOCIATION"})
*/
public String getTypeOrganisation() {
return getString(
CLE_TYPE_ORG, FALLBACK_TYPE_ORG);
}
/**
* Retourne le nom de l'utilisateur système.
*
* @return identifiant système
*/
public String getUtilisateurSysteme() {
return getString(CLE_USER_SYSTEME, FALLBACK_USER);
}
/**
* Retourne le montant de cotisation par défaut.
*
* @return montant ou {@code BigDecimal.ZERO}
*/
public BigDecimal getMontantCotisation() {
return getDecimal(
CLE_MONTANT_COTISATION, BigDecimal.ZERO);
}
// ── Méthodes utilitaires ───────────────────
/**
* Lit une valeur String depuis la table
* {@code configurations}.
*
* @param cle clé de configuration
* @param fallback valeur de repli
* @return la valeur en base ou le fallback
*/
public String getString(
String cle, String fallback) {
try {
Optional config = configRepo.findByCle(cle);
if (config.isPresent()
&& config.get().getValeur() != null
&& !config.get().getValeur().isBlank()) {
return config.get().getValeur();
}
} catch (Exception e) {
LOG.debugf(
"Configuration '%s' indisponible: %s",
cle, e.getMessage());
}
return fallback;
}
/**
* Lit une valeur BigDecimal depuis la table
* {@code configurations}.
*
* @param cle clé de configuration
* @param fallback valeur de repli
* @return la valeur en base ou le fallback
*/
public BigDecimal getDecimal(
String cle, BigDecimal fallback) {
String val = getString(cle, null);
if (val != null) {
try {
return new BigDecimal(val);
} catch (NumberFormatException e) {
LOG.warnf(
"Valeur non numérique pour '%s': %s",
cle, val);
}
}
return fallback;
}
/**
* Lit une valeur Boolean depuis la table
* {@code configurations}.
*
* @param cle clé de configuration
* @param fallback valeur de repli
* @return la valeur en base ou le fallback
*/
public boolean getBoolean(
String cle, boolean fallback) {
String val = getString(cle, null);
if (val != null) {
return Boolean.parseBoolean(val);
}
return fallback;
}
/**
* Lit une valeur int depuis la table
* {@code configurations}.
*
* @param cle clé de configuration
* @param fallback valeur de repli
* @return la valeur en base ou le fallback
*/
public int getInt(String cle, int fallback) {
String val = getString(cle, null);
if (val != null) {
try {
return Integer.parseInt(val);
} catch (NumberFormatException e) {
LOG.warnf(
"Valeur non entière pour '%s': %s",
cle, val);
}
}
return fallback;
}
}