package dev.lions.unionflow.server.entity;

import dev.lions.unionflow.server.api.enums.abonnement.StatutSouscription;
import dev.lions.unionflow.server.api.enums.abonnement.StatutValidationSouscription;
import dev.lions.unionflow.server.api.enums.abonnement.TypePeriodeAbonnement;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import java.lang.reflect.Method;
import java.time.LocalDate;

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

/**
 * Tests de couverture pour SouscriptionOrganisation.
 * Couvre les branches manquantes de onCreate() et decrementerQuota().
 */
@DisplayName("SouscriptionOrganisation - branches manquantes")
class SouscriptionOrganisationBranchTest {

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

    /**
     * Branch manquante : formule != null mais quotaMax est déjà renseigné
     * → la ligne `quotaMax = formule.getMaxMembres()` n'est PAS exécutée.
     */
    @Test
    @DisplayName("onCreate: formule présente mais quotaMax déjà défini → quotaMax conservé")
    void onCreate_formuleNonNull_quotaMaxDejaDefini_conserveQuotaMax() throws Exception {
        FormuleAbonnement formule = new FormuleAbonnement();
        formule.setMaxMembres(50);

        SouscriptionOrganisation s = new SouscriptionOrganisation();
        s.setDateDebut(LocalDate.now());
        s.setDateFin(LocalDate.now().plusMonths(1));
        s.setFormule(formule);
        s.setQuotaMax(100); // déjà défini → ne doit PAS être écrasé

        Method onCreate = SouscriptionOrganisation.class.getDeclaredMethod("onCreate");
        onCreate.setAccessible(true);
        onCreate.invoke(s);

        // quotaMax reste 100, pas remplacé par formule.getMaxMembres() (50)
        assertThat(s.getQuotaMax()).isEqualTo(100);
        // les autres defaults sont positionnés
        assertThat(s.getStatut()).isEqualTo(StatutSouscription.ACTIVE);
        assertThat(s.getTypePeriode()).isEqualTo(TypePeriodeAbonnement.MENSUEL);
        assertThat(s.getQuotaUtilise()).isEqualTo(0);
    }

    /**
     * Branch manquante : statutValidation == null → la valeur par défaut EN_ATTENTE_PAIEMENT est affectée.
     */
    @Test
    @DisplayName("onCreate: statutValidation null → initialisé à EN_ATTENTE_PAIEMENT")
    void onCreate_statutValidationNull_setsDefault() throws Exception {
        SouscriptionOrganisation s = new SouscriptionOrganisation();
        s.setDateDebut(LocalDate.now());
        s.setDateFin(LocalDate.now().plusMonths(1));
        s.setStatutValidation(null); // forcer null pour couvrir le then-branch de L168

        Method onCreate = SouscriptionOrganisation.class.getDeclaredMethod("onCreate");
        onCreate.setAccessible(true);
        onCreate.invoke(s);

        assertThat(s.getStatutValidation()).isEqualTo(StatutValidationSouscription.EN_ATTENTE_PAIEMENT);
    }

    // ── decrementerQuota() ────────────────────────────────────────────────────

    /**
     * Branch manquante : quotaUtilise == 0 → la condition
     * `quotaUtilise != null && quotaUtilise > 0` est false, le quota ne change pas.
     */
    @Test
    @DisplayName("decrementerQuota: quotaUtilise=0 → reste 0 (pas de décrément)")
    void decrementerQuota_quotaUtiliseZero_resterAZero() {
        SouscriptionOrganisation s = new SouscriptionOrganisation();
        s.setDateDebut(LocalDate.now());
        s.setDateFin(LocalDate.now().plusMonths(1));
        s.setQuotaUtilise(0);

        s.decrementerQuota();

        assertThat(s.getQuotaUtilise()).isEqualTo(0);
    }

    /**
     * Branche couverte pour référence : quotaUtilise null → décrement ignoré.
     */
    @Test
    @DisplayName("decrementerQuota: quotaUtilise=null → reste null")
    void decrementerQuota_quotaUtiliseNull_resterNull() {
        SouscriptionOrganisation s = new SouscriptionOrganisation();
        s.setDateDebut(LocalDate.now());
        s.setDateFin(LocalDate.now().plusMonths(1));
        s.setQuotaUtilise(null);

        s.decrementerQuota();

        assertThat(s.getQuotaUtilise()).isNull();
    }
}
