/**
 * Trouve-KA — rendu sécurisé des extraits avec surlignage <em>
 * Author: Simon-Pierre Boucher
 * Contact: contact@spboucher.ai
 */

import { Fragment } from "react";
import { cn } from "@/lib/utils";

/** Retire toute balise HTML restante (le contenu distant est non fiable). */
function stripTags(value: string): string {
  return value.replace(/<[^>]*>/g, "");
}

/** Décode les entités HTML courantes (l'ordre garde `&amp;` en dernier). */
function decodeEntities(value: string): string {
  return value
    .replace(/&lt;/g, "<")
    .replace(/&gt;/g, ">")
    .replace(/&quot;/g, '"')
    .replace(/&#0?39;/g, "'")
    .replace(/&nbsp;/g, " ")
    .replace(/&amp;/g, "&");
}

interface SnippetProps {
  html: string;
  className?: string;
}

/**
 * Rend un extrait de recherche sans `dangerouslySetInnerHTML` : seuls les
 * segments `<em>` du backend deviennent des éléments de surlignage; tout le
 * reste est traité comme du texte brut (React échappe automatiquement).
 */
export function Snippet({ html, className }: SnippetProps) {
  const parts = html.split(/<em>([\s\S]*?)<\/em>/g);
  return (
    <p className={cn("break-words", className)}>
      {parts.map((part, index) => {
        const text = decodeEntities(stripTags(part));
        if (!text) return null;
        return index % 2 === 1 ? (
          <em
            key={index}
            className="rounded-[3px] bg-lime-soft px-0.5 not-italic font-semibold text-ink"
          >
            {text}
          </em>
        ) : (
          <Fragment key={index}>{text}</Fragment>
        );
      })}
    </p>
  );
}
