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("MemberBlock")
class MemberBlockTest {

    private static Membre newMembre(String email) {
        Membre m = new Membre();
        m.setId(UUID.randomUUID());
        m.setNumeroMembre("M-" + UUID.randomUUID().toString().substring(0, 4));
        m.setPrenom("Test");
        m.setNom("User");
        m.setEmail(email);
        m.setDateNaissance(LocalDate.now());
        return m;
    }

    private static Organisation newOrg() {
        Organisation org = new Organisation();
        org.setId(UUID.randomUUID());
        org.setNom("Org Test");
        return org;
    }

    @Test
    @DisplayName("getters/setters")
    void gettersSetters() {
        Membre bloqueur = newMembre("bloqueur@test.com");
        Membre bloque = newMembre("bloque@test.com");
        Organisation org = newOrg();

        MemberBlock block = new MemberBlock();
        block.setBloqueur(bloqueur);
        block.setBloque(bloque);
        block.setOrganisation(org);

        assertThat(block.getBloqueur()).isEqualTo(bloqueur);
        assertThat(block.getBloque()).isEqualTo(bloque);
        assertThat(block.getOrganisation()).isEqualTo(org);
    }

    @Test
    @DisplayName("builder — tous les champs")
    void builder_allFields() {
        Membre bloqueur = newMembre("a@test.com");
        Membre bloque = newMembre("b@test.com");
        Organisation org = newOrg();

        MemberBlock block = MemberBlock.builder()
            .bloqueur(bloqueur)
            .bloque(bloque)
            .organisation(org)
            .build();

        assertThat(block.getBloqueur()).isEqualTo(bloqueur);
        assertThat(block.getBloque()).isEqualTo(bloque);
        assertThat(block.getOrganisation()).isEqualTo(org);
    }

    @Test
    @DisplayName("equals et hashCode")
    void equalsHashCode() {
        UUID id = UUID.randomUUID();
        Membre bloqueur = newMembre("a@test.com");
        Membre bloque = newMembre("b@test.com");
        Organisation org = newOrg();

        MemberBlock a = MemberBlock.builder().bloqueur(bloqueur).bloque(bloque).organisation(org).build();
        a.setId(id);
        MemberBlock b = MemberBlock.builder().bloqueur(bloqueur).bloque(bloque).organisation(org).build();
        b.setId(id);

        assertThat(a).isEqualTo(b);
        assertThat(a.hashCode()).isEqualTo(b.hashCode());
    }

    @Test
    @DisplayName("toString non null")
    void toString_nonNull() {
        MemberBlock block = MemberBlock.builder()
            .bloqueur(newMembre("a@test.com"))
            .bloque(newMembre("b@test.com"))
            .organisation(newOrg())
            .build();
        assertThat(block.toString()).isNotNull().isNotEmpty();
    }
}
