package dev.lions.unionflow.server.repository;

import dev.lions.unionflow.server.entity.MemberBlock;
import io.quarkus.hibernate.orm.panache.PanacheRepositoryBase;
import jakarta.enterprise.context.ApplicationScoped;
import java.util.List;
import java.util.Optional;
import java.util.UUID;

/**
 * Repository pour les blocages entre membres.
 *
 * @author UnionFlow Team
 * @version 4.0
 * @since 2026-04-13
 */
@ApplicationScoped
public class MemberBlockRepository implements PanacheRepositoryBase<MemberBlock, UUID> {

    /**
     * Vérifie si un membre en a bloqué un autre dans une organisation.
     */
    public boolean estBloque(UUID bloqueurId, UUID bloqueId, UUID organisationId) {
        return count("bloqueur.id = ?1 AND bloque.id = ?2 AND organisation.id = ?3 AND actif = true",
            bloqueurId, bloqueId, organisationId) > 0;
    }

    /**
     * Trouve le blocage entre deux membres dans une organisation.
     */
    public Optional<MemberBlock> findBlocage(UUID bloqueurId, UUID bloqueId, UUID organisationId) {
        return find("bloqueur.id = ?1 AND bloque.id = ?2 AND organisation.id = ?3 AND actif = true",
            bloqueurId, bloqueId, organisationId
        ).firstResultOptional();
    }

    /**
     * Liste tous les membres bloqués par un membre dans toutes ses organisations.
     */
    public List<MemberBlock> findByBloqueur(UUID bloqueurId) {
        return find("bloqueur.id = ?1 AND actif = true", bloqueurId).list();
    }

    /**
     * Liste les blocages actifs d'un membre dans une organisation spécifique.
     */
    public List<MemberBlock> findByBloqueurEtOrganisation(UUID bloqueurId, UUID organisationId) {
        return find("bloqueur.id = ?1 AND organisation.id = ?2 AND actif = true",
            bloqueurId, organisationId).list();
    }
}
