package dev.lions.unionflow.client.view;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;

import dev.lions.unionflow.server.api.dto.compliance.response.KpiPublicSnapshot;
import java.lang.reflect.Field;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

class PublicKpiBeanTest {

  private PublicKpiBean bean;

  @BeforeEach
  void setUp() {
    bean = new PublicKpiBean();
  }

  private void setSnapshot(KpiPublicSnapshot s) throws Exception {
    Field f = PublicKpiBean.class.getDeclaredField("snapshot");
    f.setAccessible(true);
    f.set(bean, s);
  }

  // ── couleurScore ─────────────────────────────────────────────────────

  @Test
  @DisplayName("couleurScore — score >= 80 → success")
  void couleurSuccess() throws Exception {
    setSnapshot(KpiPublicSnapshot.builder().scoreGlobal(85).build());
    assertEquals("success", bean.getCouleurScore());
  }

  @Test
  @DisplayName("couleurScore — 60..79 → warning")
  void couleurWarning() throws Exception {
    setSnapshot(KpiPublicSnapshot.builder().scoreGlobal(70).build());
    assertEquals("warning", bean.getCouleurScore());
  }

  @Test
  @DisplayName("couleurScore — < 60 → danger")
  void couleurDanger() throws Exception {
    setSnapshot(KpiPublicSnapshot.builder().scoreGlobal(50).build());
    assertEquals("danger", bean.getCouleurScore());
  }

  @Test
  @DisplayName("couleurScore — null snapshot → secondary")
  void couleurNull() {
    assertEquals("secondary", bean.getCouleurScore());
  }

  // ── couleurStatut ────────────────────────────────────────────────────

  @Test
  @DisplayName("couleurStatut — règles")
  void couleurStatut() {
    assertEquals("success", bean.getCouleurStatut("OK"));
    assertEquals("danger", bean.getCouleurStatut("RETARD"));
    assertEquals("warning", bean.getCouleurStatut("EN_ATTENTE"));
    assertEquals("info", bean.getCouleurStatut("OBLIGATOIRE"));
    assertEquals("secondary", bean.getCouleurStatut(null));
    assertEquals("secondary", bean.getCouleurStatut("AUTRE"));
  }

  // ── État charge ──────────────────────────────────────────────────────

  @Test
  @DisplayName("isCharge — false par défaut, true quand snapshot présent")
  void isCharge() throws Exception {
    assertFalse(bean.isCharge());
    setSnapshot(KpiPublicSnapshot.builder().scoreGlobal(75).build());
    assertTrue(bean.isCharge());
  }
}
