package dev.lions.unionflow.server.api.dto.solidarite.response;

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

import java.util.UUID;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;

/**
 * Tests unitaires pour CommentaireAideResponse.
 * Couvre builder, getters/setters et equals/hashCode (héritage BaseResponse).
 *
 * @author UnionFlow Team
 * @version 1.0
 * @since 2026-02-21
 */
@DisplayName("Tests CommentaireAideResponse")
class CommentaireAideResponseTest {

  @Nested
  @DisplayName("Builder et getters")
  class BuilderEtGetters {

    @Test
    @DisplayName("builder remplit tous les champs")
    void testBuilder() {
      UUID id = UUID.randomUUID();
      UUID auteurId = UUID.randomUUID();
      CommentaireAideResponse r = CommentaireAideResponse.builder()
          .contenu("Contenu")
          .typeCommentaire("public")
          .auteurId(auteurId)
          .auteurNom("Dupont")
          .auteurRole("Membre")
          .estPrive(false)
          .estImportant(true)
          .estModifie(false)
          .nombreReactions(5)
          .estResolu(false)
          .build();
      r.setId(id);
      assertThat(r.getId()).isEqualTo(id);
      assertThat(r.getContenu()).isEqualTo("Contenu");
      assertThat(r.getTypeCommentaire()).isEqualTo("public");
      assertThat(r.getAuteurId()).isEqualTo(auteurId);
      assertThat(r.getAuteurNom()).isEqualTo("Dupont");
      assertThat(r.getAuteurRole()).isEqualTo("Membre");
      assertThat(r.getEstPrive()).isFalse();
      assertThat(r.getEstImportant()).isTrue();
      assertThat(r.getEstModifie()).isFalse();
      assertThat(r.getNombreReactions()).isEqualTo(5);
      assertThat(r.getEstResolu()).isFalse();
    }

    @Test
    @DisplayName("constructeur par défaut puis setters")
    void testSetters() {
      CommentaireAideResponse r = new CommentaireAideResponse();
      r.setContenu("c");
      r.setCommentaireParentId(UUID.randomUUID());
      assertThat(r.getContenu()).isEqualTo("c");
      assertThat(r.getCommentaireParentId()).isNotNull();
    }

    @Test
    @DisplayName("equals et hashCode avec même contenu et même id")
    void testEqualsHashCode() {
      UUID id = UUID.randomUUID();
      CommentaireAideResponse a = CommentaireAideResponse.builder().contenu("x").build();
      a.setId(id);
      CommentaireAideResponse b = CommentaireAideResponse.builder().contenu("x").build();
      b.setId(id);
      assertThat(a).isEqualTo(a);
      assertThat(a.hashCode()).isEqualTo(a.hashCode());
      CommentaireAideResponse autreId = CommentaireAideResponse.builder().contenu("x").build();
      autreId.setId(UUID.randomUUID());
      assertThat(a).isNotEqualTo(autreId);
    }
  }
}
