package dev.lions.unionflow.server.api.dto.paiement;

import dev.lions.unionflow.server.api.dto.base.BaseDTO;
import dev.lions.unionflow.server.api.enums.paiement.MethodePaiement;
import dev.lions.unionflow.server.api.enums.paiement.StatutPaiement;
import jakarta.validation.constraints.*;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.UUID;
import lombok.Getter;
import lombok.Setter;

/**
 * DTO pour la gestion des paiements
 *
 * @author UnionFlow Team
 * @version 3.0
 * @since 2025-01-29
 */
@Getter
@Setter
public class PaiementDTO extends BaseDTO {

  private static final long serialVersionUID = 1L;

  /** Numéro de référence unique */
  @NotBlank(message = "Le numéro de référence est obligatoire")
  private String numeroReference;

  /** Montant du paiement */
  @NotNull(message = "Le montant est obligatoire")
  @DecimalMin(value = "0.0", message = "Le montant doit être positif")
  @Digits(integer = 12, fraction = 2)
  private BigDecimal montant;

  /** Code devise (ISO 3 lettres) */
  @NotBlank(message = "Le code devise est obligatoire")
  @Pattern(regexp = "^[A-Z]{3}$", message = "Le code devise doit être un code ISO à 3 lettres")
  private String codeDevise;

  /** Méthode de paiement */
  @NotNull(message = "La méthode de paiement est obligatoire")
  private MethodePaiement methodePaiement;

  /** Statut du paiement */
  @NotNull(message = "Le statut du paiement est obligatoire")
  private StatutPaiement statutPaiement;

  /** Date de paiement */
  private LocalDateTime datePaiement;

  /** Date de validation */
  private LocalDateTime dateValidation;

  /** Validateur (email de l'administrateur) */
  private String validateur;

  /** Référence externe */
  private String referenceExterne;

  /** URL de preuve de paiement */
  private String urlPreuve;

  /** Commentaires et notes */
  private String commentaire;

  /** Adresse IP de l'initiateur */
  private String ipAddress;

  /** User-Agent de l'initiateur */
  private String userAgent;

  /** ID du membre payeur */
  @NotNull(message = "Le membre payeur est obligatoire")
  private UUID membreId;

  /** ID de la transaction Wave (si applicable) */
  private UUID transactionWaveId;
}

