package dev.lions.unionflow.server.entity;

import java.util.Set;

/**
 * Devises supportées par UnionFlow.
 *
 * <p>UnionFlow vise prioritairement la zone UEMOA (XOF/XAF) mais s'ouvre à la diaspora
 * (EUR/USD/GBP/CAD). Le {@link ZoneDevise} permet de discriminer pour les règles
 * AML (transferts internationaux, due diligence renforcée).
 *
 * @since 2026-04-25 (P2-NEW-7)
 */
public enum Devise {

  // Zone UEMOA / CEMAC
  XOF("Franc CFA Ouest", ZoneDevise.UEMOA),
  XAF("Franc CFA Centrale", ZoneDevise.CEMAC),

  // Diaspora — Europe / Amérique
  EUR("Euro", ZoneDevise.EUROPE),
  USD("Dollar US", ZoneDevise.AMERIQUE),
  GBP("Livre Sterling", ZoneDevise.EUROPE),
  CAD("Dollar Canadien", ZoneDevise.AMERIQUE),
  CHF("Franc Suisse", ZoneDevise.EUROPE),

  // CEDEAO non-UEMOA (pour intégrations futures)
  GHS("Cédi Ghanéen", ZoneDevise.CEDEAO),
  NGN("Naira Nigérian", ZoneDevise.CEDEAO),

  // Maghreb
  MAD("Dirham Marocain", ZoneDevise.MAGHREB);

  private final String libelle;
  private final ZoneDevise zone;

  Devise(String libelle, ZoneDevise zone) {
    this.libelle = libelle;
    this.zone = zone;
  }

  public String libelle() { return libelle; }
  public ZoneDevise zone() { return zone; }

  /** Devise de référence UnionFlow / BCEAO. */
  public static Devise reference() { return XOF; }

  /** Devises pour lesquelles un transfert depuis/vers UEMOA déclenche AML renforcé. */
  public static final Set<Devise> DEVISES_INTERNATIONALES = Set.of(EUR, USD, GBP, CAD, CHF);

  public boolean estInternationale() {
    return DEVISES_INTERNATIONALES.contains(this);
  }

  public enum ZoneDevise {
    UEMOA, CEMAC, CEDEAO, EUROPE, AMERIQUE, MAGHREB
  }
}
