package dev.lions.unionflow.server.repository.mutuelle.epargne;

import dev.lions.unionflow.server.entity.mutuelle.epargne.CompteEpargne;
import io.quarkus.arc.Unremovable;
import io.quarkus.hibernate.orm.panache.PanacheRepositoryBase;
import jakarta.enterprise.context.ApplicationScoped;

import java.math.BigDecimal;
import java.util.List;
import java.util.UUID;

@ApplicationScoped
@Unremovable
public class CompteEpargneRepository implements PanacheRepositoryBase<CompteEpargne, UUID> {

    /**
     * Somme des soldes actuels des comptes actifs d'un membre (pour dashboard membre).
     */
    public BigDecimal sumSoldeActuelByMembreId(UUID membreId) {
        if (membreId == null) return BigDecimal.ZERO;
        List<CompteEpargne> list = find("membre.id = ?1 and statut = 'ACTIF'", membreId).list();
        return list.stream()
                .map(CompteEpargne::getSoldeActuel)
                .filter(java.util.Objects::nonNull)
                .reduce(BigDecimal.ZERO, BigDecimal::add);
    }

    /**
     * Somme des soldes bloqués des comptes actifs d'un membre (garantie de prêt).
     */
    public BigDecimal sumSoldeBloqueByMembreId(UUID membreId) {
        if (membreId == null) return BigDecimal.ZERO;
        List<CompteEpargne> list = find("membre.id = ?1 and statut = 'ACTIF'", membreId).list();
        return list.stream()
                .map(CompteEpargne::getSoldeBloque)
                .filter(java.util.Objects::nonNull)
                .reduce(BigDecimal.ZERO, BigDecimal::add);
    }

    /**
     * Nombre de comptes épargne actifs d'un membre.
     */
    public long countActifsByMembreId(UUID membreId) {
        if (membreId == null) return 0L;
        return count("membre.id = ?1 and statut = 'ACTIF'", membreId);
    }

    /**
     * Liste tous les comptes d'un membre (tous statuts — pour la page Épargne).
     */
    public List<CompteEpargne> findAllByMembreId(UUID membreId) {
        if (membreId == null) return List.of();
        return find("membre.id = ?1 ORDER BY dateOuverture DESC", membreId).list();
    }
}

