package application.service;

import com.banesco.common.infraestructure.helpers.LoggerHelper;
import com.banesco.common.infraestructure.repository.PostgresRedisRepository;
import domain.entity.AppConfiguration;
import infrastructure.mapper.PostgresMapper;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import lombok.extern.slf4j.Slf4j;

import java.util.Optional;

@Slf4j
@ApplicationScoped
public class PostgresConfigService {

    @Inject
    PostgresRedisRepository postgresRedisRepository;

    /**
     * Recibe una entidad AppConfiguration de la lógica de negocio y la mapea
     * a un CustomerAccountPostgresConfig del "commons" para guardarla en Redis.
     */
    public void savePostgresConfig(String configName, AppConfiguration appConfigItem, long ttlInSeconds, String requestId) {
        log.info(LoggerHelper.buildInfoPrivateRequest(requestId, "Iniciando guardado de configuracion postgres en Redis", appConfigItem.toString()));

        try {
            var commonConfigToSave = PostgresMapper.mapToCommon(appConfigItem);
            postgresRedisRepository.save(configName, commonConfigToSave, ttlInSeconds);
            log.info(LoggerHelper.buildInfoPrivateRequest(requestId, "Guardado exitoso en Redis. Clave: " + configName));
        } catch (Exception ex) {
            log.error(LoggerHelper.buildError(requestId, "Error al intentar guardar configuracion de postgres en Redis"), ex);
        }
    }

    /**
     * Busca una configuración en Redis por su nombre (clave).
     *
     * @param configName La clave de Redis (ej: el appId).
     * @param requestId  El ID de la traza para logging.
     * @return Un Optional con la entidad AppConfiguration si se encuentra en caché.
     */
    public Optional<AppConfiguration> findByName(String configName, String requestId) {
        log.info(LoggerHelper.buildInfoPrivateRequest(requestId, "Buscando configuracion en Redis. Clave: " + configName));
        try {
            var commonConfigOpt = postgresRedisRepository.findByName(configName);

            if (commonConfigOpt.isEmpty()) {
                log.info(LoggerHelper.buildInfoPrivateRequest(requestId, "Cache miss para clave: " + configName));
                return Optional.empty();
            }

            log.info(LoggerHelper.buildInfoPrivateRequest(requestId, "Cache hit para clave: " + configName));

            return Optional.of(PostgresMapper.mapToApp(commonConfigOpt.get()));

        } catch (Exception ex) {
            log.error(LoggerHelper.buildError(requestId, "Error al intentar leer configuracion de postgres en Redis"), ex);
            // Si hay error en Redis, es mejor tratarlo como un "cache miss" (no encontrado)
            return Optional.empty();
        }
    }
}