package dev.lions.unionflow.server.entity;

import dev.lions.unionflow.server.api.enums.paiement.StatutIntentionPaiement;
import dev.lions.unionflow.server.api.enums.paiement.TypeObjetIntentionPaiement;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.time.LocalDateTime;

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

/**
 * Tests pour {@link IntentionPaiement} — méthode onCreate().
 */
@DisplayName("IntentionPaiement — onCreate")
class IntentionPaiementBranchTest {

    // ── onCreate() ────────────────────────────────────────────────────────────

    @Test
    @DisplayName("onCreate: dateExpiration déjà définie → conservée")
    void onCreate_dateExpirationDejaDefinie_conservee() throws Exception {
        IntentionPaiement ip = new IntentionPaiement();
        ip.setMontantTotal(new BigDecimal("5000.00"));
        ip.setTypeObjet(TypeObjetIntentionPaiement.COTISATION);

        LocalDateTime expirationFixe = LocalDateTime.of(2025, 12, 31, 23, 59);
        ip.setDateExpiration(expirationFixe);

        Method onCreate = IntentionPaiement.class.getDeclaredMethod("onCreate");
        onCreate.setAccessible(true);
        onCreate.invoke(ip);

        // dateExpiration doit rester la valeur fixée, pas être remplacée
        assertThat(ip.getDateExpiration()).isEqualTo(expirationFixe);
        // les autres defaults sont bien positionnés
        assertThat(ip.getStatut()).isEqualTo(StatutIntentionPaiement.INITIEE);
        assertThat(ip.getCodeDevise()).isEqualTo("XOF");
    }

    @Test
    @DisplayName("onCreate: dateExpiration null → positionnée à now+30min")
    void onCreate_dateExpirationNull_setToNowPlusTrente() throws Exception {
        IntentionPaiement ip = new IntentionPaiement();
        ip.setMontantTotal(new BigDecimal("5000.00"));
        ip.setTypeObjet(TypeObjetIntentionPaiement.COTISATION);
        ip.setStatut(null);
        ip.setCodeDevise(null);
        ip.setDateExpiration(null);

        LocalDateTime avant = LocalDateTime.now();

        Method onCreate = IntentionPaiement.class.getDeclaredMethod("onCreate");
        onCreate.setAccessible(true);
        onCreate.invoke(ip);

        LocalDateTime apres = LocalDateTime.now();

        assertThat(ip.getDateExpiration()).isNotNull();
        assertThat(ip.getDateExpiration()).isAfterOrEqualTo(avant.plusMinutes(29));
        assertThat(ip.getDateExpiration()).isBeforeOrEqualTo(apres.plusMinutes(31));
        assertThat(ip.getStatut()).isEqualTo(StatutIntentionPaiement.INITIEE);
        assertThat(ip.getCodeDevise()).isEqualTo("XOF");
    }
}
