package dev.lions.unionflow.server.repository;

import dev.lions.unionflow.server.entity.PieceJointe;
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é PieceJointe
 *
 * @author UnionFlow Team
 * @version 3.0
 * @since 2025-01-29
 */
@ApplicationScoped
public class PieceJointeRepository implements PanacheRepositoryBase<PieceJointe, UUID> {

  /**
   * 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 (entité rattachée de type MEMBRE).
   *
   * @param membreId ID du membre
   * @return Liste des pièces jointes
   */
  public List<PieceJointe> findByMembreId(UUID membreId) {
    return find("typeEntiteRattachee = 'MEMBRE' AND entiteRattacheeId = ?1 ORDER BY ordre ASC", membreId).list();
  }

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

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

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

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

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



