package dev.lions.unionflow.server.api.dto.notification;

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

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import org.junit.jupiter.params.provider.ValueSource;

@DisplayName("Tests pour PreferenceTypeNotificationDTO")
class PreferenceTypeNotificationDTOTest {

  @Test
  @DisplayName("Test de base - classe peut être instanciée")
  void testClasseInstanciable() {
    PreferenceTypeNotificationDTO dto = new PreferenceTypeNotificationDTO();
    assertThat(dto).isNotNull();
  }

  @Nested
  @DisplayName("Tests de construction")
  class ConstructionTests {

    @Test
    @DisplayName("Constructeur par défaut")
    void testConstructeurParDefaut() {
      PreferenceTypeNotificationDTO dto = new PreferenceTypeNotificationDTO();

      assertThat(dto).isNotNull();
    }
  }

  @Nested
  @DisplayName("Tests getters/setters")
  class GettersSettersTests {

    @Test
    @DisplayName("Test tous les getters/setters")
    void testTousLesGettersSetters() {
      PreferenceTypeNotificationDTO dto = new PreferenceTypeNotificationDTO();
      long[] patternVibration = new long[]{100, 200, 100};

      dto.setActive(true);
      dto.setPriorite(3);
      dto.setSonPersonnalise("custom_sound.mp3");
      dto.setPatternVibration(patternVibration);
      dto.setCouleurLED("#FF0000");
      dto.setDureeAffichageSecondes(15);
      dto.setDoitVibrer(true);
      dto.setDoitEmettreSon(false);
      dto.setDoitAllumerLED(true);
      dto.setIgnoreModeSilencieux(false);

      assertThat(dto.getActive()).isTrue();
      assertThat(dto.getPriorite()).isEqualTo(3);
      assertThat(dto.getSonPersonnalise()).isEqualTo("custom_sound.mp3");
      assertThat(dto.getPatternVibration()).isEqualTo(patternVibration);
      assertThat(dto.getCouleurLED()).isEqualTo("#FF0000");
      assertThat(dto.getDureeAffichageSecondes()).isEqualTo(15);
      assertThat(dto.getDoitVibrer()).isTrue();
      assertThat(dto.getDoitEmettreSon()).isFalse();
      assertThat(dto.getDoitAllumerLED()).isTrue();
      assertThat(dto.getIgnoreModeSilencieux()).isFalse();
    }

    @ParameterizedTest
    @ValueSource(booleans = {true, false})
    @DisplayName("active - toutes les valeurs")
    void testActive(Boolean valeur) {
      PreferenceTypeNotificationDTO dto = new PreferenceTypeNotificationDTO();
      dto.setActive(valeur);
      assertThat(dto.getActive()).isEqualTo(valeur);
    }

    @ParameterizedTest
    @CsvSource({
        "1, 1",
        "3, 3",
        "5, 5"
    })
    @DisplayName("priorite - toutes les valeurs")
    void testPriorite(Integer priorite, Integer expected) {
      PreferenceTypeNotificationDTO dto = new PreferenceTypeNotificationDTO();
      dto.setPriorite(priorite);
      assertThat(dto.getPriorite()).isEqualTo(expected);
    }

    @ParameterizedTest
    @ValueSource(booleans = {true, false})
    @DisplayName("doitVibrer - toutes les valeurs")
    void testDoitVibrer(Boolean valeur) {
      PreferenceTypeNotificationDTO dto = new PreferenceTypeNotificationDTO();
      dto.setDoitVibrer(valeur);
      assertThat(dto.getDoitVibrer()).isEqualTo(valeur);
    }

    @ParameterizedTest
    @ValueSource(booleans = {true, false})
    @DisplayName("doitEmettreSon - toutes les valeurs")
    void testDoitEmettreSon(Boolean valeur) {
      PreferenceTypeNotificationDTO dto = new PreferenceTypeNotificationDTO();
      dto.setDoitEmettreSon(valeur);
      assertThat(dto.getDoitEmettreSon()).isEqualTo(valeur);
    }

    @ParameterizedTest
    @ValueSource(booleans = {true, false})
    @DisplayName("doitAllumerLED - toutes les valeurs")
    void testDoitAllumerLED(Boolean valeur) {
      PreferenceTypeNotificationDTO dto = new PreferenceTypeNotificationDTO();
      dto.setDoitAllumerLED(valeur);
      assertThat(dto.getDoitAllumerLED()).isEqualTo(valeur);
    }

    @ParameterizedTest
    @ValueSource(booleans = {true, false})
    @DisplayName("ignoreModeSilencieux - toutes les valeurs")
    void testIgnoreModeSilencieux(Boolean valeur) {
      PreferenceTypeNotificationDTO dto = new PreferenceTypeNotificationDTO();
      dto.setIgnoreModeSilencieux(valeur);
      assertThat(dto.getIgnoreModeSilencieux()).isEqualTo(valeur);
    }
  }
}

