package dev.lions.unionflow.server.repository;

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

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

  /**
   * Trouve un document par son hash MD5
   *
   * @param hashMd5 Hash MD5
   * @return Document ou Optional.empty()
   */
  public Optional<Document> findByHashMd5(String hashMd5) {
    return find("hashMd5 = ?1 AND actif = true", hashMd5).firstResultOptional();
  }

  /**
   * Trouve un document par son hash SHA256
   *
   * @param hashSha256 Hash SHA256
   * @return Document ou Optional.empty()
   */
  public Optional<Document> findByHashSha256(String hashSha256) {
    return find("hashSha256 = ?1 AND actif = true", hashSha256).firstResultOptional();
  }

  /**
   * Trouve les documents par type
   *
   * @param type Type de document
   * @return Liste des documents
   */
  public List<Document> findByType(TypeDocument type) {
    return find("typeDocument = ?1 AND actif = true ORDER BY dateCreation DESC", type).list();
  }

  /**
   * Trouve tous les documents actifs
   *
   * @return Liste des documents actifs
   */
  public List<Document> findAllActifs() {
    return find("actif = true ORDER BY dateCreation DESC").list();
  }

  /**
   * Trouve les documents créés par un utilisateur (par email)
   *
   * @param email Email de l'utilisateur (creePar)
   * @return Liste des documents
   */
  public List<Document> findByCreePar(String email) {
    return find("creePar = ?1 AND actif = true ORDER BY dateCreation DESC", email).list();
  }
}



