package dev.lions.unionflow.server.repository;

import dev.lions.unionflow.server.entity.SystemConfigPersistence;
import io.quarkus.arc.Unremovable;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.transaction.Transactional;

import java.util.Optional;

/**
 * Repository pour la persistance des paramètres système en base de données.
 * Remplace le stockage AtomicReference en RAM pour les clés critiques
 * (maintenance_mode, scheduled_maintenance, etc.).
 *
 * Étend BaseRepository pour cohérence avec le reste du projet et accès
 * à EntityManager.
 */
@ApplicationScoped
@Unremovable
public class SystemConfigPersistenceRepository extends BaseRepository<SystemConfigPersistence> {

    public SystemConfigPersistenceRepository() {
        super(SystemConfigPersistence.class);
    }

    /**
     * Cherche une entrée de configuration par clé.
     */
    public Optional<SystemConfigPersistence> findByKey(String key) {
        return find("configKey", key).firstResultOptional();
    }

    /**
     * Crée ou met à jour une valeur de configuration.
     */
    @Transactional
    public void setValue(String key, String value) {
        Optional<SystemConfigPersistence> existing = findByKey(key);
        if (existing.isPresent()) {
            existing.get().setConfigValue(value);
            persist(existing.get());
        } else {
            persist(SystemConfigPersistence.builder()
                    .configKey(key)
                    .configValue(value)
                    .build());
        }
    }

    /**
     * Retourne la valeur d'une clé, ou {@code defaultValue} si absente.
     */
    public String getValue(String key, String defaultValue) {
        return findByKey(key)
                .map(SystemConfigPersistence::getConfigValue)
                .orElse(defaultValue);
    }

    /**
     * Retourne la valeur booléenne d'une clé, ou {@code defaultValue} si absente.
     */
    public boolean getBooleanValue(String key, boolean defaultValue) {
        String val = getValue(key, null);
        return val != null ? Boolean.parseBoolean(val) : defaultValue;
    }
}
