package dev.lions.unionflow.server.repository;

import dev.lions.unionflow.server.api.enums.wave.StatutCompteWave;
import dev.lions.unionflow.server.entity.CompteWave;
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 l'entité CompteWave
 *
 * @author UnionFlow Team
 * @version 3.0
 * @since 2025-01-29
 */
@ApplicationScoped
public class CompteWaveRepository implements PanacheRepositoryBase<CompteWave, UUID> {

  /**
   * Trouve un compte Wave par son UUID
   *
   * @param id UUID du compte Wave
   * @return Compte Wave ou Optional.empty()
   */
  public Optional<CompteWave> findCompteWaveById(UUID id) {
    return find("id = ?1 AND actif = true", id).firstResultOptional();
  }

  /**
   * Trouve un compte Wave par numéro de téléphone
   *
   * @param numeroTelephone Numéro de téléphone
   * @return Compte Wave ou Optional.empty()
   */
  public Optional<CompteWave> findByNumeroTelephone(String numeroTelephone) {
    return find("numeroTelephone = ?1 AND actif = true", numeroTelephone).firstResultOptional();
  }

  /**
   * Trouve tous les comptes Wave d'une organisation
   *
   * @param organisationId ID de l'organisation
   * @return Liste des comptes Wave
   */
  public List<CompteWave> findByOrganisationId(UUID organisationId) {
    return find("organisation.id = ?1 AND actif = true", organisationId).list();
  }

  /**
   * Trouve le compte Wave principal d'une organisation (premier vérifié)
   *
   * @param organisationId ID de l'organisation
   * @return Compte Wave ou Optional.empty()
   */
  public Optional<CompteWave> findPrincipalByOrganisationId(UUID organisationId) {
    return find(
        "organisation.id = ?1 AND statutCompte = ?2 AND actif = true",
        organisationId,
        StatutCompteWave.VERIFIE)
        .firstResultOptional();
  }

  /**
   * Trouve tous les comptes Wave d'un membre
   *
   * @param membreId ID du membre
   * @return Liste des comptes Wave
   */
  public List<CompteWave> findByMembreId(UUID membreId) {
    return find("membre.id = ?1 AND actif = true", membreId).list();
  }

  /**
   * Trouve le compte Wave principal d'un membre (premier vérifié)
   *
   * @param membreId ID du membre
   * @return Compte Wave ou Optional.empty()
   */
  public Optional<CompteWave> findPrincipalByMembreId(UUID membreId) {
    return find(
        "membre.id = ?1 AND statutCompte = ?2 AND actif = true",
        membreId,
        StatutCompteWave.VERIFIE)
        .firstResultOptional();
  }

  /**
   * Trouve tous les comptes Wave vérifiés
   *
   * @return Liste des comptes Wave vérifiés
   */
  public List<CompteWave> findComptesVerifies() {
    return find("statutCompte = ?1 AND actif = true", StatutCompteWave.VERIFIE).list();
  }
}
