package dev.lions.unionflow.server.entity;

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import java.time.LocalDate;
import java.util.UUID;

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

@DisplayName("Membre")
class MembreTest {

    @Test
    @DisplayName("getters/setters")
    void gettersSetters() {
        Membre m = new Membre();
        m.setNumeroMembre("MEM-001");
        m.setPrenom("Jean");
        m.setNom("Dupont");
        m.setEmail("jean@test.com");
        m.setTelephone("+22507000001");
        m.setDateNaissance(LocalDate.of(1990, 5, 15));
        m.setStatutCompte("ACTIF");

        assertThat(m.getNumeroMembre()).isEqualTo("MEM-001");
        assertThat(m.getPrenom()).isEqualTo("Jean");
        assertThat(m.getNom()).isEqualTo("Dupont");
        assertThat(m.getEmail()).isEqualTo("jean@test.com");
        assertThat(m.getDateNaissance()).isEqualTo(LocalDate.of(1990, 5, 15));
        assertThat(m.getStatutCompte()).isEqualTo("ACTIF");
    }

    @Test
    @DisplayName("getNomComplet")
    void getNomComplet() {
        Membre m = new Membre();
        m.setNumeroMembre("X");
        m.setPrenom("Marie");
        m.setNom("Martin");
        m.setEmail("m@test.com");
        m.setDateNaissance(LocalDate.now());
        assertThat(m.getNomComplet()).isEqualTo("Marie Martin");
    }

    @Test
    @DisplayName("isMajeur: true si 18+ ans")
    void isMajeur() {
        Membre m = new Membre();
        m.setNumeroMembre("X");
        m.setPrenom("A");
        m.setNom("B");
        m.setEmail("a@test.com");
        m.setDateNaissance(LocalDate.now().minusYears(25));
        assertThat(m.isMajeur()).isTrue();
        m.setDateNaissance(LocalDate.now().minusYears(10));
        assertThat(m.isMajeur()).isFalse();
    }

    @Test
    @DisplayName("getAge")
    void getAge() {
        Membre m = new Membre();
        m.setNumeroMembre("X");
        m.setPrenom("A");
        m.setNom("B");
        m.setEmail("a@test.com");
        m.setDateNaissance(LocalDate.now().minusYears(30));
        assertThat(m.getAge()).isEqualTo(30);
    }

    @Test
    @DisplayName("statutCompte par défaut")
    void statutDefaut() {
        Membre m = new Membre();
        m.setNumeroMembre("X");
        m.setPrenom("A");
        m.setNom("B");
        m.setEmail("a@test.com");
        m.setDateNaissance(LocalDate.now());
        m.setStatutCompte(null);
        assertThat(m.getStatutCompte()).isNull();
    }

    @Test
    @DisplayName("equals et hashCode")
    void equalsHashCode() {
        UUID id = UUID.randomUUID();
        Membre a = new Membre();
        a.setId(id);
        a.setNumeroMembre("N1");
        a.setPrenom("A");
        a.setNom("B");
        a.setEmail("a@test.com");
        a.setDateNaissance(LocalDate.now());
        Membre b = new Membre();
        b.setId(id);
        b.setNumeroMembre("N1");
        b.setPrenom("A");
        b.setNom("B");
        b.setEmail("a@test.com");
        b.setDateNaissance(a.getDateNaissance());
        assertThat(a).isEqualTo(b);
        assertThat(a.hashCode()).isEqualTo(b.hashCode());
    }

    @Test
    @DisplayName("notes getter/setter")
    void notes() {
        Membre m = new Membre();
        assertThat(m.getNotes()).isNull();
        m.setNotes("Ma biographie de test");
        assertThat(m.getNotes()).isEqualTo("Ma biographie de test");
    }

    @Test
    @DisplayName("toString non null")
    void toString_nonNull() {
        Membre m = new Membre();
        m.setNumeroMembre("X");
        m.setPrenom("A");
        m.setNom("B");
        m.setEmail("a@test.com");
        m.setDateNaissance(LocalDate.now());
        assertThat(m.toString()).isNotNull().isNotEmpty();
    }
}
