package dev.lions.unionflow.server.repository;

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

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

  /**
   * Trouve un compte par son numéro
   *
   * @param numeroCompte Numéro du compte
   * @return Compte ou Optional.empty()
   */
  public Optional<CompteComptable> findByNumeroCompte(String numeroCompte) {
    return find("numeroCompte = ?1 AND actif = true", numeroCompte).firstResultOptional();
  }

  /**
   * Trouve les comptes par type
   *
   * @param type Type de compte
   * @return Liste des comptes
   */
  public List<CompteComptable> findByType(TypeCompteComptable type) {
    return find("typeCompte = ?1 AND actif = true ORDER BY numeroCompte ASC", type).list();
  }

  /**
   * Trouve les comptes par classe comptable
   *
   * @param classe Classe comptable (1-7)
   * @return Liste des comptes
   */
  public List<CompteComptable> findByClasse(Integer classe) {
    return find("classeComptable = ?1 AND actif = true ORDER BY numeroCompte ASC", classe).list();
  }

  /**
   * Trouve tous les comptes actifs
   *
   * @return Liste des comptes actifs
   */
  public List<CompteComptable> findAllActifs() {
    return find("actif = true ORDER BY numeroCompte ASC").list();
  }

  /**
   * Trouve les comptes de trésorerie
   *
   * @return Liste des comptes de trésorerie
   */
  public List<CompteComptable> findComptesTresorerie() {
    return find("typeCompte = ?1 AND actif = true ORDER BY numeroCompte ASC", TypeCompteComptable.TRESORERIE)
        .list();
  }

  /**
   * Trouve un compte par organisation et numéro de compte (plan comptable tenant-scoped).
   */
  public Optional<CompteComptable> findByOrganisationAndNumero(UUID organisationId, String numeroCompte) {
    return find("organisation.id = ?1 AND numeroCompte = ?2 AND actif = true", organisationId, numeroCompte)
        .firstResultOptional();
  }

  /**
   * Trouve tous les comptes actifs d'une organisation.
   */
  public List<CompteComptable> findByOrganisation(UUID organisationId) {
    return find("organisation.id = ?1 AND actif = true ORDER BY numeroCompte ASC", organisationId).list();
  }

  /**
   * Trouve les comptes d'une organisation par classe SYSCOHADA (1-9).
   */
  public List<CompteComptable> findByOrganisationAndClasse(UUID organisationId, Integer classe) {
    return find(
        "organisation.id = ?1 AND classeComptable = ?2 AND actif = true ORDER BY numeroCompte ASC",
        organisationId, classe).list();
  }
}



