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

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

import dev.lions.unionflow.server.api.dto.analytics.KPITrendDTO.PointDonneeDTO;
import dev.lions.unionflow.server.api.enums.analytics.PeriodeAnalyse;
import dev.lions.unionflow.server.api.enums.analytics.TypeMetrique;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;
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;

@DisplayName("Tests pour KPITrendDTO")
class KPITrendDTOTest {

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

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

    @Test
    @DisplayName("Constructeur par défaut")
    void testConstructeurParDefaut() {
      KPITrendDTO dto = new KPITrendDTO();
      assertThat(dto).isNotNull();
      assertThat(dto.getAlerteActive()).isFalse();
    }

    @Test
    @DisplayName("Builder pattern")
    void testBuilder() {
      LocalDateTime debut = LocalDateTime.of(2025, 1, 1, 0, 0);
      LocalDateTime fin = LocalDateTime.of(2025, 1, 31, 23, 59);
      List<PointDonneeDTO> points = Arrays.asList(
          PointDonneeDTO.builder()
              .date(debut)
              .valeur(new BigDecimal("100.0"))
              .build());

      KPITrendDTO dto = KPITrendDTO.builder()
          .typeMetrique(TypeMetrique.NOMBRE_MEMBRES_ACTIFS)
          .periodeAnalyse(PeriodeAnalyse.CE_MOIS)
          .dateDebut(debut)
          .dateFin(fin)
          .pointsDonnees(points)
          .valeurActuelle(new BigDecimal("150.0"))
          .build();

      assertThat(dto.getTypeMetrique()).isEqualTo(TypeMetrique.NOMBRE_MEMBRES_ACTIFS);
      assertThat(dto.getPeriodeAnalyse()).isEqualTo(PeriodeAnalyse.CE_MOIS);
      assertThat(dto.getDateDebut()).isEqualTo(debut);
      assertThat(dto.getDateFin()).isEqualTo(fin);
      assertThat(dto.getPointsDonnees()).isEqualTo(points);
      assertThat(dto.getValeurActuelle()).isEqualTo(new BigDecimal("150.0"));
    }
  }

  @Nested
  @DisplayName("Tests méthodes utilitaires")
  class MethodesUtilitairesTests {

    @Test
    @DisplayName("getLibelleMetrique")
    void testGetLibelleMetrique() {
      KPITrendDTO dto = new KPITrendDTO();
      dto.setTypeMetrique(TypeMetrique.NOMBRE_MEMBRES_ACTIFS);
      assertThat(dto.getLibelleMetrique()).isEqualTo(TypeMetrique.NOMBRE_MEMBRES_ACTIFS.getLibelle());
    }

    @Test
    @DisplayName("getUnite")
    void testGetUnite() {
      KPITrendDTO dto = new KPITrendDTO();
      dto.setTypeMetrique(TypeMetrique.NOMBRE_MEMBRES_ACTIFS);
      assertThat(dto.getUnite()).isEqualTo(TypeMetrique.NOMBRE_MEMBRES_ACTIFS.getUnite());
    }

    @Test
    @DisplayName("getIcone")
    void testGetIcone() {
      KPITrendDTO dto = new KPITrendDTO();
      dto.setTypeMetrique(TypeMetrique.NOMBRE_MEMBRES_ACTIFS);
      assertThat(dto.getIcone()).isEqualTo(TypeMetrique.NOMBRE_MEMBRES_ACTIFS.getIcone());
    }

    @Test
    @DisplayName("getCouleur")
    void testGetCouleur() {
      KPITrendDTO dto = new KPITrendDTO();
      dto.setTypeMetrique(TypeMetrique.NOMBRE_MEMBRES_ACTIFS);
      assertThat(dto.getCouleur()).isEqualTo(TypeMetrique.NOMBRE_MEMBRES_ACTIFS.getCouleur());
    }

    @Test
    @DisplayName("isTendancePositive - tendance positive")
    void testIsTendancePositiveTrue() {
      KPITrendDTO dto = new KPITrendDTO();
      dto.setTendanceGenerale(new BigDecimal("5.5"));
      assertThat(dto.isTendancePositive()).isTrue();
    }

    @Test
    @DisplayName("isTendancePositive - tendance négative")
    void testIsTendancePositiveFalse() {
      KPITrendDTO dto = new KPITrendDTO();
      dto.setTendanceGenerale(new BigDecimal("-5.5"));
      assertThat(dto.isTendancePositive()).isFalse();
    }

    @Test
    @DisplayName("isTendancePositive - tendance null")
    void testIsTendancePositiveNull() {
      KPITrendDTO dto = new KPITrendDTO();
      dto.setTendanceGenerale(null);
      assertThat(dto.isTendancePositive()).isFalse();
    }

    @Test
    @DisplayName("isTendanceNegative - tendance négative")
    void testIsTendanceNegativeTrue() {
      KPITrendDTO dto = new KPITrendDTO();
      dto.setTendanceGenerale(new BigDecimal("-5.5"));
      assertThat(dto.isTendanceNegative()).isTrue();
    }

    @Test
    @DisplayName("isTendanceNegative - tendance positive")
    void testIsTendanceNegativeFalse() {
      KPITrendDTO dto = new KPITrendDTO();
      dto.setTendanceGenerale(new BigDecimal("5.5"));
      assertThat(dto.isTendanceNegative()).isFalse();
    }

    @Test
    @DisplayName("isTendanceNegative - tendance null")
    void testIsTendanceNegativeNull() {
      KPITrendDTO dto = new KPITrendDTO();
      dto.setTendanceGenerale(null);
      assertThat(dto.isTendanceNegative()).isFalse();
    }

    @Test
    @DisplayName("isTendanceStable - tendance zéro")
    void testIsTendanceStableTrue() {
      KPITrendDTO dto = new KPITrendDTO();
      dto.setTendanceGenerale(BigDecimal.ZERO);
      assertThat(dto.isTendanceStable()).isTrue();
    }

    @Test
    @DisplayName("isTendanceStable - tendance non zéro")
    void testIsTendanceStableFalse() {
      KPITrendDTO dto = new KPITrendDTO();
      dto.setTendanceGenerale(new BigDecimal("5.5"));
      assertThat(dto.isTendanceStable()).isFalse();
    }

    @Test
    @DisplayName("isTendanceStable - tendance null")
    void testIsTendanceStableNull() {
      KPITrendDTO dto = new KPITrendDTO();
      dto.setTendanceGenerale(null);
      assertThat(dto.isTendanceStable()).isFalse();
    }

    @ParameterizedTest
    @CsvSource({
        "0.05, faible",
        "0.1, faible",
        "0.2, moyenne",
        "0.3, moyenne",
        "0.4, élevée",
        "null, inconnue"
    })
    @DisplayName("getVolatilite - tous les cas")
    void testGetVolatilite(String cvStr, String expected) {
      KPITrendDTO dto = new KPITrendDTO();
      if ("null".equals(cvStr)) {
        dto.setCoefficientVariation(null);
      } else {
        dto.setCoefficientVariation(new BigDecimal(cvStr));
      }
      assertThat(dto.getVolatilite()).isEqualTo(expected);
    }

    @Test
    @DisplayName("isPredictionFiable - R² > 0.7")
    void testIsPredictionFiableTrue() {
      KPITrendDTO dto = new KPITrendDTO();
      dto.setCoefficientCorrelation(new BigDecimal("0.8"));
      assertThat(dto.isPredictionFiable()).isTrue();
    }

    @Test
    @DisplayName("isPredictionFiable - R² = 0.7")
    void testIsPredictionFiableTrueLimite() {
      KPITrendDTO dto = new KPITrendDTO();
      dto.setCoefficientCorrelation(new BigDecimal("0.7"));
      assertThat(dto.isPredictionFiable()).isTrue();
    }

    @Test
    @DisplayName("isPredictionFiable - R² < 0.7")
    void testIsPredictionFiableFalse() {
      KPITrendDTO dto = new KPITrendDTO();
      dto.setCoefficientCorrelation(new BigDecimal("0.5"));
      assertThat(dto.isPredictionFiable()).isFalse();
    }

    @Test
    @DisplayName("isPredictionFiable - R² null")
    void testIsPredictionFiableNull() {
      KPITrendDTO dto = new KPITrendDTO();
      dto.setCoefficientCorrelation(null);
      assertThat(dto.isPredictionFiable()).isFalse();
    }

    @Test
    @DisplayName("getNombrePointsDonnees - avec points")
    void testGetNombrePointsDonneesAvecPoints() {
      KPITrendDTO dto = new KPITrendDTO();
      List<PointDonneeDTO> points = Arrays.asList(
          PointDonneeDTO.builder().date(LocalDateTime.now()).valeur(new BigDecimal("100")).build(),
          PointDonneeDTO.builder().date(LocalDateTime.now()).valeur(new BigDecimal("200")).build());
      dto.setPointsDonnees(points);
      assertThat(dto.getNombrePointsDonnees()).isEqualTo(2);
    }

    @Test
    @DisplayName("getNombrePointsDonnees - sans points")
    void testGetNombrePointsDonneesSansPoints() {
      KPITrendDTO dto = new KPITrendDTO();
      dto.setPointsDonnees(null);
      assertThat(dto.getNombrePointsDonnees()).isEqualTo(0);
    }

    @Test
    @DisplayName("hasAnomalies - avec anomalies")
    void testHasAnomaliesTrue() {
      KPITrendDTO dto = new KPITrendDTO();
      List<PointDonneeDTO> points = Arrays.asList(
          PointDonneeDTO.builder()
              .date(LocalDateTime.now())
              .valeur(new BigDecimal("100"))
              .anomalie(true)
              .build(),
          PointDonneeDTO.builder()
              .date(LocalDateTime.now())
              .valeur(new BigDecimal("200"))
              .anomalie(false)
              .build());
      dto.setPointsDonnees(points);
      assertThat(dto.hasAnomalies()).isTrue();
    }

    @Test
    @DisplayName("hasAnomalies - sans anomalies")
    void testHasAnomaliesFalse() {
      KPITrendDTO dto = new KPITrendDTO();
      List<PointDonneeDTO> points = Arrays.asList(
          PointDonneeDTO.builder()
              .date(LocalDateTime.now())
              .valeur(new BigDecimal("100"))
              .anomalie(false)
              .build());
      dto.setPointsDonnees(points);
      assertThat(dto.hasAnomalies()).isFalse();
    }

    @Test
    @DisplayName("hasAnomalies - points null")
    void testHasAnomaliesNull() {
      KPITrendDTO dto = new KPITrendDTO();
      dto.setPointsDonnees(null);
      assertThat(dto.hasAnomalies()).isFalse();
    }
  }

  @Nested
  @DisplayName("Tests classe interne PointDonneeDTO")
  class PointDonneeDTOTests {

    @Test
    @DisplayName("Constructeur par défaut")
    void testConstructeurParDefaut() {
      PointDonneeDTO point = new PointDonneeDTO();
      assertThat(point).isNotNull();
      assertThat(point.getAnomalie()).isFalse();
      assertThat(point.getPrediction()).isFalse();
    }

    @Test
    @DisplayName("Builder pattern")
    void testBuilder() {
      LocalDateTime date = LocalDateTime.of(2025, 1, 15, 10, 0);
      PointDonneeDTO point = PointDonneeDTO.builder()
          .date(date)
          .valeur(new BigDecimal("150.0"))
          .libelle("Point 1")
          .anomalie(true)
          .prediction(false)
          .metadonnees("meta")
          .build();

      assertThat(point.getDate()).isEqualTo(date);
      assertThat(point.getValeur()).isEqualTo(new BigDecimal("150.0"));
      assertThat(point.getLibelle()).isEqualTo("Point 1");
      assertThat(point.getAnomalie()).isTrue();
      assertThat(point.getPrediction()).isFalse();
      assertThat(point.getMetadonnees()).isEqualTo("meta");
    }

    @Test
    @DisplayName("Getters/setters")
    void testGettersSetters() {
      PointDonneeDTO point = new PointDonneeDTO();
      LocalDateTime date = LocalDateTime.of(2025, 1, 15, 10, 0);

      point.setDate(date);
      point.setValeur(new BigDecimal("200.0"));
      point.setLibelle("Test Point");
      point.setAnomalie(true);
      point.setPrediction(true);
      point.setMetadonnees("test meta");

      assertThat(point.getDate()).isEqualTo(date);
      assertThat(point.getValeur()).isEqualTo(new BigDecimal("200.0"));
      assertThat(point.getLibelle()).isEqualTo("Test Point");
      assertThat(point.getAnomalie()).isTrue();
      assertThat(point.getPrediction()).isTrue();
      assertThat(point.getMetadonnees()).isEqualTo("test meta");
    }
  }

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

    @Test
    @DisplayName("Test tous les getters/setters")
    void testTousLesGettersSetters() {
      KPITrendDTO dto = new KPITrendDTO();
      UUID orgId = UUID.randomUUID();
      LocalDateTime debut = LocalDateTime.of(2025, 1, 1, 0, 0);
      LocalDateTime fin = LocalDateTime.of(2025, 1, 31, 23, 59);
      List<PointDonneeDTO> points = Arrays.asList(
          PointDonneeDTO.builder()
              .date(debut)
              .valeur(new BigDecimal("100.0"))
              .build());

      dto.setTypeMetrique(TypeMetrique.NOMBRE_MEMBRES_ACTIFS);
      dto.setPeriodeAnalyse(PeriodeAnalyse.CE_MOIS);
      dto.setOrganisationId(orgId);
      dto.setNomOrganisation("Org Test");
      dto.setDateDebut(debut);
      dto.setDateFin(fin);
      dto.setPointsDonnees(points);
      dto.setValeurActuelle(new BigDecimal("150.0"));
      dto.setValeurMinimale(new BigDecimal("50.0"));
      dto.setValeurMaximale(new BigDecimal("200.0"));
      dto.setValeurMoyenne(new BigDecimal("125.0"));
      dto.setEcartType(new BigDecimal("25.0"));
      dto.setCoefficientVariation(new BigDecimal("0.2"));
      dto.setTendanceGenerale(new BigDecimal("5.5"));
      dto.setCoefficientCorrelation(new BigDecimal("0.85"));
      dto.setPourcentageEvolutionGlobale(new BigDecimal("50.0"));
      dto.setPredictionProchainePeriode(new BigDecimal("160.0"));
      dto.setMargeErreurPrediction(new BigDecimal("5.0"));
      dto.setSeuilAlerteBas(new BigDecimal("80.0"));
      dto.setSeuilAlerteHaut(new BigDecimal("180.0"));
      dto.setAlerteActive(true);
      dto.setTypeAlerte("haut");
      dto.setMessageAlerte("Alerte haute");
      dto.setConfigurationGraphique("config");
      dto.setIntervalleRegroupement("jour");
      dto.setFormatDate("yyyy-MM-dd");
      dto.setDateDerniereMiseAJour(LocalDateTime.now());
      dto.setFrequenceMiseAJourMinutes(60);

      assertThat(dto.getTypeMetrique()).isEqualTo(TypeMetrique.NOMBRE_MEMBRES_ACTIFS);
      assertThat(dto.getPeriodeAnalyse()).isEqualTo(PeriodeAnalyse.CE_MOIS);
      assertThat(dto.getOrganisationId()).isEqualTo(orgId);
      assertThat(dto.getNomOrganisation()).isEqualTo("Org Test");
      assertThat(dto.getDateDebut()).isEqualTo(debut);
      assertThat(dto.getDateFin()).isEqualTo(fin);
      assertThat(dto.getPointsDonnees()).isEqualTo(points);
      assertThat(dto.getValeurActuelle()).isEqualTo(new BigDecimal("150.0"));
      assertThat(dto.getValeurMinimale()).isEqualTo(new BigDecimal("50.0"));
      assertThat(dto.getValeurMaximale()).isEqualTo(new BigDecimal("200.0"));
      assertThat(dto.getValeurMoyenne()).isEqualTo(new BigDecimal("125.0"));
      assertThat(dto.getEcartType()).isEqualTo(new BigDecimal("25.0"));
      assertThat(dto.getCoefficientVariation()).isEqualTo(new BigDecimal("0.2"));
      assertThat(dto.getTendanceGenerale()).isEqualTo(new BigDecimal("5.5"));
      assertThat(dto.getCoefficientCorrelation()).isEqualTo(new BigDecimal("0.85"));
      assertThat(dto.getPourcentageEvolutionGlobale()).isEqualTo(new BigDecimal("50.0"));
      assertThat(dto.getPredictionProchainePeriode()).isEqualTo(new BigDecimal("160.0"));
      assertThat(dto.getMargeErreurPrediction()).isEqualTo(new BigDecimal("5.0"));
      assertThat(dto.getSeuilAlerteBas()).isEqualTo(new BigDecimal("80.0"));
      assertThat(dto.getSeuilAlerteHaut()).isEqualTo(new BigDecimal("180.0"));
      assertThat(dto.getAlerteActive()).isTrue();
      assertThat(dto.getTypeAlerte()).isEqualTo("haut");
      assertThat(dto.getMessageAlerte()).isEqualTo("Alerte haute");
      assertThat(dto.getConfigurationGraphique()).isEqualTo("config");
      assertThat(dto.getIntervalleRegroupement()).isEqualTo("jour");
      assertThat(dto.getFormatDate()).isEqualTo("yyyy-MM-dd");
      assertThat(dto.getDateDerniereMiseAJour()).isNotNull();
      assertThat(dto.getFrequenceMiseAJourMinutes()).isEqualTo(60);
    }
  }

  @Nested
  @DisplayName("Tests Builder complet - tous les champs")
  class BuilderCompletTests {

    @Test
    @DisplayName("Builder - tous les champs")
    void testBuilderTousChamps() {
      UUID orgId = UUID.randomUUID();
      LocalDateTime debut = LocalDateTime.of(2025, 1, 1, 0, 0);
      LocalDateTime fin = LocalDateTime.of(2025, 1, 31, 23, 59);
      List<PointDonneeDTO> points = Arrays.asList(
          PointDonneeDTO.builder()
              .date(debut)
              .valeur(new BigDecimal("100.0"))
              .build());

      KPITrendDTO dto = KPITrendDTO.builder()
          .typeMetrique(TypeMetrique.NOMBRE_MEMBRES_ACTIFS)
          .periodeAnalyse(PeriodeAnalyse.CE_MOIS)
          .organisationId(orgId)
          .nomOrganisation("Org Test")
          .dateDebut(debut)
          .dateFin(fin)
          .pointsDonnees(points)
          .valeurActuelle(new BigDecimal("150.0"))
          .valeurMinimale(new BigDecimal("50.0"))
          .valeurMaximale(new BigDecimal("200.0"))
          .valeurMoyenne(new BigDecimal("125.0"))
          .ecartType(new BigDecimal("25.0"))
          .coefficientVariation(new BigDecimal("0.2"))
          .tendanceGenerale(new BigDecimal("5.5"))
          .coefficientCorrelation(new BigDecimal("0.85"))
          .pourcentageEvolutionGlobale(new BigDecimal("50.0"))
          .predictionProchainePeriode(new BigDecimal("160.0"))
          .margeErreurPrediction(new BigDecimal("5.0"))
          .seuilAlerteBas(new BigDecimal("80.0"))
          .seuilAlerteHaut(new BigDecimal("180.0"))
          .alerteActive(true)
          .typeAlerte("haut")
          .messageAlerte("Alerte haute")
          .configurationGraphique("config")
          .intervalleRegroupement("jour")
          .formatDate("yyyy-MM-dd")
          .dateDerniereMiseAJour(LocalDateTime.now())
          .frequenceMiseAJourMinutes(60)
          .build();

      assertThat(dto.getTypeMetrique()).isEqualTo(TypeMetrique.NOMBRE_MEMBRES_ACTIFS);
      assertThat(dto.getPeriodeAnalyse()).isEqualTo(PeriodeAnalyse.CE_MOIS);
      assertThat(dto.getOrganisationId()).isEqualTo(orgId);
      assertThat(dto.getNomOrganisation()).isEqualTo("Org Test");
      assertThat(dto.getDateDebut()).isEqualTo(debut);
      assertThat(dto.getDateFin()).isEqualTo(fin);
      assertThat(dto.getPointsDonnees()).isEqualTo(points);
      assertThat(dto.getValeurActuelle()).isEqualTo(new BigDecimal("150.0"));
      assertThat(dto.getValeurMinimale()).isEqualTo(new BigDecimal("50.0"));
      assertThat(dto.getValeurMaximale()).isEqualTo(new BigDecimal("200.0"));
      assertThat(dto.getValeurMoyenne()).isEqualTo(new BigDecimal("125.0"));
      assertThat(dto.getEcartType()).isEqualTo(new BigDecimal("25.0"));
      assertThat(dto.getCoefficientVariation()).isEqualTo(new BigDecimal("0.2"));
      assertThat(dto.getTendanceGenerale()).isEqualTo(new BigDecimal("5.5"));
      assertThat(dto.getCoefficientCorrelation()).isEqualTo(new BigDecimal("0.85"));
      assertThat(dto.getPourcentageEvolutionGlobale()).isEqualTo(new BigDecimal("50.0"));
      assertThat(dto.getPredictionProchainePeriode()).isEqualTo(new BigDecimal("160.0"));
      assertThat(dto.getMargeErreurPrediction()).isEqualTo(new BigDecimal("5.0"));
      assertThat(dto.getSeuilAlerteBas()).isEqualTo(new BigDecimal("80.0"));
      assertThat(dto.getSeuilAlerteHaut()).isEqualTo(new BigDecimal("180.0"));
      assertThat(dto.getAlerteActive()).isTrue();
      assertThat(dto.getTypeAlerte()).isEqualTo("haut");
      assertThat(dto.getMessageAlerte()).isEqualTo("Alerte haute");
      assertThat(dto.getConfigurationGraphique()).isEqualTo("config");
      assertThat(dto.getIntervalleRegroupement()).isEqualTo("jour");
      assertThat(dto.getFormatDate()).isEqualTo("yyyy-MM-dd");
      assertThat(dto.getDateDerniereMiseAJour()).isNotNull();
      assertThat(dto.getFrequenceMiseAJourMinutes()).isEqualTo(60);
    }

    @Test
    @DisplayName("Builder - valeurs par défaut")
    void testBuilderValeursParDefaut() {
      LocalDateTime debut = LocalDateTime.of(2025, 1, 1, 0, 0);
      LocalDateTime fin = LocalDateTime.of(2025, 1, 31, 23, 59);
      List<PointDonneeDTO> points = Arrays.asList(
          PointDonneeDTO.builder()
              .date(debut)
              .valeur(new BigDecimal("100.0"))
              .build());

      KPITrendDTO dto = KPITrendDTO.builder()
          .typeMetrique(TypeMetrique.NOMBRE_MEMBRES_ACTIFS)
          .periodeAnalyse(PeriodeAnalyse.CE_MOIS)
          .dateDebut(debut)
          .dateFin(fin)
          .pointsDonnees(points)
          .valeurActuelle(new BigDecimal("150.0"))
          .build();

      assertThat(dto.getAlerteActive()).isFalse();
    }

    @Test
    @DisplayName("PointDonneeDTO.Builder - tous les champs")
    void testPointDonneeDTOBuilderTousChamps() {
      LocalDateTime date = LocalDateTime.of(2025, 1, 15, 10, 0);
      PointDonneeDTO point = PointDonneeDTO.builder()
          .date(date)
          .valeur(new BigDecimal("150.0"))
          .libelle("Point 1")
          .anomalie(true)
          .prediction(false)
          .metadonnees("meta")
          .build();

      assertThat(point.getDate()).isEqualTo(date);
      assertThat(point.getValeur()).isEqualTo(new BigDecimal("150.0"));
      assertThat(point.getLibelle()).isEqualTo("Point 1");
      assertThat(point.getAnomalie()).isTrue();
      assertThat(point.getPrediction()).isFalse();
      assertThat(point.getMetadonnees()).isEqualTo("meta");
    }

    @Test
    @DisplayName("PointDonneeDTO.Builder - valeurs par défaut")
    void testPointDonneeDTOBuilderValeursParDefaut() {
      LocalDateTime date = LocalDateTime.of(2025, 1, 15, 10, 0);
      PointDonneeDTO point = PointDonneeDTO.builder()
          .date(date)
          .valeur(new BigDecimal("100.0"))
          .build();

      assertThat(point.getAnomalie()).isFalse();
      assertThat(point.getPrediction()).isFalse();
    }


  }
}

