package dev.lions.unionflow.client.view;

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

import java.time.LocalDateTime;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

class LiveFeedBeanTest {

  private LiveFeedBean bean;

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

  // ── couleurAction (mêmes règles que AuditTrailViewerBean) ────────────

  @Test
  @DisplayName("couleurAction — DELETE/PAYMENT_FAILED → danger")
  void couleurDanger() {
    assertEquals("danger", bean.getCouleurAction("DELETE"));
    assertEquals("danger", bean.getCouleurAction("PAYMENT_FAILED"));
  }

  @Test
  @DisplayName("couleurAction — VALIDATE/PAYMENT_CONFIRMED/AID_REQUEST_APPROVED → success")
  void couleurSuccess() {
    assertEquals("success", bean.getCouleurAction("VALIDATE"));
    assertEquals("success", bean.getCouleurAction("PAYMENT_CONFIRMED"));
    assertEquals("success", bean.getCouleurAction("AID_REQUEST_APPROVED"));
  }

  @Test
  @DisplayName("couleurAction — UPDATE/PAYMENT_INITIATED/BUDGET_APPROVED → info")
  void couleurInfo() {
    assertEquals("info", bean.getCouleurAction("UPDATE"));
    assertEquals("info", bean.getCouleurAction("PAYMENT_INITIATED"));
    assertEquals("info", bean.getCouleurAction("BUDGET_APPROVED"));
  }

  @Test
  @DisplayName("couleurAction — CREATE → primary, EXPORT → warning, autres → secondary")
  void couleurAutres() {
    assertEquals("primary", bean.getCouleurAction("CREATE"));
    assertEquals("warning", bean.getCouleurAction("EXPORT"));
    assertEquals("secondary", bean.getCouleurAction(null));
    assertEquals("secondary", bean.getCouleurAction("INCONNU"));
  }

  @Test
  @DisplayName("couleurSod — true→success, false→danger, null→secondary")
  void couleurSod() {
    assertEquals("success", bean.getCouleurSod(true));
    assertEquals("danger", bean.getCouleurSod(false));
    assertEquals("secondary", bean.getCouleurSod(null));
  }

  // ── tempsRelatif ─────────────────────────────────────────────────────

  @Test
  @DisplayName("tempsRelatif — null → '—'")
  void tempsRelatifNull() {
    assertEquals("—", bean.tempsRelatif(null));
  }

  @Test
  @DisplayName("tempsRelatif — 30s ago → 'il y a 30s'")
  void tempsRelatifSecondes() {
    LocalDateTime past = LocalDateTime.now().minusSeconds(30);
    assertTrue(bean.tempsRelatif(past).startsWith("il y a "));
    assertTrue(bean.tempsRelatif(past).endsWith("s"));
  }

  @Test
  @DisplayName("tempsRelatif — 5min ago → 'il y a 5m'")
  void tempsRelatifMinutes() {
    LocalDateTime past = LocalDateTime.now().minusMinutes(5);
    assertEquals("il y a 5m", bean.tempsRelatif(past));
  }

  @Test
  @DisplayName("tempsRelatif — 2h ago → 'il y a 2h'")
  void tempsRelatifHeures() {
    LocalDateTime past = LocalDateTime.now().minusHours(2);
    assertEquals("il y a 2h", bean.tempsRelatif(past));
  }

  @Test
  @DisplayName("tempsRelatif — 3 jours ago → 'il y a 3j'")
  void tempsRelatifJours() {
    LocalDateTime past = LocalDateTime.now().minusDays(3);
    assertEquals("il y a 3j", bean.tempsRelatif(past));
  }

  @Test
  @DisplayName("tempsRelatif — futur → 'à l'instant'")
  void tempsRelatifFutur() {
    LocalDateTime futur = LocalDateTime.now().plusMinutes(1);
    assertEquals("à l'instant", bean.tempsRelatif(futur));
  }

  // ── Limit clamping ───────────────────────────────────────────────────

  @Test
  @DisplayName("setLimit clamp [1, 500]")
  void setLimitClamp() {
    bean.setLimit(0);
    assertEquals(1, bean.getLimit());
    bean.setLimit(1000);
    assertEquals(500, bean.getLimit());
    bean.setLimit(50);
    assertEquals(50, bean.getLimit());
    bean.setLimit(-100);
    assertEquals(1, bean.getLimit());
  }

  // ── Defaults ─────────────────────────────────────────────────────────

  @Test
  @DisplayName("Defaults — scope=SELF, limit=50, compteur=0")
  void defaults() {
    assertEquals("SELF", bean.getScope());
    assertEquals(50, bean.getLimit());
    assertEquals(0, bean.getCompteur());
  }
}
