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

import dev.lions.unionflow.server.api.dto.base.BaseDTO;
import dev.lions.unionflow.server.api.enums.wave.StatutTransactionWave;
import dev.lions.unionflow.server.api.enums.wave.TypeTransactionWave;
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 transactions Wave
 *
 * @author UnionFlow Team
 * @version 3.0
 * @since 2025-01-29
 */
@Getter
@Setter
public class TransactionWaveDTO extends BaseDTO {

  private static final long serialVersionUID = 1L;

  /** Identifiant Wave de la transaction */
  @NotBlank(message = "L'identifiant Wave est obligatoire")
  private String waveTransactionId;

  /** Identifiant de requête Wave */
  private String waveRequestId;

  /** Référence Wave */
  private String waveReference;

  /** Type de transaction */
  @NotNull(message = "Le type de transaction est obligatoire")
  private TypeTransactionWave typeTransaction;

  /** Statut de la transaction */
  @NotNull(message = "Le statut de la transaction est obligatoire")
  private StatutTransactionWave statutTransaction;

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

  /** Frais de transaction */
  @DecimalMin(value = "0.0")
  @Digits(integer = 10, fraction = 2)
  private BigDecimal frais;

  /** Montant net */
  @DecimalMin(value = "0.0")
  @Digits(integer = 12, fraction = 2)
  private BigDecimal montantNet;

  /** Code devise */
  @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;

  /** Numéro téléphone payeur */
  private String telephonePayeur;

  /** Numéro téléphone bénéficiaire */
  private String telephoneBeneficiaire;

  /** Métadonnées JSON */
  private String metadonnees;

  /** Nombre de tentatives */
  private Integer nombreTentatives;

  /** Date de dernière tentative */
  private LocalDateTime dateDerniereTentative;

  /** Message d'erreur */
  private String messageErreur;

  /** ID du compte Wave */
  @NotNull(message = "Le compte Wave est obligatoire")
  private UUID compteWaveId;
}

