package dev.lions.unionflow.server.repository;

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

/**
 * Repository pour l'entité PieceJointe
 *
 * @author UnionFlow Team
 * @version 3.0
 * @since 2025-01-29
 */
@ApplicationScoped
public class PieceJointeRepository implements PanacheRepository<PieceJointe> {

  /**
   * Trouve une pièce jointe par son UUID
   *
   * @param id UUID de la pièce jointe
   * @return Pièce jointe ou Optional.empty()
   */
  public Optional<PieceJointe> findPieceJointeById(UUID id) {
    return find("id = ?1", id).firstResultOptional();
  }

  /**
   * Trouve toutes les pièces jointes d'un document
   *
   * @param documentId ID du document
   * @return Liste des pièces jointes
   */
  public List<PieceJointe> findByDocumentId(UUID documentId) {
    return find("document.id = ?1 ORDER BY ordre ASC", documentId).list();
  }

  /**
   * Trouve toutes les pièces jointes d'un membre
   *
   * @param membreId ID du membre
   * @return Liste des pièces jointes
   */
  public List<PieceJointe> findByMembreId(UUID membreId) {
    return find("membre.id = ?1 ORDER BY ordre ASC", membreId).list();
  }

  /**
   * Trouve toutes les pièces jointes d'une organisation
   *
   * @param organisationId ID de l'organisation
   * @return Liste des pièces jointes
   */
  public List<PieceJointe> findByOrganisationId(UUID organisationId) {
    return find("organisation.id = ?1 ORDER BY ordre ASC", organisationId).list();
  }

  /**
   * Trouve toutes les pièces jointes d'une cotisation
   *
   * @param cotisationId ID de la cotisation
   * @return Liste des pièces jointes
   */
  public List<PieceJointe> findByCotisationId(UUID cotisationId) {
    return find("cotisation.id = ?1 ORDER BY ordre ASC", cotisationId).list();
  }

  /**
   * Trouve toutes les pièces jointes d'une adhésion
   *
   * @param adhesionId ID de l'adhésion
   * @return Liste des pièces jointes
   */
  public List<PieceJointe> findByAdhesionId(UUID adhesionId) {
    return find("adhesion.id = ?1 ORDER BY ordre ASC", adhesionId).list();
  }

  /**
   * Trouve toutes les pièces jointes d'une demande d'aide
   *
   * @param demandeAideId ID de la demande d'aide
   * @return Liste des pièces jointes
   */
  public List<PieceJointe> findByDemandeAideId(UUID demandeAideId) {
    return find("demandeAide.id = ?1 ORDER BY ordre ASC", demandeAideId).list();
  }

  /**
   * Trouve toutes les pièces jointes d'une transaction Wave
   *
   * @param transactionWaveId ID de la transaction Wave
   * @return Liste des pièces jointes
   */
  public List<PieceJointe> findByTransactionWaveId(UUID transactionWaveId) {
    return find("transactionWave.id = ?1 ORDER BY ordre ASC", transactionWaveId).list();
  }
}

