package infrastructure.mapper;

import com.banesco.common.domain.model.redis.UserAccountRedis;
import com.banesco.common.infraestructure.helpers.AccountHelper;
import domain.model.CustomerAccount;

import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

/**
 * Clase de utilidad para mapear (convertir) objetos del dominio
 * a objetos específicos para la caché de Redis y viceversa.
 */
public class CacheMapper {

    // Constructor privado para que nadie pueda instanciar esta clase de utilidad.
    private CacheMapper() {}

    /**
     * Convierte una lista de BankingProduct (modelo de dominio) a una lista
     * de UserAccountRedis (modelo de caché).
     *
     * @param bankingProducts La lista de productos a convertir.
     * @param sid El Session ID que se asignará a cada objeto en la caché.
     * @param customerId El ID del cliente.
     * @return Una lista de UserAccountRedis lista para ser guardada en Redis.
     */
    public static List<UserAccountRedis> toUserAccountRedisList(List<CustomerAccount> bankingProducts, String sid, String customerId, String otp) {
        if (bankingProducts == null || bankingProducts.isEmpty()) {
            return Collections.emptyList();
        }

        return bankingProducts.stream()
                .map(product -> toUserAccountRedis(product, sid, customerId, otp))
                .collect(Collectors.toList());
    }

    /**
     * Lógica de conversión para un único objeto.
     */
    private static UserAccountRedis toUserAccountRedis(CustomerAccount product, String sid, String customerId, String otp) {
        var redisAccount = new UserAccountRedis();
        redisAccount.setSid(sid);
        redisAccount.setCustomerId(customerId);
        redisAccount.setClearAccount(product.getCuenta());
        redisAccount.setMaskedAccount(AccountHelper.getMaskedAccountId(product.getCuenta()));
        redisAccount.setCurrency(product.getMoneda().trim());
        redisAccount.setAccountType(product.getTipoCta());
        redisAccount.setUsername(customerId);
        redisAccount.setOtp(otp);

        return redisAccount;
    }


}