package dev.lions.unionflow.server.entity;

/**
 * Référentiel comptable applicable à une {@link Organisation}.
 *
 * <p>OHADA dispose désormais de plusieurs référentiels selon la nature de l'entité :
 *
 * <ul>
 *   <li>{@link #SYSCOHADA} — Système Comptable OHADA révisé (1er jan 2018) pour entités
 *       commerciales/coopératives à but lucratif.
 *   <li>{@link #SYCEBNL} — Système Comptable OHADA des Entités à But Non Lucratif (11ᵉ Acte
 *       uniforme, entré en vigueur <strong>1er jan 2024</strong>) pour mutuelles sociales,
 *       associations, ONG, fondations, syndicats, projets de développement.
 *   <li>{@link #PCSFD_UMOA} — Plan Comptable des Systèmes Financiers Décentralisés UMOA pour SFD
 *       soumis Commission Bancaire UMOA (article 44, encours ≥ 2 milliards FCFA = catégorie III).
 * </ul>
 *
 * <p>Le mapping par défaut depuis {@code Organisation.typeOrganisation} se trouve dans
 * {@link #defaultFor(String)}. L'admin peut overrider manuellement (cas hybrides).
 *
 * <p>Voir : {@code unionflow/docs/COMPLIANCE_OHADA_SYCEBNL.md} et {@code
 * unionflow/docs/COMPLIANCE_OHADA_SYSCOHADA.md}.
 *
 * @since 2026-04-25
 */
public enum ReferentielComptable {
  /** Système Comptable OHADA révisé (entités commerciales / coopératives lucratives). */
  SYSCOHADA,

  /**
   * Système Comptable OHADA des Entités à But Non Lucratif (mutuelles sociales, associations,
   * ONG, fondations, Lions Clubs, syndicats). Acte uniforme entré en vigueur 1er janvier 2024.
   */
  SYCEBNL,

  /**
   * Plan Comptable des Systèmes Financiers Décentralisés UMOA. Pour SFD article 44 (encours ≥ 2
   * Md FCFA = catégorie III, commissaire aux comptes obligatoire agréé OHADA, sélection soumise
   * approbation Commission Bancaire UMOA).
   */
  PCSFD_UMOA;

  /**
   * Retourne le référentiel par défaut suggéré pour un {@code typeOrganisation}. L'admin peut
   * overrider manuellement à la création/édition d'une organisation.
   *
   * @param typeOrganisation valeur de {@link Organisation#getTypeOrganisation()}
   * @return référentiel par défaut, jamais null (fallback {@link #SYSCOHADA})
   */
  public static ReferentielComptable defaultFor(String typeOrganisation) {
    if (typeOrganisation == null) {
      return SYSCOHADA;
    }
    return switch (typeOrganisation.toUpperCase()) {
      case "MUTUELLE_SANTE",
              "ASSOCIATION",
              "LIONS_CLUB",
              "ONG",
              "FONDATION",
              "SYNDICAT",
              "ORDRE_PROFESSIONNEL",
              "PROJET_DEVELOPPEMENT" ->
          SYCEBNL;
      case "SFD_TIER_1", "SFD_CATEGORIE_III" -> PCSFD_UMOA;
      default -> SYSCOHADA;
    };
  }
}
