package dev.lions.unionflow.server.repository;

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

/**
 * Repository pour l'entité Permission
 *
 * @author UnionFlow Team
 * @version 3.0
 * @since 2025-01-29
 */
@ApplicationScoped
public class PermissionRepository implements PanacheRepositoryBase<Permission, UUID> {

  /**
   * Trouve une permission par son UUID
   *
   * @param id UUID de la permission
   * @return Permission ou Optional.empty()
   */
  public Optional<Permission> findPermissionById(UUID id) {
    return find("id = ?1 AND actif = true", id).firstResultOptional();
  }

  /**
   * Trouve une permission par son code
   *
   * @param code Code de la permission
   * @return Permission ou Optional.empty()
   */
  public Optional<Permission> findByCode(String code) {
    return find("code", code).firstResultOptional();
  }

  /**
   * Trouve les permissions par module
   *
   * @param module Nom du module
   * @return Liste des permissions
   */
  public List<Permission> findByModule(String module) {
    return find("LOWER(module) = LOWER(?1) AND actif = true", module).list();
  }

  /**
   * Trouve les permissions par ressource
   *
   * @param ressource Nom de la ressource
   * @return Liste des permissions
   */
  public List<Permission> findByRessource(String ressource) {
    return find("LOWER(ressource) = LOWER(?1) AND actif = true", ressource).list();
  }

  /**
   * Trouve les permissions par module et ressource
   *
   * @param module Nom du module
   * @param ressource Nom de la ressource
   * @return Liste des permissions
   */
  public List<Permission> findByModuleAndRessource(String module, String ressource) {
    return find(
            "LOWER(module) = LOWER(?1) AND LOWER(ressource) = LOWER(?2) AND actif = true",
            module,
            ressource)
        .list();
  }

  /**
   * Trouve toutes les permissions actives
   *
   * @return Liste des permissions actives
   */
  public List<Permission> findAllActives() {
    return find("actif = true", Sort.by("module", Sort.Direction.Ascending)
        .and("ressource", Sort.Direction.Ascending)
        .and("action", Sort.Direction.Ascending)).list();
  }
}



