package dev.lions.unionflow.server.api.validation;

/**
 * Constantes pour la validation des DTOs
 *
 * <p>Cette classe centralise toutes les contraintes de validation pour assurer la cohérence entre
 * les différents DTOs du système.
 *
 * @author UnionFlow Team
 * @version 2.0
 * @since 2025-01-16
 */
public final class ValidationConstants {

  private ValidationConstants() {
    // Classe utilitaire - constructeur privé
  }

  // === CONTRAINTES DE TAILLE POUR LES TEXTES ===

  /** Titre court (événements, aides, etc.) */
  public static final int TITRE_MIN_LENGTH = 5;

  public static final int TITRE_MAX_LENGTH = 100;
  public static final String TITRE_SIZE_MESSAGE =
      "Le titre doit contenir entre "
          + TITRE_MIN_LENGTH
          + " et "
          + TITRE_MAX_LENGTH
          + " caractères";

  /** Nom d'organisation */
  public static final int NOM_ORGANISATION_MIN_LENGTH = 2;

  public static final int NOM_ORGANISATION_MAX_LENGTH = 200;
  public static final String NOM_ORGANISATION_SIZE_MESSAGE =
      "Le nom doit contenir entre "
          + NOM_ORGANISATION_MIN_LENGTH
          + " et "
          + NOM_ORGANISATION_MAX_LENGTH
          + " caractères";

  /** Description standard */
  public static final int DESCRIPTION_MIN_LENGTH = 20;

  public static final int DESCRIPTION_MAX_LENGTH = 2000;
  public static final String DESCRIPTION_SIZE_MESSAGE =
      "La description doit contenir entre "
          + DESCRIPTION_MIN_LENGTH
          + " et "
          + DESCRIPTION_MAX_LENGTH
          + " caractères";

  /** Description courte (événements) */
  public static final int DESCRIPTION_COURTE_MAX_LENGTH = 1000;

  public static final String DESCRIPTION_COURTE_SIZE_MESSAGE =
      "La description ne peut pas dépasser " + DESCRIPTION_COURTE_MAX_LENGTH + " caractères";

  /** Justification */
  public static final int JUSTIFICATION_MAX_LENGTH = 1000;

  public static final String JUSTIFICATION_SIZE_MESSAGE =
      "La justification ne peut pas dépasser " + JUSTIFICATION_MAX_LENGTH + " caractères";

  /** Commentaires */
  public static final int COMMENTAIRES_MAX_LENGTH = 1000;

  public static final String COMMENTAIRES_SIZE_MESSAGE =
      "Les commentaires ne peuvent pas dépasser " + COMMENTAIRES_MAX_LENGTH + " caractères";

  /** Raison de rejet */
  public static final int RAISON_REJET_MAX_LENGTH = 500;

  public static final String RAISON_REJET_SIZE_MESSAGE =
      "La raison du rejet ne peut pas dépasser " + RAISON_REJET_MAX_LENGTH + " caractères";

  /** Adresse */
  public static final int ADRESSE_MAX_LENGTH = 200;

  public static final String ADRESSE_SIZE_MESSAGE =
      "L'adresse ne peut pas dépasser " + ADRESSE_MAX_LENGTH + " caractères";

  /** Ville, région, quartier */
  public static final int LOCALISATION_MAX_LENGTH = 50;

  public static final String VILLE_SIZE_MESSAGE =
      "La ville ne peut pas dépasser " + LOCALISATION_MAX_LENGTH + " caractères";
  public static final String REGION_SIZE_MESSAGE =
      "La région ne peut pas dépasser " + LOCALISATION_MAX_LENGTH + " caractères";
  public static final String QUARTIER_SIZE_MESSAGE =
      "Le quartier ne peut pas dépasser " + LOCALISATION_MAX_LENGTH + " caractères";

  /** Rôle */
  public static final int ROLE_MAX_LENGTH = 50;

  public static final String ROLE_SIZE_MESSAGE =
      "Le rôle ne peut pas dépasser " + ROLE_MAX_LENGTH + " caractères";

  /** URL */
  public static final int URL_MAX_LENGTH = 255;

  public static final String URL_SIZE_MESSAGE =
      "L'URL ne peut pas dépasser " + URL_MAX_LENGTH + " caractères";

  /** Email */
  public static final int EMAIL_MAX_LENGTH = 100;

  public static final String EMAIL_SIZE_MESSAGE =
      "L'email ne peut pas dépasser " + EMAIL_MAX_LENGTH + " caractères";

  /** Nom et prénom */
  public static final int NOM_PRENOM_MIN_LENGTH = 2;

  public static final int NOM_PRENOM_MAX_LENGTH = 50;
  public static final String NOM_SIZE_MESSAGE =
      "Le nom doit contenir entre "
          + NOM_PRENOM_MIN_LENGTH
          + " et "
          + NOM_PRENOM_MAX_LENGTH
          + " caractères";
  public static final String PRENOM_SIZE_MESSAGE =
      "Le prénom doit contenir entre "
          + NOM_PRENOM_MIN_LENGTH
          + " et "
          + NOM_PRENOM_MAX_LENGTH
          + " caractères";

  // === PATTERNS DE VALIDATION ===

  /** Numéro de téléphone international */
  public static final String TELEPHONE_PATTERN = "^\\+?[0-9]{8,15}$";

