package dev.lions.unionflow.server.repository;

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

  /**
   * Trouve une association rôle-permission par son UUID
   *
   * @param id UUID de l'association
   * @return Association ou Optional.empty()
   */
  public Optional<RolePermission> findRolePermissionById(UUID id) {
    return find("id = ?1 AND actif = true", id).firstResultOptional();
  }

  /**
   * Trouve toutes les permissions d'un rôle
   *
   * @param roleId ID du rôle
   * @return Liste des associations rôle-permission
   */
  public List<RolePermission> findByRoleId(UUID roleId) {
    return find("role.id = ?1 AND actif = true", roleId).list();
  }

  /**
   * Trouve tous les rôles ayant une permission spécifique
   *
   * @param permissionId ID de la permission
   * @return Liste des associations rôle-permission
   */
  public List<RolePermission> findByPermissionId(UUID permissionId) {
    return find("permission.id = ?1 AND actif = true", permissionId).list();
  }

  /**
   * Trouve une association spécifique rôle-permission
   *
   * @param roleId ID du rôle
   * @param permissionId ID de la permission
   * @return Association ou null
   */
  public RolePermission findByRoleAndPermission(UUID roleId, UUID permissionId) {
    return find("role.id = ?1 AND permission.id = ?2", roleId, permissionId).firstResult();
  }
}



