package dev.lions.unionflow.server.service;

import java.math.BigDecimal;

/**
 * Seuils AML/LBC-FT applicables aux transactions UEMOA (BCEAO Instruction 002-03-2025 du 18 mars
 * 2025).
 *
 * <p>Ces seuils déclenchent :
 *
 * <ul>
 *   <li>Diligence renforcée KYC (vérification UBO, source des fonds, finalité)
 *   <li>Génération automatique d'une {@code AlerteAml} pour évaluation par le Compliance Officer
 *   <li>Potentiellement, une déclaration de soupçon (DOS) à la CENTIF si confirmation
 * </ul>
 *
 * <p>Référence : <a
 * href="https://www.bceao.int/sites/default/files/2025-04/Instruction%20n%C2%B0001-03-2025%20du%2018%20mars%2025%20portant%20modalit%C3%A9s%20de%20mise%20en%20oeuvre%20par%20les%20IF%20de%20leurs%20obligations%20en%20mati%C3%A8re%20de%20lutte%20contre%20le%20blanchiment%20de%20capitaux.pdf">Instruction
 * BCEAO 001-03-2025</a>.
 *
 * @since 2026-04-25
 */
public final class AmlSeuils {

  private AmlSeuils() {}

  /**
   * Seuil intra-UEMOA (entre deux pays UMOA) au-delà duquel la transaction est soumise à
   * surveillance et obligations de déclaration : <strong>10 000 000 FCFA</strong>.
   *
   * <p>Source : Instruction BCEAO 002-03-2025 du 18 mars 2025.
   */
  public static final BigDecimal SEUIL_INTRA_UEMOA_FCFA = new BigDecimal("10000000");

  /**
   * Seuil entrée/sortie territoire UEMOA (transaction transfrontalière hors UEMOA) déclenchant
   * surveillance renforcée : <strong>5 000 000 FCFA</strong>.
   *
   * <p>Source : Instruction BCEAO 002-03-2025 du 18 mars 2025.
   */
  public static final BigDecimal SEUIL_ENTREE_SORTIE_UEMOA_FCFA = new BigDecimal("5000000");

  /**
   * Seuil unique par opération espèce (paiement direct cash) déclenchant identification
   * renforcée : <strong>1 000 000 FCFA</strong>. Dérivé de la pratique GAFI (USD 15 000
   * équivalent).
   */
  public static final BigDecimal SEUIL_OPERATION_ESPECE_FCFA = new BigDecimal("1000000");

  /**
   * Seuil cumulé sur 7 jours glissants pour détection de structuration (smurfing) :
   * <strong>5 000 000 FCFA</strong> (8 fois le seuil unique). Configurable.
   */
  public static final BigDecimal SEUIL_CUMUL_HEBDO_STRUCTURATION_FCFA = new BigDecimal("5000000");

  /** Pays UEMOA (ISO 3166-1 alpha-3). */
  public static final java.util.Set<String> PAYS_UEMOA = java.util.Set.of(
      "BEN", // Bénin
      "BFA", // Burkina Faso
      "CIV", // Côte d'Ivoire
      "GNB", // Guinée-Bissau
      "MLI", // Mali
      "NER", // Niger
      "SEN", // Sénégal
      "TGO"  // Togo
  );

  /** Détermine le seuil applicable à une transaction selon l'origine et la destination. */
  public static BigDecimal seuilApplicable(String paysOrigine, String paysDestination) {
    if (paysOrigine == null || paysDestination == null) {
      return SEUIL_ENTREE_SORTIE_UEMOA_FCFA; // par défaut le plus restrictif
    }
    boolean origineUemoa = PAYS_UEMOA.contains(paysOrigine.toUpperCase());
    boolean destinationUemoa = PAYS_UEMOA.contains(paysDestination.toUpperCase());

    if (origineUemoa && destinationUemoa) {
      return SEUIL_INTRA_UEMOA_FCFA;
    }
    return SEUIL_ENTREE_SORTIE_UEMOA_FCFA;
  }

  /** True si la transaction dépasse le seuil applicable. */
  public static boolean depasseSeuil(BigDecimal montant, String paysOrigine, String paysDestination) {
    if (montant == null) return false;
    return montant.compareTo(seuilApplicable(paysOrigine, paysDestination)) > 0;
  }

  /** True si la transaction dépasse le seuil opération espèce. */
  public static boolean depasseSeuilEspece(BigDecimal montant) {
    if (montant == null) return false;
    return montant.compareTo(SEUIL_OPERATION_ESPECE_FCFA) > 0;
  }
}