  public static final String TELEPHONE_MESSAGE =
      "Le numéro de téléphone doit contenir entre 8 et 15 chiffres, avec un indicatif optionnel"
          + " (+)";

  /** Code devise ISO */
  public static final String DEVISE_PATTERN = "^[A-Z]{3}$";

  public static final String DEVISE_MESSAGE =
      "La devise doit être un code ISO à 3 lettres majuscules";

  /** Numéro de référence aide */
  public static final String REFERENCE_AIDE_PATTERN = "^DA-\\d{4}-\\d{6}$";

  public static final String REFERENCE_AIDE_MESSAGE =
      "Le numéro de référence doit suivre le format DA-YYYY-NNNNNN";

  /** Numéro de membre */
  public static final String NUMERO_MEMBRE_PATTERN = "^UF-\\d{4}-[A-Z0-9]{8}$";

  public static final String NUMERO_MEMBRE_MESSAGE =
      "Format de numéro de membre invalide (UF-YYYY-XXXXXXXX)";

  /** Couleur hexadécimale */
  public static final String COULEUR_HEX_PATTERN = "^#[0-9A-Fa-f]{6}$";

  public static final String COULEUR_HEX_MESSAGE = "Format de couleur invalide (format: #RRGGBB)";

  // === CONTRAINTES NUMÉRIQUES ===

  /** Montant minimum */
  public static final String MONTANT_MIN_VALUE = "0.0";

  public static final String MONTANT_POSITIF_MESSAGE = "Le montant doit être positif";

  /** Contraintes pour les montants */
  public static final int MONTANT_INTEGER_DIGITS = 10;

  public static final int MONTANT_FRACTION_DIGITS = 2;
  public static final String MONTANT_DIGITS_MESSAGE =
      "Le montant doit avoir au maximum "
          + MONTANT_INTEGER_DIGITS
          + " chiffres entiers et "
          + MONTANT_FRACTION_DIGITS
          + " décimales";

  // === MESSAGES D'ERREUR STANDARD ===

  public static final String OBLIGATOIRE_MESSAGE = " est obligatoire";
  public static final String EMAIL_FORMAT_MESSAGE = "L'adresse email n'est pas valide";
  public static final String DATE_PASSEE_MESSAGE = "La date doit être dans le passé";
  public static final String DATE_FUTURE_MESSAGE = "La date doit être dans le futur";

  // === CONTRAINTES SPÉCIFIQUES ===

  /** Documents joints */
  public static final int DOCUMENTS_JOINTS_MAX_LENGTH = 1000;

  public static final String DOCUMENTS_JOINTS_SIZE_MESSAGE =
      "La liste des documents ne peut pas dépasser " + DOCUMENTS_JOINTS_MAX_LENGTH + " caractères";

  /** Mode de versement */
  public static final int MODE_VERSEMENT_MAX_LENGTH = 50;

  public static final String MODE_VERSEMENT_SIZE_MESSAGE =
      "Le mode de versement ne peut pas dépasser " + MODE_VERSEMENT_MAX_LENGTH + " caractères";

  /** Numéro de transaction */
  public static final int NUMERO_TRANSACTION_MAX_LENGTH = 100;

  public static final String NUMERO_TRANSACTION_SIZE_MESSAGE =
      "Le numéro de transaction ne peut pas dépasser "
          + NUMERO_TRANSACTION_MAX_LENGTH
          + " caractères";

  /** Numéro d'enregistrement */
  public static final int NUMERO_ENREGISTREMENT_MAX_LENGTH = 100;

  public static final String NUMERO_ENREGISTREMENT_SIZE_MESSAGE =
      "Le numéro d'enregistrement ne peut pas dépasser "
          + NUMERO_ENREGISTREMENT_MAX_LENGTH
          + " caractères";

  /** Nom court d'organisation */
  public static final int NOM_COURT_MAX_LENGTH = 50;

  public static final String NOM_COURT_SIZE_MESSAGE =
      "Le nom court ne peut pas dépasser " + NOM_COURT_MAX_LENGTH + " caractères";

  /** Instructions et matériel */
  public static final int INSTRUCTIONS_MAX_LENGTH = 500;

  public static final String INSTRUCTIONS_SIZE_MESSAGE =
      "Les instructions ne peuvent pas dépasser " + INSTRUCTIONS_MAX_LENGTH + " caractères";

  /** Conditions météo */
  public static final int CONDITIONS_METEO_MAX_LENGTH = 100;

  public static final String CONDITIONS_METEO_SIZE_MESSAGE =
      "Les conditions météo ne peuvent pas dépasser " + CONDITIONS_METEO_MAX_LENGTH + " caractères";

  // === LCB-FT / Anti-blanchiment (mutuelles) ===

  /** Origine des fonds — libellé court (obligatoire au-dessus du seuil configuré) */
  public static final int ORIGINE_FONDS_MAX_LENGTH = 200;

  public static final String ORIGINE_FONDS_SIZE_MESSAGE =
      "L'origine des fonds ne peut pas dépasser " + ORIGINE_FONDS_MAX_LENGTH + " caractères";

  public static final String ORIGINE_FONDS_OBLIGATOIRE_SEUIL_MESSAGE =
      "L'origine des fonds est obligatoire pour les opérations au-dessus du seuil LCB-FT configuré";
}
