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

import static org.assertj.core.api.Assertions.assertThat;

import java.math.BigDecimal;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import dev.lions.unionflow.server.api.enums.paiement.StatutSession;

/**
 * Tests unitaires pour WaveCheckoutSessionDTO.
 * Couvre constructeurs et getters pour 100% instructions.
 *
 * @author UnionFlow Team
 * @version 1.0
 * @since 2026-02-21
 */
@DisplayName("Tests WaveCheckoutSessionDTO")
class WaveCheckoutSessionDTOTest {

  @Nested
  @DisplayName("Constructeur par défaut")
  class ConstructeurDefaut {

    @Test
    @DisplayName("initialise devise, statut et flags")
    void testConstructeurVide() {
      WaveCheckoutSessionDTO dto = new WaveCheckoutSessionDTO();
      assertThat(dto.getDevise()).isEqualTo("XOF");
      assertThat(dto.getStatut()).isEqualTo(StatutSession.PENDING);
      assertThat(dto.getNombreTentatives()).isEqualTo(0);
      assertThat(dto.getWebhookRecu()).isFalse();
    }
  }

  @Nested
  @DisplayName("Constructeur avec URLs")
  class ConstructeurAvecUrls {

    @Test
    @DisplayName("remplit montant, successUrl, errorUrl")
    void testConstructeurAvecUrls() {
      WaveCheckoutSessionDTO dto = new WaveCheckoutSessionDTO(
          BigDecimal.valueOf(5000),
          "https://example.com/success",
          "https://example.com/error");
      assertThat(dto.getMontant()).isEqualByComparingTo(BigDecimal.valueOf(5000));
      assertThat(dto.getSuccessUrl()).isEqualTo("https://example.com/success");
      assertThat(dto.getErrorUrl()).isEqualTo("https://example.com/error");
      assertThat(dto.getStatut()).isEqualTo(StatutSession.PENDING);
    }
  }
}
