package dev.lions.unionflow.server.repository;

import dev.lions.unionflow.server.entity.Role;
import dev.lions.unionflow.server.entity.Role.TypeRole;
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é Role
 *
 * @author UnionFlow Team
 * @version 3.0
 * @since 2025-01-29
 */
@ApplicationScoped
public class RoleRepository implements PanacheRepository<Role> {

  /**
   * Trouve un rôle par son code
   *
   * @param code Code du rôle
   * @return Rôle ou Optional.empty()
   */
  public Optional<Role> findByCode(String code) {
    return find("code", code).firstResultOptional();
  }

  /**
   * Trouve tous les rôles système
   *
   * @return Liste des rôles système
   */
  public List<Role> findRolesSysteme() {
    return find("typeRole = ?1 AND actif = true", TypeRole.SYSTEME)
        .order("niveauHierarchique ASC")
        .list();
  }

  /**
   * Trouve tous les rôles d'une organisation
   *
   * @param organisationId ID de l'organisation
   * @return Liste des rôles
   */
  public List<Role> findByOrganisationId(UUID organisationId) {
    return find("organisation.id = ?1 AND actif = true", organisationId)
        .order("niveauHierarchique ASC")
        .list();
  }

  /**
   * Trouve tous les rôles actifs
   *
   * @return Liste des rôles actifs
   */
  public List<Role> findAllActifs() {
    return find("actif = true").order("niveauHierarchique ASC").list();
  }

  /**
   * Trouve les rôles par type
   *
   * @param typeRole Type de rôle
   * @return Liste des rôles
   */
  public List<Role> findByType(TypeRole typeRole) {
    return find("typeRole = ?1 AND actif = true", typeRole)
        .order("niveauHierarchique ASC")
        .list();
  }
}

